Re: [PATCH] imd: imd_calculate_crc32: initialize imd_crc to NULL
Am Fr., 4. Sept. 2020 um 12:10 Uhr schrieb Hubert Feurstein : > This fixes a NULL pointer dereference in the caller when imd-crc-token is > not found. In fact, it is even worse, it is a "uninitialized pointer dereference". Regards Hubert ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH] imd: imd_calculate_crc32: initialize imd_crc to NULL
From: Hubert Feurstein This fixes a NULL pointer dereference in the caller when imd-crc-token is not found. Signed-off-by: Hubert Feurstein --- common/imd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/common/imd.c b/common/imd.c index 96496514a..0644e6d3b 100644 --- a/common/imd.c +++ b/common/imd.c @@ -312,6 +312,7 @@ static int imd_calculate_crc32(void *input, const struct imd_header *imd_start, const struct imd_header *imd; int length; int end_ofs = (char *)imd_start - (char *)input + sizeof(char) * 8; + *imd_crc = NULL; /* search the checksum imd token */ imd_for_each(imd_start, imd) { -- 2.28.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH] commands: miitool: handle powerdown-flag
Signed-off-by: Hubert Feurstein --- commands/miitool.c | 7 ++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/commands/miitool.c b/commands/miitool.c index 4ea6fda34..a87d567ac 100644 --- a/commands/miitool.c +++ b/commands/miitool.c @@ -140,7 +140,10 @@ static int show_basic_mii(struct mii_bus *mii, struct phy_device *phydev, } *buf = '\0'; - if (bmcr & BMCR_ANENABLE) { + + if (bmcr & BMCR_PDOWN) { + sprintf(buf, "powerdown, "); + } else if (bmcr & BMCR_ANENABLE) { if (bmsr & BMSR_ANEGCOMPLETE) { if (advert & lkpar) { sprintf(buf, "%s%s, ", (lkpar & LPA_LPACK) ? @@ -192,6 +195,8 @@ static int show_basic_mii(struct mii_bus *mii, struct phy_device *phydev, printf("loopback, "); if (bmcr & BMCR_ISOLATE) printf("isolate, "); + if (bmcr & BMCR_PDOWN) + printf("powerdown, "); if (bmcr & BMCR_CTST) printf("collision test, "); if (bmcr & BMCR_ANENABLE) { -- 2.24.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
Re: [BUG] imx6qdl: degraded eMMC write performance
Am Di., 10. Dez. 2019 um 17:18 Uhr schrieb Sascha Hauer : [...] > > > We could adjust RW_BUF_SIZE (used by copy_file as buffer size) to a full > > > chunk size (16KiB). Does this give you back some lost performance? > > No, changing RW_BUF_SIZE did not help. > > And I also see why :-/ > > block_op_write() works around block sizes (512bytes), not around chunk > sizes. This means we always read before we write. This could probably be > optimized somehow, but this would only speed up the write case you > described in your initial mail. It seems what you are more interested in > is the read performance. Well, I'm interested in both. Of course the read-performance is important for booting. But the write-performance is important for production. It simply matters if you have to wait for another 200 seconds for a device to get programmed. Regards Hubert ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH] commands: digest: don't be to restrictive with the length of verification files
Otherwise it is not possible to verify against a file created by shaXsum from linux. Usually there is the filename appended after the hash. Signed-off-by: Hubert Feurstein --- commands/digest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/digest.c b/commands/digest.c index 99b27dcc2..21a091717 100644 --- a/commands/digest.c +++ b/commands/digest.c @@ -164,7 +164,7 @@ static int do_digest(int argc, char *argv[]) if (sig) { digestlen = digest_length(d); - if (siglen == 2 * digestlen) { + if (siglen >= 2 * digestlen) { if (!tmp_sig) tmp_sig = xmalloc(digestlen); -- 2.24.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 1/4] led: unify led trigger tables
Currently we have two slightly different led-trigger tables. One in the core module, and the other one in the led-triggers module. The one in the core module, which is used to parse the device-tree triggers, is lacking net-rx and net-tx. Signed-off-by: Hubert Feurstein --- drivers/led/core.c | 46 +++--- drivers/led/led-triggers.c | 25 - 2 files changed, 28 insertions(+), 43 deletions(-) diff --git a/drivers/led/core.c b/drivers/led/core.c index 431966d06..fec7324e7 100644 --- a/drivers/led/core.c +++ b/drivers/led/core.c @@ -256,22 +256,35 @@ void led_unregister(struct led *led) list_del(>list); } -struct led_trg { - const char *str; - enum led_trigger trg; +static char *trigger_names[] = { + [LED_TRIGGER_PANIC] = "panic", + [LED_TRIGGER_HEARTBEAT] = "heartbeat", + [LED_TRIGGER_NET_RX] = "net-rx", + [LED_TRIGGER_NET_TX] = "net-tx", + [LED_TRIGGER_NET_TXRX] = "net", + [LED_TRIGGER_DEFAULT_ON] = "default-on", }; -static struct led_trg triggers[] = { - { .str = "heartbeat", LED_TRIGGER_HEARTBEAT, }, - { .str = "panic", LED_TRIGGER_PANIC, }, - { .str = "net", LED_TRIGGER_NET_TXRX, }, - { .str = "default-on", LED_TRIGGER_DEFAULT_ON, }, -}; +const char *trigger_name(enum led_trigger trigger) +{ + return trigger_names[trigger]; +} + +enum led_trigger trigger_by_name(const char *name) +{ + int i; + + for (i = 0; i < LED_TRIGGER_MAX; i++) + if (!strcmp(name, trigger_names[i])) + return i; + + return LED_TRIGGER_MAX; +} void led_of_parse_trigger(struct led *led, struct device_node *np) { + enum led_trigger trg; const char *trigger; - int i; trigger = of_get_property(np, "linux,default-trigger", NULL); if (!trigger) @@ -280,13 +293,10 @@ void led_of_parse_trigger(struct led *led, struct device_node *np) if (!trigger) return; - for (i = 0; i < ARRAY_SIZE(triggers); i++) { - struct led_trg *trg = [i]; - if (!strcmp(trg->str, trigger)) { - /* disable LED before installing trigger */ - led_set(led, 0); - led_set_trigger(trg->trg, led); - return; - } + trg = trigger_by_name(trigger); + if (trg != LED_TRIGGER_MAX) { + /* disable LED before installing trigger */ + led_set(led, 0); + led_set_trigger(trg, led); } } diff --git a/drivers/led/led-triggers.c b/drivers/led/led-triggers.c index 76a1481e1..216c8639b 100644 --- a/drivers/led/led-triggers.c +++ b/drivers/led/led-triggers.c @@ -143,31 +143,6 @@ int led_set_trigger(enum led_trigger trigger, struct led *led) return 0; } -static char *trigger_names[] = { - [LED_TRIGGER_PANIC] = "panic", - [LED_TRIGGER_HEARTBEAT] = "heartbeat", - [LED_TRIGGER_NET_RX] = "net-rx", - [LED_TRIGGER_NET_TX] = "net-tx", - [LED_TRIGGER_NET_TXRX] = "net", - [LED_TRIGGER_DEFAULT_ON] = "default-on", -}; - -const char *trigger_name(enum led_trigger trigger) -{ - return trigger_names[trigger]; -} - -enum led_trigger trigger_by_name(const char *name) -{ - int i; - - for (i = 0; i < LED_TRIGGER_MAX; i++) - if (!strcmp(name, trigger_names[i])) - return i; - - return LED_TRIGGER_MAX; -} - /** * led_triggers_show_info - Show information about all registered * triggers -- 2.24.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 4/4] led: parse panic-indicator from device-tree
Signed-off-by: Hubert Feurstein --- Documentation/devicetree/bindings/leds/common.rst | 3 +++ drivers/led/core.c| 11 --- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/leds/common.rst b/Documentation/devicetree/bindings/leds/common.rst index 5a592d67d..911a55f4f 100644 --- a/Documentation/devicetree/bindings/leds/common.rst +++ b/Documentation/devicetree/bindings/leds/common.rst @@ -12,3 +12,6 @@ Common leds properties * ``label``: The label for this LED. If omitted, the label is taken from the node name (excluding the unit address). + +* ``panic-indicator`` - This property specifies that the LED should be used as a + panic indicator. diff --git a/drivers/led/core.c b/drivers/led/core.c index 4bf19abcc..e727148a2 100644 --- a/drivers/led/core.c +++ b/drivers/led/core.c @@ -286,11 +286,16 @@ enum led_trigger trigger_by_name(const char *name) void led_of_parse_trigger(struct led *led, struct device_node *np) { - enum led_trigger trg; + enum led_trigger trg = LED_TRIGGER_MAX; const char *trigger; - trigger = of_get_property(np, "linux,default-trigger", NULL); - trg = trigger_by_name(trigger); + if (of_property_read_bool(np, "panic-indicator")) + trg = LED_TRIGGER_PANIC; + + if (trg == LED_TRIGGER_MAX) { + trigger = of_get_property(np, "linux,default-trigger", NULL); + trg = trigger_by_name(trigger); + } if (trg == LED_TRIGGER_MAX) { trigger = of_get_property(np, "barebox,default-trigger", NULL); -- 2.24.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 2/4] led: add documentation for net-tx and net-rx triggers
Signed-off-by: Hubert Feurstein --- Documentation/devicetree/bindings/leds/common.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/leds/common.rst b/Documentation/devicetree/bindings/leds/common.rst index 1f5ae42ca..5a592d67d 100644 --- a/Documentation/devicetree/bindings/leds/common.rst +++ b/Documentation/devicetree/bindings/leds/common.rst @@ -6,7 +6,9 @@ Common leds properties * ``heartbeat`` - LED flashes at a constant rate * ``panic`` - LED turns on when barebox panics -* ``net`` - LED indicates network activity +* ``net`` - LED indicates network activity (tx and rx) +* ``net-rx`` - LED indicates network activity (rx only) +* ``net-tx`` - LED indicates network activity (tx only) * ``label``: The label for this LED. If omitted, the label is taken from the node name (excluding the unit address). -- 2.24.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 3/4] led: check for 'barebox, default-trigger' when 'linux, default-trigger' is not found
When the linux,default-trigger is not found by barebox, then also check if there might be a barebox,default-trigger. Signed-off-by: Hubert Feurstein --- drivers/led/core.c | 13 - 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/led/core.c b/drivers/led/core.c index fec7324e7..4bf19abcc 100644 --- a/drivers/led/core.c +++ b/drivers/led/core.c @@ -274,6 +274,9 @@ enum led_trigger trigger_by_name(const char *name) { int i; + if (!name) + return LED_TRIGGER_MAX; + for (i = 0; i < LED_TRIGGER_MAX; i++) if (!strcmp(name, trigger_names[i])) return i; @@ -287,13 +290,13 @@ void led_of_parse_trigger(struct led *led, struct device_node *np) const char *trigger; trigger = of_get_property(np, "linux,default-trigger", NULL); - if (!trigger) - trigger = of_get_property(np, "barebox,default-trigger", NULL); + trg = trigger_by_name(trigger); - if (!trigger) - return; + if (trg == LED_TRIGGER_MAX) { + trigger = of_get_property(np, "barebox,default-trigger", NULL); + trg = trigger_by_name(trigger); + } - trg = trigger_by_name(trigger); if (trg != LED_TRIGGER_MAX) { /* disable LED before installing trigger */ led_set(led, 0); -- 2.24.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
Re: [BUG] imx6qdl: degraded eMMC write performance
Hi Sascha, Am Di., 10. Dez. 2019 um 16:10 Uhr schrieb Sascha Hauer : [...] > Well the commit message says it: > | commit b6fef20c1215c6ef0004f6af4a9c4b77af51dc43 > | Author: Sascha Hauer > | Date: Thu Mar 29 13:49:45 2018 +0200 > | > | block: Adjust cache sizes > | > | Use four times more cache entries and divide the memory for each entry > | by four. This lowers the linear read throughput somewhat but increases > | the access speed for filesystems. Yes, I know. I've read the commit message. But this patch even costs me ~200ms in boottime (loading kernel and dts from ext4 root partition). [...] > We could adjust RW_BUF_SIZE (used by copy_file as buffer size) to a full > chunk size (16KiB). Does this give you back some lost performance? No, changing RW_BUF_SIZE did not help. Regards Hubert ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 1/1] mci: imx-esdhc: fix termination of statement
Use semicolon instead of comma to terminate statement. Signed-off-by: Hubert Feurstein --- drivers/mci/imx-esdhc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c index db3450a26..4f9fe2996 100644 --- a/drivers/mci/imx-esdhc.c +++ b/drivers/mci/imx-esdhc.c @@ -697,7 +697,7 @@ static int fsl_esdhc_probe(struct device_d *dev) host->mci.card_present = esdhc_card_present; host->mci.hw_dev = dev; - dev->detect = fsl_esdhc_detect, + dev->detect = fsl_esdhc_detect; rate = clk_get_rate(host->clk); host->mci.f_min = rate >> 12; -- 2.24.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[BUG] imx6qdl: degraded eMMC write performance
Hi, I've updated barebox for our custom platform from v2015.06.0 to v2019.12.0. With the new version I have noticed a much worse write performance onto the onboard eMMC. With v2015.06.0 the indicated progress of the copy command is very smooth. Calling "cp -v /dev/zero /dev/mmc3.root" takes about 80 seconds for 256MB. But with v2019.12.0 the progress is very bumpy and the copy takes about 280 seconds. I've tracked this down to this commit which destroys the performance: "block: Adjust cache sizes" (b6fef20c1215c6ef0004f6af4a9c4b77af51dc43) Regards Hubert ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
bootm: booting of uncompressed uimages broken
Hi, booting of uncompressed uimages is broken since patch "ARM: bootm: fix default uImage placement" (0839e3f402ffc74202a1ca4fbeaffcadb4336ce1): This is the change causing the issue: @@ -138,13 +144,10 @@ static int do_bootm_linux(struct image_data *data) return ret; /* - * Put devicetree/initrd at maximum to 128MiB into RAM to not - * risk to put it outside of lowmem. + * put oftree/initrd close behind compressed kernel image to avoid + * placing it outside of the kernels lowmem. */ - if (mem_size > SZ_256M) - mem_free = mem_start + SZ_128M; - else - mem_free = PAGE_ALIGN(data->os_res->end + SZ_1M); + mem_free = PAGE_ALIGN(data->os_res->end + SZ_1M); return __do_bootm_linux(data, mem_free, 0); } System Info: iMX6S; 512MB RAM; LoadAddress 0x10008000; Barebox v2015.06.0 Best Regards Hubert ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH v2] led: gpio: add support for default-state dt-property
This patch adds support for the default-state device tree property. Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- drivers/led/led-gpio.c | 8 1 file changed, 8 insertions(+) diff --git a/drivers/led/led-gpio.c b/drivers/led/led-gpio.c index a1a6617..ae3f13f 100644 --- a/drivers/led/led-gpio.c +++ b/drivers/led/led-gpio.c @@ -204,6 +204,7 @@ static int led_gpio_of_probe(struct device_d *dev) for_each_child_of_node(dev-device_node, child) { struct gpio_led *gled; + const char *default_state; enum of_gpio_flags flags; int gpio; const char *label; @@ -225,6 +226,13 @@ static int led_gpio_of_probe(struct device_d *dev) led_gpio_register(gled); led_of_parse_trigger(gled-led, child); + + if (!of_property_read_string(child, default-state, default_state)) { + if (!strcmp(default_state, on)) + led_gpio_set(gled-led, 1); + else if (!strcmp(default_state, off)) + led_gpio_set(gled-led, 0); + } } return 0; -- 2.3.0 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCHv2] commands/digest: add verify support
Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- Changes: v2: - updated according to comments from Sascha - add support for verify against hash-file commands/digest.c | 141 ++ 1 file changed, 131 insertions(+), 10 deletions(-) diff --git a/commands/digest.c b/commands/digest.c index c9bb132..a4611d7 100644 --- a/commands/digest.c +++ b/commands/digest.c @@ -25,24 +25,122 @@ #include xfuncs.h #include malloc.h #include digest.h +#include linux/ctype.h +#include getopt.h + +static inline unsigned char parse_hexchar(char c) +{ + if (!isxdigit(c)) + return 0; + + return isdigit(c) ? (c - '0') : ((islower(c) ? toupper(c) : c) - 'A' + 0xA); +} + +static inline unsigned char parse_hexbyte(const char *p) +{ + return (parse_hexchar(*p) 4) | parse_hexchar(*(p + 1)); +} + +static unsigned char *parse_hash(int hash_len, const char *hexstr) +{ + int i; + unsigned char *p; + + p = calloc(hash_len, sizeof(unsigned char)); + if (!p) { + perror(calloc); + return NULL; + } + + for (i = 0; i hash_len; i++) + p[i] = parse_hexbyte(hexstr[i * 2]); + + return p; +} static int do_digest(char *algorithm, int argc, char *argv[]) { struct digest *d; int ret = 0; int i; - unsigned char *hash; + unsigned char *hash = NULL; + int opt; + unsigned char *verify_hash = NULL; + int verify = 0; + int min_argc = 2; + void *buf; + ssize_t bufsz; d = digest_get_by_name(algorithm); BUG_ON(!d); - if (argc 2) - return COMMAND_ERROR_USAGE; + while ((opt = getopt(argc, argv, v:V:)) 0) { + switch (opt) { + case 'v': + if (verify) { + ret = COMMAND_ERROR_USAGE; + goto out; + } + + verify = 1; + min_argc += 2; + + if (d-length != (strlen(optarg) / 2)) { + printf(invalid hash length (%d chars required)\n, + d-length * 2); + ret = COMMAND_ERROR_USAGE; + goto out; + } + + verify_hash = parse_hash(d-length, optarg); + if (!verify_hash) { + ret = -ENOMEM; + goto out; + } + + break; + case 'V': + if (verify) { + ret = COMMAND_ERROR_USAGE; + goto out; + } + + verify = 1; + min_argc += 2; + + buf = read_file(optarg, bufsz); + if (!buf) { + ret = -ENOMEM; + goto out; + } + + if (bufsz d-length) { + free(buf); + ret = COMMAND_ERROR_USAGE; + goto out; + } + + verify_hash = parse_hash(d-length, buf); + free(buf); + break; + default: + ret = COMMAND_ERROR_USAGE; + goto out; + } + } + + if (argc min_argc) { + ret = COMMAND_ERROR_USAGE; + goto out; + } + + argv += min_argc - 2; hash = calloc(d-length, sizeof(unsigned char)); if (!hash) { perror(calloc); - return COMMAND_ERROR_USAGE; + ret = -ENOMEM; + goto out; } argv++; @@ -60,17 +158,32 @@ static int do_digest(char *algorithm, int argc, char *argv[]) if (digest_file_window(d, filename, hash, start, size) 0) { ret = 1; } else { - for (i = 0; i d-length; i++) + for (i = 0; i d-length; i++) { printf(%02x, hash[i]); + if (verify 0 hash[i] != verify_hash[i]) + verify = -1; + } - printf( %s\t0x%08llx ... 0x%08llx\n, + printf( %s\t0x%08llx ... 0x%08llx, filename, start, start + size); + + if (verify 0) { + printf( ** ERROR **); + ret = 1; + } + + printf(\n); + + if (verify
[PATCH 1/2] mci-core: use dev_* for messages
Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- drivers/mci/mci-core.c | 13 - 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c index a269aee..49612de 100644 --- a/drivers/mci/mci-core.c +++ b/drivers/mci/mci-core.c @@ -430,8 +430,10 @@ static int mmc_change_freq(struct mci *mci) } /* No high-speed support */ - if (!mci-ext_csd[EXT_CSD_HS_TIMING]) + if (!mci-ext_csd[EXT_CSD_HS_TIMING]) { + dev_dbg(mci-mci_dev, No high-speed support\n); return 0; + } /* High Speed is set, there are two types: 52MHz and 26MHz */ if (cardtype EXT_CSD_CARD_TYPE_52) @@ -669,7 +671,8 @@ static void mci_detect_version_from_csd(struct mci *mci) mci-version = MMC_VERSION_1_2; break; } - printf(detected card version %s\n, vstr); + + dev_info(mci-mci_dev, detected card version %s\n, vstr); } } @@ -1169,7 +1172,7 @@ static int mci_sd_read(struct block_device *blk, void *buffer, int block, } if (block MAX_BUFFER_NUMBER) { - pr_err(Cannot handle block number %d. Too large!\n, block); + dev_err(mci-mci_dev, Cannot handle block number %d. Too large!\n, block); return -EINVAL; } @@ -1366,7 +1369,7 @@ static int mci_card_probe(struct mci *mci) /* start with a host interface reset */ rc = (host-init)(host, mci-mci_dev); if (rc) { - pr_err(Cannot reset the SD/MMC interface\n); + dev_err(mci-mci_dev, Cannot reset the SD/MMC interface\n); return rc; } @@ -1376,7 +1379,7 @@ static int mci_card_probe(struct mci *mci) /* reset the card */ rc = mci_go_idle(mci); if (rc) { - pr_warning(Cannot reset the SD/MMC card\n); + dev_warn(mci-mci_dev, Cannot reset the SD/MMC card\n); goto on_error; } -- 1.8.1.3 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH] imx_spi: fix bus-num setup
Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- drivers/spi/imx_spi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/spi/imx_spi.c b/drivers/spi/imx_spi.c index 71fac3d..950180f 100644 --- a/drivers/spi/imx_spi.c +++ b/drivers/spi/imx_spi.c @@ -533,6 +533,7 @@ static int imx_spi_probe(struct device_d *dev) master = imx-master; master-dev = dev; + master-bus_num = dev-id; master-setup = imx_spi_setup; master-transfer = imx_spi_transfer; -- 1.8.1.3 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 1/2] net: fec_imx: ensure constant timeout in fec_halt
Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- drivers/net/fec_imx.c | 11 --- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c index 2378a19..6dfb093 100644 --- a/drivers/net/fec_imx.c +++ b/drivers/net/fec_imx.c @@ -425,15 +425,20 @@ static int fec_open(struct eth_device *edev) static void fec_halt(struct eth_device *dev) { struct fec_priv *fec = (struct fec_priv *)dev-priv; - int counter = 0x; + uint64_t tmo; /* issue graceful stop command to the FEC transmitter if necessary */ writel(readl(fec-regs + FEC_X_CNTRL) | FEC_ECNTRL_RESET, fec-regs + FEC_X_CNTRL); /* wait for graceful stop to register */ - while ((counter--) (!(readl(fec-regs + FEC_IEVENT) FEC_IEVENT_GRA))) - ; /* FIXME ensure time */ + tmo = get_time_ns(); + while (!(readl(fec-regs + FEC_IEVENT) FEC_IEVENT_GRA)) { + if (is_timeout(tmo, 1 * SECOND)) { + printf(graceful stop timeout\n); + break; + } + } /* Disable SmartDMA tasks */ fec_tx_task_disable(fec); -- 1.8.1.3 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 2/2] net: imx_fec: fix RMII support for i.MX6
Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- drivers/net/fec_imx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c index 6dfb093..80fb2ce 100644 --- a/drivers/net/fec_imx.c +++ b/drivers/net/fec_imx.c @@ -309,7 +309,7 @@ static int fec_init(struct eth_device *dev) } if (fec-xcv_type == RMII) { - if (fec_is_imx28(fec)) { + if (fec_is_imx28(fec) || fec_is_imx6(fec)) { rcntl |= FEC_R_CNTRL_RMII_MODE | FEC_R_CNTRL_FCE | FEC_R_CNTRL_NO_LGTH_CHECK; } else { -- 1.8.1.3 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 1/2] net: fec_imx: use dev_err and dev_warn instead of printf
Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- drivers/net/fec_imx.c | 14 +++--- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c index 2cf5008..44a3112 100644 --- a/drivers/net/fec_imx.c +++ b/drivers/net/fec_imx.c @@ -86,7 +86,7 @@ static int fec_miibus_read(struct mii_bus *bus, int phyAddr, int regAddr) start = get_time_ns(); while (!(readl(fec-regs + FEC_IEVENT) FEC_IEVENT_MII)) { if (is_timeout(start, MSECOND)) { - printf(Read MDIO failed...\n); + dev_err(fec-edev.dev, Read MDIO failed...\n); return -1; } } @@ -126,7 +126,7 @@ static int fec_miibus_write(struct mii_bus *bus, int phyAddr, start = get_time_ns(); while (!(readl(fec-regs + FEC_IEVENT) FEC_IEVENT_MII)) { if (is_timeout(start, MSECOND)) { - printf(Write MDIO failed...\n); + dev_err(fec-edev.dev, Write MDIO failed...\n); return -1; } } @@ -468,12 +468,12 @@ static int fec_send(struct eth_device *dev, void *eth_data, int data_length) /* Check for valid length of data. */ if ((data_length 1500) || (data_length = 0)) { - printf(Payload (%d) to large!\n, data_length); + dev_err(dev-dev, Payload (%d) to large!\n, data_length); return -1; } if ((uint32_t)eth_data (DB_DATA_ALIGNMENT-1)) - printf(%s: Warning: Transmit data not aligned: %p!\n, __FUNCTION__, eth_data); + dev_warn(dev-dev, Transmit data not aligned: %p!\n, eth_data); /* * Setup the transmit buffer @@ -506,7 +506,7 @@ static int fec_send(struct eth_device *dev, void *eth_data, int data_length) tmo = get_time_ns(); while (readw(fec-tbd_base[fec-tbd_index].status) FEC_TBD_READY) { if (is_timeout(tmo, 1 * SECOND)) { - printf(transmission timeout\n); + dev_err(dev-dev, transmission timeout\n); break; } } @@ -544,7 +544,7 @@ static int fec_recv(struct eth_device *dev) /* BABT, Rx/Tx FIFO errors */ fec_halt(dev); fec_init(dev); - printf(some error: 0x%08x\n, ievent); + dev_err(dev-dev, some error: 0x%08x\n, ievent); return 0; } if (!fec_is_imx28(fec)) { @@ -587,7 +587,7 @@ static int fec_recv(struct eth_device *dev) len = frame_length; } else { if (bd_status FEC_RBD_ERR) { - printf(error frame: 0x%p 0x%08x\n, rbd, bd_status); + dev_warn(dev-dev, error frame: 0x%p 0x%08x\n, rbd, bd_status); } } /* -- 1.8.1.3 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH 2/2] net: fec_imx: ensure constant timeout in fec_halt
Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- drivers/net/fec_imx.c | 11 --- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c index 44a3112..14889d3 100644 --- a/drivers/net/fec_imx.c +++ b/drivers/net/fec_imx.c @@ -425,15 +425,20 @@ static int fec_open(struct eth_device *edev) static void fec_halt(struct eth_device *dev) { struct fec_priv *fec = (struct fec_priv *)dev-priv; - int counter = 0x; + uint64_t tmo; /* issue graceful stop command to the FEC transmitter if necessary */ writel(readl(fec-regs + FEC_X_CNTRL) | FEC_ECNTRL_RESET, fec-regs + FEC_X_CNTRL); /* wait for graceful stop to register */ - while ((counter--) (!(readl(fec-regs + FEC_IEVENT) FEC_IEVENT_GRA))) - ; /* FIXME ensure time */ + tmo = get_time_ns(); + while (!(readl(fec-regs + FEC_IEVENT) FEC_IEVENT_GRA)) { + if (is_timeout(tmo, 1 * SECOND)) { + dev_err(dev-dev, graceful stop timeout\n); + break; + } + } /* Disable SmartDMA tasks */ fec_tx_task_disable(fec); -- 1.8.1.3 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
Re: [PATCH v2] ARM i.MX6: Add support for SabreSD board
Hi Sascha, 2013/2/11 Sascha Hauer s.ha...@pengutronix.de: [...] + +static int sabresd_mem_init(void) +{ + arm_add_mem_device(ram0, 0x1000, SZ_1G); + + return 0; +} +mem_initcall(sabresd_mem_init); This is not necessary anymore. I removed this while applying. Could you verify this still works? No, it does not. Here's the log: barebox 2013.02.0-00270-g4bb21a7 #158 Tue Feb 12 09:34:12 CET 2013 Board: SabreSD mmu: Error: Can't request SDRAM region for ttb Error: Cannot request SDRAM region for stack registered netconsole as cs1 imx-esdhc imx-esdhc3: registered as imx-esdhc3 detected card version 4.0 mci mci0: registered disk0 mci mci0: No partition table found imx-esdhc imx-esdhc1: registered as imx-esdhc1 mci mci1: no card inserted imx-esdhc imx-esdhc2: registered as imx-esdhc2 mci mci2: registered disk1 mci mci2: No partition table found BUG: failure at arch/arm/cpu/mmu.c:122/find_pte()! BUG! [1781bd3d] (unwind_backtrace+0x1/0x64) from [1780fffd] (panic+0x1d/0x2c) [1780fffd] (panic+0x1d/0x2c) from [1781c7f5] (remap_range+0x29/0x88) [1781c7f5] (remap_range+0x29/0x88) from [1781c8a3] (dma_alloc_coherent+0x2f/0x38) [1781c8a3] (dma_alloc_coherent+0x2f/0x38) from [178084c3] (fec_probe+0x8f/0x17c) [178084c3] (fec_probe+0x8f/0x17c) from [17807d81] (platform_probe+0x9/0xa) [17807d81] (platform_probe+0x9/0xa) from [17807ba7] (device_probe+0xb/0x38) [17807ba7] (device_probe+0xb/0x38) from [17807bf3] (match+0x1f/0x30) [17807bf3] (match+0x1f/0x30) from [17807d05] (register_device+0x81/0xb0) [17807d05] (register_device+0x81/0xb0) from [17807e11] (add_generic_device_res+0x2d/0x32) [17807e11] (add_generic_device_res+0x2d/0x32) from [1781acbb] (imx_add_fec_imx6+0x1f/0x28) [1781acbb] (imx_add_fec_imx6+0x1f/0x28) from [178197e9] (sabresd_devices_init+0x81/0x10c) [178197e9] (sabresd_devices_init+0x81/0x10c) from [178068d9] (start_barebox+0x15/0xc0) [178068d9] (start_barebox+0x15/0xc0) from [1781c237] (__start.isra.0+0x4b/0x54) [1781c237] (__start.isra.0+0x4b/0x54) from [1781c24d] (setup_c+0x1/0x48) Hubert ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH v2] ARM i.MX6: Add support for SabreSD board
Cc: Sascha Hauer s.ha...@pengutronix.de Cc: Steffen Trumtrar s.trumt...@pengutronix.de Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- Changes since V1: - rebased on latest master with arm-entry changes - use phy_register_fixup_for_uid to register phy fixup - register SD4 as first mmc device, so it always becomes disk0 - add self and env partition - GbE is working with patch 'net fec_imx: add support for i.MX6 1000Mbps mode' arch/arm/Makefile | 1 + arch/arm/boards/freescale-mx6-sabresd/Makefile | 4 + arch/arm/boards/freescale-mx6-sabresd/board.c | 244 + arch/arm/boards/freescale-mx6-sabresd/config.h | 4 + .../freescale-mx6-sabresd/env/init/config-board| 7 + .../boards/freescale-mx6-sabresd/flash_header.c| 178 +++ arch/arm/boards/freescale-mx6-sabresd/lowlevel.c | 10 + arch/arm/configs/freescale-mx6-sabresd_defconfig | 71 ++ arch/arm/mach-imx/Kconfig | 5 + 9 files changed, 524 insertions(+) create mode 100644 arch/arm/boards/freescale-mx6-sabresd/Makefile create mode 100644 arch/arm/boards/freescale-mx6-sabresd/board.c create mode 100644 arch/arm/boards/freescale-mx6-sabresd/config.h create mode 100644 arch/arm/boards/freescale-mx6-sabresd/env/init/config-board create mode 100644 arch/arm/boards/freescale-mx6-sabresd/flash_header.c create mode 100644 arch/arm/boards/freescale-mx6-sabresd/lowlevel.c create mode 100644 arch/arm/configs/freescale-mx6-sabresd_defconfig diff --git a/arch/arm/Makefile b/arch/arm/Makefile index fcb2969..55290a9 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -157,6 +157,7 @@ board-$(CONFIG_MACH_SABRELITE) := freescale-mx6-sabrelite board-$(CONFIG_MACH_TX53) := karo-tx53 board-$(CONFIG_MACH_GUF_VINCELL) := guf-vincell board-$(CONFIG_MACH_EFIKA_MX_SMARTBOOK):= efika-mx-smartbook +board-$(CONFIG_MACH_SABRESD) := freescale-mx6-sabresd machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y)) diff --git a/arch/arm/boards/freescale-mx6-sabresd/Makefile b/arch/arm/boards/freescale-mx6-sabresd/Makefile new file mode 100644 index 000..21fb7d9 --- /dev/null +++ b/arch/arm/boards/freescale-mx6-sabresd/Makefile @@ -0,0 +1,4 @@ +obj-y += board.o flash_header.o +pbl-y += flash_header.o +obj-y += lowlevel.o +pbl-y += lowlevel.o diff --git a/arch/arm/boards/freescale-mx6-sabresd/board.c b/arch/arm/boards/freescale-mx6-sabresd/board.c new file mode 100644 index 000..1cdb0aa --- /dev/null +++ b/arch/arm/boards/freescale-mx6-sabresd/board.c @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2013 Hubert Feurstein h.feurst...@gmail.com + * + * based on arch/arm/boards/freescale-mx6-sabrelite/board.c + * Copyright (C) 2012 Steffen Trumtrar, Pengutronix + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include common.h +#include init.h +#include environment.h +#include mach/imx6-regs.h +#include fec.h +#include mach/gpio.h +#include asm/armlinux.h +#include generated/mach-types.h +#include partition.h +#include linux/phy.h +#include asm/io.h +#include asm/mmu.h +#include mach/generic.h +#include sizes.h +#include net.h +#include mach/imx6.h +#include mach/devices-imx6.h +#include mach/iomux-mx6.h +#include mach/gpio.h +#include spi/spi.h +#include mach/spi.h +#include mach/usb.h + +#define PHY_ID_AR8031 0x004dd074 +#define AR_PHY_ID_MASK 0x + +#define SABRESD_SD2_CD IMX_GPIO_NR(2, 2) +#define SABRESD_SD2_WP IMX_GPIO_NR(2, 3) + +#define SABRESD_SD3_CD IMX_GPIO_NR(2, 0) +#define SABRESD_SD3_WP IMX_GPIO_NR(2, 1) + +static iomux_v3_cfg_t sabresd_pads[] = { + /* UART1 */ + MX6Q_PAD_CSI0_DAT11__UART1_RXD, + MX6Q_PAD_CSI0_DAT10__UART1_TXD, + + /* Ethernet */ + MX6Q_PAD_ENET_MDC__ENET_MDC, + MX6Q_PAD_ENET_MDIO__ENET_MDIO, + MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK, + + MX6Q_PAD_RGMII_TXC__ENET_RGMII_TXC, + MX6Q_PAD_RGMII_TD0__ENET_RGMII_TD0, + MX6Q_PAD_RGMII_TD1__ENET_RGMII_TD1, + MX6Q_PAD_RGMII_TD2__ENET_RGMII_TD2, + MX6Q_PAD_RGMII_TD3__ENET_RGMII_TD3, + MX6Q_PAD_RGMII_TX_CTL__ENET_RGMII_TX_CTL, + + MX6Q_PAD_RGMII_RXC__ENET_RGMII_RXC, + MX6Q_PAD_RGMII_RD0__ENET_RGMII_RD0, + MX6Q_PAD_RGMII_RD1__ENET_RGMII_RD1, + MX6Q_PAD_RGMII_RD2__ENET_RGMII_RD2, + MX6Q_PAD_RGMII_RD3__ENET_RGMII_RD3, + MX6Q_PAD_RGMII_RX_CTL__ENET_RGMII_RX_CTL
Re: [PATCH] net fec_imx: add support for i.MX6 1000Mbps mode
Any comments on this? 2013/2/7 Hubert Feurstein h.feurst...@gmail.com: Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- drivers/net/fec_imx.c | 14 ++ drivers/net/fec_imx.h | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c index 2378a19..7320f07 100644 --- a/drivers/net/fec_imx.c +++ b/drivers/net/fec_imx.c @@ -361,12 +361,18 @@ static int fec_init(struct eth_device *dev) static void fec_update_linkspeed(struct eth_device *edev) { struct fec_priv *fec = (struct fec_priv *)edev-priv; + int speed = edev-phydev-speed; + u32 rcntl = readl(fec-regs + FEC_R_CNTRL) ~FEC_R_CNTRL_RMII_10T; + u32 ecntl = readl(fec-regs + FEC_ECNTRL) ~FEC_ECNTRL_SPEED; - if (edev-phydev-speed == SPEED_10) { - u32 rcntl = readl(fec-regs + FEC_R_CNTRL); + if (speed == SPEED_10) rcntl |= FEC_R_CNTRL_RMII_10T; - writel(rcntl, fec-regs + FEC_R_CNTRL); - } + + if (speed == SPEED_1000) + ecntl |= FEC_ECNTRL_SPEED; + + writel(rcntl, fec-regs + FEC_R_CNTRL); + writel(ecntl, fec-regs + FEC_ECNTRL); } /** diff --git a/drivers/net/fec_imx.h b/drivers/net/fec_imx.h index 1eb1eba..29aea85 100644 --- a/drivers/net/fec_imx.h +++ b/drivers/net/fec_imx.h @@ -92,6 +92,7 @@ #define FEC_ECNTRL_RESET0x0001 /** reset the FEC */ #define FEC_ECNTRL_ETHER_EN 0x0002 /** enable the FEC */ +#define FEC_ECNTRL_SPEED0x0020 /** i.MX6: enable 1000Mbps mode */ /** * @brief Descriptor buffer alignment -- 1.8.1 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH] net fec_imx: add support for i.MX6 1000Mbps mode
Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- drivers/net/fec_imx.c | 14 ++ drivers/net/fec_imx.h | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c index 2378a19..7320f07 100644 --- a/drivers/net/fec_imx.c +++ b/drivers/net/fec_imx.c @@ -361,12 +361,18 @@ static int fec_init(struct eth_device *dev) static void fec_update_linkspeed(struct eth_device *edev) { struct fec_priv *fec = (struct fec_priv *)edev-priv; + int speed = edev-phydev-speed; + u32 rcntl = readl(fec-regs + FEC_R_CNTRL) ~FEC_R_CNTRL_RMII_10T; + u32 ecntl = readl(fec-regs + FEC_ECNTRL) ~FEC_ECNTRL_SPEED; - if (edev-phydev-speed == SPEED_10) { - u32 rcntl = readl(fec-regs + FEC_R_CNTRL); + if (speed == SPEED_10) rcntl |= FEC_R_CNTRL_RMII_10T; - writel(rcntl, fec-regs + FEC_R_CNTRL); - } + + if (speed == SPEED_1000) + ecntl |= FEC_ECNTRL_SPEED; + + writel(rcntl, fec-regs + FEC_R_CNTRL); + writel(ecntl, fec-regs + FEC_ECNTRL); } /** diff --git a/drivers/net/fec_imx.h b/drivers/net/fec_imx.h index 1eb1eba..29aea85 100644 --- a/drivers/net/fec_imx.h +++ b/drivers/net/fec_imx.h @@ -92,6 +92,7 @@ #define FEC_ECNTRL_RESET0x0001 /** reset the FEC */ #define FEC_ECNTRL_ETHER_EN 0x0002 /** enable the FEC */ +#define FEC_ECNTRL_SPEED0x0020 /** i.MX6: enable 1000Mbps mode */ /** * @brief Descriptor buffer alignment -- 1.8.1 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[PATCH] ARM i.MX6: Add support for SabreSD board
Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- arch/arm/Makefile | 1 + arch/arm/boards/freescale-mx6-sabresd/Makefile | 2 + arch/arm/boards/freescale-mx6-sabresd/board.c | 236 + arch/arm/boards/freescale-mx6-sabresd/config.h | 4 + .../freescale-mx6-sabresd/env/init/config-board| 7 + .../boards/freescale-mx6-sabresd/flash_header.c| 178 arch/arm/boards/freescale-mx6-sabresd/lowlevel.c | 10 + arch/arm/configs/freescale-mx6-sabresd_defconfig | 71 +++ arch/arm/mach-imx/Kconfig | 5 + 9 files changed, 514 insertions(+) create mode 100644 arch/arm/boards/freescale-mx6-sabresd/Makefile create mode 100644 arch/arm/boards/freescale-mx6-sabresd/board.c create mode 100644 arch/arm/boards/freescale-mx6-sabresd/config.h create mode 100644 arch/arm/boards/freescale-mx6-sabresd/env/init/config-board create mode 100644 arch/arm/boards/freescale-mx6-sabresd/flash_header.c create mode 100644 arch/arm/boards/freescale-mx6-sabresd/lowlevel.c create mode 100644 arch/arm/configs/freescale-mx6-sabresd_defconfig diff --git a/arch/arm/Makefile b/arch/arm/Makefile index fcb2969..55290a9 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -157,6 +157,7 @@ board-$(CONFIG_MACH_SABRELITE) := freescale-mx6-sabrelite board-$(CONFIG_MACH_TX53) := karo-tx53 board-$(CONFIG_MACH_GUF_VINCELL) := guf-vincell board-$(CONFIG_MACH_EFIKA_MX_SMARTBOOK):= efika-mx-smartbook +board-$(CONFIG_MACH_SABRESD) := freescale-mx6-sabresd machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y)) diff --git a/arch/arm/boards/freescale-mx6-sabresd/Makefile b/arch/arm/boards/freescale-mx6-sabresd/Makefile new file mode 100644 index 000..11199d2 --- /dev/null +++ b/arch/arm/boards/freescale-mx6-sabresd/Makefile @@ -0,0 +1,2 @@ +obj-y += board.o flash_header.o +pbl-y += flash_header.o diff --git a/arch/arm/boards/freescale-mx6-sabresd/board.c b/arch/arm/boards/freescale-mx6-sabresd/board.c new file mode 100644 index 000..f660cdf --- /dev/null +++ b/arch/arm/boards/freescale-mx6-sabresd/board.c @@ -0,0 +1,236 @@ +/* + * Copyright (C) 2013 Hubert Feurstein h.feurst...@gmail.com + * + * based on arch/arm/boards/freescale-mx6-sabrelite/board.c + * Copyright (C) 2012 Steffen Trumtrar, Pengutronix + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include common.h +#include init.h +#include environment.h +#include mach/imx6-regs.h +#include fec.h +#include mach/gpio.h +#include asm/armlinux.h +#include generated/mach-types.h +#include partition.h +#include linux/phy.h +#include asm/io.h +#include asm/mmu.h +#include mach/generic.h +#include sizes.h +#include net.h +#include mach/imx6.h +#include mach/devices-imx6.h +#include mach/iomux-mx6.h +#include mach/gpio.h +#include spi/spi.h +#include mach/spi.h +#include mach/usb.h + +#define SABRESD_SD2_CD IMX_GPIO_NR(2, 2) +#define SABRESD_SD2_WP IMX_GPIO_NR(2, 3) + +#define SABRESD_SD3_CD IMX_GPIO_NR(2, 0) +#define SABRESD_SD3_WP IMX_GPIO_NR(2, 1) + +static iomux_v3_cfg_t sabresd_pads[] = { + /* UART1 */ + MX6Q_PAD_CSI0_DAT11__UART1_RXD, + MX6Q_PAD_CSI0_DAT10__UART1_TXD, + + /* Ethernet */ + MX6Q_PAD_ENET_MDC__ENET_MDC, + MX6Q_PAD_ENET_MDIO__ENET_MDIO, + MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK, + + MX6Q_PAD_RGMII_TXC__ENET_RGMII_TXC, + MX6Q_PAD_RGMII_TD0__ENET_RGMII_TD0, + MX6Q_PAD_RGMII_TD1__ENET_RGMII_TD1, + MX6Q_PAD_RGMII_TD2__ENET_RGMII_TD2, + MX6Q_PAD_RGMII_TD3__ENET_RGMII_TD3, + MX6Q_PAD_RGMII_TX_CTL__ENET_RGMII_TX_CTL, + + MX6Q_PAD_RGMII_RXC__ENET_RGMII_RXC, + MX6Q_PAD_RGMII_RD0__ENET_RGMII_RD0, + MX6Q_PAD_RGMII_RD1__ENET_RGMII_RD1, + MX6Q_PAD_RGMII_RD2__ENET_RGMII_RD2, + MX6Q_PAD_RGMII_RD3__ENET_RGMII_RD3, + MX6Q_PAD_RGMII_RX_CTL__ENET_RGMII_RX_CTL, + + MX6Q_PAD_ENET_CRS_DV__GPIO_1_25,/* AR8031 PHY Reset */ + MX6Q_PAD_GPIO_16__ENET_ANATOP_ETHERNET_REF_OUT, + + /* SD2 */ + MX6Q_PAD_SD2_CLK__USDHC2_CLK, + MX6Q_PAD_SD2_CMD__USDHC2_CMD, + MX6Q_PAD_SD2_DAT0__USDHC2_DAT0, + MX6Q_PAD_SD2_DAT1__USDHC2_DAT1, + MX6Q_PAD_SD2_DAT2__USDHC2_DAT2, + MX6Q_PAD_SD2_DAT3__USDHC2_DAT3, + MX6Q_PAD_NANDF_D4__USDHC2_DAT4, + MX6Q_PAD_NANDF_D5__USDHC2_DAT5, + MX6Q_PAD_NANDF_D6__USDHC2_DAT6
[RFC PATCH] ARM i.MX6: Add support for SabreSD board
Signed-off-by: Hubert Feurstein h.feurst...@gmail.com --- Ethernet is not working yet. I took over the initialisation from u-boot. Phy access seems to work, but I don't get any data out. So some help is very appreciated ... Best regards Hubert arch/arm/Makefile | 1 + arch/arm/boards/freescale-mx6-sabresd/Makefile | 4 + arch/arm/boards/freescale-mx6-sabresd/board.c | 271 + arch/arm/boards/freescale-mx6-sabresd/config.h | 4 + .../freescale-mx6-sabresd/env/init/config-board| 7 + .../boards/freescale-mx6-sabresd/flash_header.c| 181 ++ arch/arm/boards/freescale-mx6-sabresd/lowlevel.c | 10 + arch/arm/configs/freescale-mx6-sabresd_defconfig | 71 ++ arch/arm/mach-imx/Kconfig | 5 + 9 files changed, 554 insertions(+) create mode 100644 arch/arm/boards/freescale-mx6-sabresd/Makefile create mode 100644 arch/arm/boards/freescale-mx6-sabresd/board.c create mode 100644 arch/arm/boards/freescale-mx6-sabresd/config.h create mode 100644 arch/arm/boards/freescale-mx6-sabresd/env/init/config-board create mode 100644 arch/arm/boards/freescale-mx6-sabresd/flash_header.c create mode 100644 arch/arm/boards/freescale-mx6-sabresd/lowlevel.c create mode 100644 arch/arm/configs/freescale-mx6-sabresd_defconfig diff --git a/arch/arm/Makefile b/arch/arm/Makefile index fcb2969..55290a9 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -157,6 +157,7 @@ board-$(CONFIG_MACH_SABRELITE) := freescale-mx6-sabrelite board-$(CONFIG_MACH_TX53) := karo-tx53 board-$(CONFIG_MACH_GUF_VINCELL) := guf-vincell board-$(CONFIG_MACH_EFIKA_MX_SMARTBOOK):= efika-mx-smartbook +board-$(CONFIG_MACH_SABRESD) := freescale-mx6-sabresd machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y)) diff --git a/arch/arm/boards/freescale-mx6-sabresd/Makefile b/arch/arm/boards/freescale-mx6-sabresd/Makefile new file mode 100644 index 000..21fb7d9 --- /dev/null +++ b/arch/arm/boards/freescale-mx6-sabresd/Makefile @@ -0,0 +1,4 @@ +obj-y += board.o flash_header.o +pbl-y += flash_header.o +obj-y += lowlevel.o +pbl-y += lowlevel.o diff --git a/arch/arm/boards/freescale-mx6-sabresd/board.c b/arch/arm/boards/freescale-mx6-sabresd/board.c new file mode 100644 index 000..d341cf9 --- /dev/null +++ b/arch/arm/boards/freescale-mx6-sabresd/board.c @@ -0,0 +1,271 @@ +/* + * Copyright (C) 2013 Hubert Feurstein h.feurst...@gmail.com + * + * based on arch/arm/boards/freescale-mx6-sabrelite/board.c + * Copyright (C) 2012 Steffen Trumtrar, Pengutronix + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include common.h +#include init.h +#include environment.h +#include mach/imx6-regs.h +#include fec.h +#include mach/gpio.h +#include asm/armlinux.h +#include generated/mach-types.h +#include partition.h +#include linux/phy.h +#include asm/io.h +#include asm/mmu.h +#include mach/generic.h +#include sizes.h +#include net.h +#include mach/imx6.h +#include mach/devices-imx6.h +#include mach/iomux-mx6.h +#include mach/gpio.h +#include spi/spi.h +#include mach/spi.h +#include mach/usb.h + +#define SABRESD_SD2_CD IMX_GPIO_NR(2, 2) +#define SABRESD_SD2_WP IMX_GPIO_NR(2, 3) + +#define SABRESD_SD3_CD IMX_GPIO_NR(2, 0) +#define SABRESD_SD3_WP IMX_GPIO_NR(2, 1) + +static iomux_v3_cfg_t sabresd_pads[] = { + /* UART1 */ + MX6Q_PAD_CSI0_DAT11__UART1_RXD, + MX6Q_PAD_CSI0_DAT10__UART1_TXD, + + /* SD2 */ + MX6Q_PAD_SD2_CLK__USDHC2_CLK, + MX6Q_PAD_SD2_CMD__USDHC2_CMD, + MX6Q_PAD_SD2_DAT0__USDHC2_DAT0, + MX6Q_PAD_SD2_DAT1__USDHC2_DAT1, + MX6Q_PAD_SD2_DAT2__USDHC2_DAT2, + MX6Q_PAD_SD2_DAT3__USDHC2_DAT3, + MX6Q_PAD_NANDF_D4__USDHC2_DAT4, + MX6Q_PAD_NANDF_D5__USDHC2_DAT5, + MX6Q_PAD_NANDF_D6__USDHC2_DAT6, + MX6Q_PAD_NANDF_D7__USDHC2_DAT7, + MX6Q_PAD_NANDF_D2__GPIO_2_2,/* CD */ + MX6Q_PAD_NANDF_D3__GPIO_2_3,/* WP */ + + /* SD3 */ + MX6Q_PAD_SD3_CMD__USDHC3_CMD, + MX6Q_PAD_SD3_CLK__USDHC3_CLK, + MX6Q_PAD_SD3_DAT0__USDHC3_DAT0, + MX6Q_PAD_SD3_DAT1__USDHC3_DAT1, + MX6Q_PAD_SD3_DAT2__USDHC3_DAT2, + MX6Q_PAD_SD3_DAT3__USDHC3_DAT3, + MX6Q_PAD_SD3_DAT4__USDHC3_DAT4, + MX6Q_PAD_SD3_DAT5__USDHC3_DAT5, + MX6Q_PAD_SD3_DAT6__USDHC3_DAT6, + MX6Q_PAD_SD3_DAT7__USDHC3_DAT7, + MX6Q_PAD_NANDF_D0__GPIO_2_0,/* CD