diff options
-rw-r--r-- | recipes-kernel/linux/linux-toradex-mainline-4.14/0033-apalis-tk1-mfd-k20-supporte-for-fw-version-1.3.patch (renamed from recipes-kernel/linux/linux-toradex-mainline-4.14/0033-apalis-tk1-mfd-k20-supporte-for-fw-version-1.2.patch) | 342 | ||||
-rw-r--r-- | recipes-kernel/linux/linux-toradex-mainline_4.14.bb | 1 |
2 files changed, 178 insertions, 165 deletions
diff --git a/recipes-kernel/linux/linux-toradex-mainline-4.14/0033-apalis-tk1-mfd-k20-supporte-for-fw-version-1.2.patch b/recipes-kernel/linux/linux-toradex-mainline-4.14/0033-apalis-tk1-mfd-k20-supporte-for-fw-version-1.3.patch index 69c4fee..f98a7bb 100644 --- a/recipes-kernel/linux/linux-toradex-mainline-4.14/0033-apalis-tk1-mfd-k20-supporte-for-fw-version-1.2.patch +++ b/recipes-kernel/linux/linux-toradex-mainline-4.14/0033-apalis-tk1-mfd-k20-supporte-for-fw-version-1.3.patch @@ -1,4 +1,4 @@ -From dd0ee137eb1f5f9906f6edd05c75aa05f0d0bc24 Mon Sep 17 00:00:00 2001 +From 0f4ef2cbf760bc5ec8a78918baaccd75f3bc7f44 Mon Sep 17 00:00:00 2001 From: Dominik Sliwa <dominik.sliwa@toradex.com> Date: Tue, 11 Sep 2018 14:05:49 +0200 Subject: [PATCH 33/33] apalis-tk1: mfd: k20: supporte for fw version 1.2 @@ -20,14 +20,28 @@ Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com> apalis-tk1: mfd: k20: update supported fw version to 1.2 Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com> + +apalis-tk1: mfd: k20: release fw after flashing + +Previously fw was not released when K20 was flashed successfully + +Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com> + +apalis-tk1: mfd: k20: extra cycles for fifo cleanup + +Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com> + +apalis-tk1: mfd: k20: update supported fw version to 1.3 + +Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com> --- - drivers/mfd/apalis-tk1-k20.c | 214 +++++++++++++++++++-------------- - drivers/net/can/apalis-tk1-k20-can.c | 99 ++++++++++----- + drivers/mfd/apalis-tk1-k20.c | 168 ++++++++++++++----------- + drivers/net/can/apalis-tk1-k20-can.c | 99 +++++++++++---- include/linux/mfd/apalis-tk1-k20-api.h | 2 +- - 3 files changed, 195 insertions(+), 120 deletions(-) + 3 files changed, 171 insertions(+), 98 deletions(-) diff --git a/drivers/mfd/apalis-tk1-k20.c b/drivers/mfd/apalis-tk1-k20.c -index 913be65c33e6..38d52b6d2d88 100644 +index 913be65c33e6..a6d1c1cdc0b6 100644 --- a/drivers/mfd/apalis-tk1-k20.c +++ b/drivers/mfd/apalis-tk1-k20.c @@ -2,7 +2,7 @@ @@ -56,6 +70,15 @@ index 913be65c33e6..38d52b6d2d88 100644 static const struct spi_device_id apalis_tk1_k20_device_ids[] = { { .name = "apalis-tk1-k20", +@@ -115,7 +125,7 @@ static int apalis_tk1_k20_spi_read(void *context, const void *reg, + ret = -EIO; + + } else if ((val_size > 1) && (val_size < APALIS_TK1_K20_MAX_BULK)) { +- t.len = 5; ++ t.len = 12; + w[0] = APALIS_TK1_K20_BULK_READ_INST; + spi_message_init(&m); + spi_message_add_tail(&t, &m); @@ -142,7 +152,6 @@ static int apalis_tk1_k20_spi_write(void *context, const void *data, uint8_t out_data[APALIS_TK1_K20_MAX_BULK]; int ret; @@ -86,220 +109,209 @@ index 913be65c33e6..38d52b6d2d88 100644 gpio_request(apalis_tk1_k20->int2_gpio, "apalis-tk1-k20-int2"); gpio_direction_output(apalis_tk1_k20->int2_gpio, 1); -@@ -734,13 +746,101 @@ static inline int apalis_tk1_k20_probe_gpios_dt( +@@ -734,53 +746,28 @@ static inline int apalis_tk1_k20_probe_gpios_dt( } #endif +-int apalis_tk1_k20_dev_init(struct device *dev) +int apalis_tk1_k20_fw_update(struct apalis_tk1_k20_regmap *apalis_tk1_k20, -+ uint32_t revision) { -+ int erase_only = 0; -+ -+ if ((request_firmware(&fw_entry, "apalis-tk1-k20.bin", apalis_tk1_k20->dev) < 0) -+ && (revision != APALIS_TK1_K20_FW_VER)) { -+ dev_err(apalis_tk1_k20->dev, -+ "Unsupported firmware version %d.%d and no local" \ -+ " firmware file available.\n", -+ (revision & 0xF0 >> 8), -+ (revision & 0x0F)); -+ return -ENOTSUPP; -+ } -+ -+ if ((fw_entry == NULL) && (revision != APALIS_TK1_K20_FW_VER)) { -+ dev_err(apalis_tk1_k20->dev, -+ "Unsupported firmware version %d.%d and no local" \ -+ " firmware file available.\n", -+ (revision & 0xF0 >> 8), -+ (revision & 0x0F)); -+ return -ENOTSUPP; -+ } -+ -+ if (fw_entry != NULL) { -+ if (fw_entry->size == 1) -+ erase_only = 1; -+ } -+ -+ if ((apalis_tk1_k20_get_fw_revision() != APALIS_TK1_K20_FW_VER) && -+ (revision != APALIS_TK1_K20_FW_VER) && !erase_only && -+ (fw_entry != NULL)) { -+ dev_err(apalis_tk1_k20->dev, -+ "Unsupported firmware version in both the device " \ -+ "as well as the local firmware file.\n"); -+ release_firmware(fw_entry); -+ return -ENOTSUPP; -+ } -+ -+ if ((revision != APALIS_TK1_K20_FW_VER) && !erase_only && -+ (!apalis_tk1_k20_fw_ezport_status()) && -+ (fw_entry != NULL)) { -+ dev_err(apalis_tk1_k20->dev, -+ "Unsupported firmware version in the device and the " \ -+ "local firmware file disables the EZ Port.\n"); -+ release_firmware(fw_entry); -+ return -ENOTSUPP; -+ } -+ -+ if (((revision != APALIS_TK1_K20_FW_VER) || erase_only -+ || force_fw_reload) && (fw_entry != NULL)) { -+ int i = 0; -+ while (apalis_tk1_k20_enter_ezport(apalis_tk1_k20) < 0 -+ && i++ < 5) { -+ msleep(50); -+ } -+ if (i >= 5) { -+ dev_err(apalis_tk1_k20->dev, -+ "Problem entering EZ port mode.\n"); -+ release_firmware(fw_entry); -+ return -EIO; -+ } -+ if (apalis_tk1_k20_erase_chip_ezport(apalis_tk1_k20) < 0) { -+ dev_err(apalis_tk1_k20->dev, -+ "Problem erasing the chip. Deferring...\n"); -+ release_firmware(fw_entry); -+ return -EPROBE_DEFER; -+ } -+ if (erase_only) { -+ dev_err(apalis_tk1_k20->dev, -+ "Chip fully erased.\n"); -+ release_firmware(fw_entry); -+ return -EIO; -+ } -+ if (apalis_tk1_k20_flash_chip_ezport(apalis_tk1_k20) < 0) { -+ dev_err(apalis_tk1_k20->dev, -+ "Problem flashing new firmware. Deferring...\n"); -+ release_firmware(fw_entry); -+ return -EPROBE_DEFER; -+ } -+ -+ return 1; -+ } -+ if (fw_entry != NULL) -+ release_firmware(fw_entry); -+ -+ return 0; -+ -+} -+ - int apalis_tk1_k20_dev_init(struct device *dev) ++ uint32_t revision) { - struct apalis_tk1_k20_platform_data *pdata = dev_get_platdata(dev); - struct apalis_tk1_k20_regmap *apalis_tk1_k20 = dev_get_drvdata(dev); - uint32_t revision = 0x00; - int ret, i; -- int erase_only = 0; - - apalis_tk1_k20->dev = dev; +- struct apalis_tk1_k20_platform_data *pdata = dev_get_platdata(dev); +- struct apalis_tk1_k20_regmap *apalis_tk1_k20 = dev_get_drvdata(dev); +- uint32_t revision = 0x00; +- int ret, i; + int erase_only = 0; -@@ -762,99 +862,21 @@ int apalis_tk1_k20_dev_init(struct device *dev) - &revision); - - #ifdef CONFIG_APALIS_TK1_K20_EZP +- apalis_tk1_k20->dev = dev; +- +- ret = apalis_tk1_k20_probe_gpios_dt(apalis_tk1_k20); +- if ((ret < 0) && pdata) { +- if (pdata) { +- apalis_tk1_k20->ezpcs_gpio = pdata->ezpcs_gpio; +- apalis_tk1_k20->reset_gpio = pdata->reset_gpio; +- apalis_tk1_k20->int2_gpio = pdata->int2_gpio; +- } else { +- dev_err(dev, "Error claiming GPIOs\n"); +- ret = -EINVAL; +- goto bad; +- } +- } +- apalis_tk1_k20_reset_chip(apalis_tk1_k20); +- msleep(10); +- ret = apalis_tk1_k20_reg_read(apalis_tk1_k20, APALIS_TK1_K20_REVREG, +- &revision); +- +-#ifdef CONFIG_APALIS_TK1_K20_EZP - if ((request_firmware(&fw_entry, "apalis-tk1-k20.bin", dev) < 0) -- && (revision != APALIS_TK1_K20_FW_VER)) { -- dev_err(apalis_tk1_k20->dev, ++ if ((request_firmware(&fw_entry, "apalis-tk1-k20.bin", ++ apalis_tk1_k20->dev) ++ < 0) + && (revision != APALIS_TK1_K20_FW_VER)) { + dev_err(apalis_tk1_k20->dev, - "Unsupported firmware version %d.%d and no local" \ -- " firmware file available.\n", ++ "Unsupported firmware version %d.%d and no local" + " firmware file available.\n", - (revision & 0xF0 >> 8), - (revision & 0x0F)); - ret = -ENOTSUPP; - goto bad; -- } ++ (revision & 0xF0 >> 8), (revision & 0x0F)); ++ return -ENOTSUPP; + } -- if ((fw_entry == NULL) && (revision != APALIS_TK1_K20_FW_VER)) { -- dev_err(apalis_tk1_k20->dev, + if ((fw_entry == NULL) && (revision != APALIS_TK1_K20_FW_VER)) { + dev_err(apalis_tk1_k20->dev, - "Unsupported firmware version %d.%d and no local" \ -- " firmware file available.\n", ++ "Unsupported firmware version %d.%d and no local" + " firmware file available.\n", - (revision & 0xF0 >> 8), - (revision & 0x0F)); - ret = -ENOTSUPP; - goto bad; -- } -- -- if (fw_entry != NULL) { -- if (fw_entry->size == 1) -- erase_only = 1; -- } -- ++ (revision & 0xF0 >> 8), (revision & 0x0F)); ++ return -ENOTSUPP; + } + + if (fw_entry != NULL) { +@@ -788,73 +775,106 @@ int apalis_tk1_k20_dev_init(struct device *dev) + erase_only = 1; + } + - if ((apalis_tk1_k20_get_fw_revision() != APALIS_TK1_K20_FW_VER) && - (revision != APALIS_TK1_K20_FW_VER) && !erase_only && - (fw_entry != NULL)) { -- dev_err(apalis_tk1_k20->dev, ++ if ((apalis_tk1_k20_get_fw_revision() != APALIS_TK1_K20_FW_VER) ++ && (revision != APALIS_TK1_K20_FW_VER) && !erase_only ++ && (fw_entry != NULL)) { + dev_err(apalis_tk1_k20->dev, - "Unsupported firmware version in both the device " \ -- "as well as the local firmware file.\n"); -- release_firmware(fw_entry); ++ "Unsupported firmware version in both the device " + "as well as the local firmware file.\n"); + release_firmware(fw_entry); - ret = -ENOTSUPP; - goto bad; -- } -- ++ return -ENOTSUPP; + } + - if ((revision != APALIS_TK1_K20_FW_VER) && !erase_only && - (!apalis_tk1_k20_fw_ezport_status()) && - (fw_entry != NULL)) { -- dev_err(apalis_tk1_k20->dev, ++ if ((revision != APALIS_TK1_K20_FW_VER) && !erase_only ++ && (!apalis_tk1_k20_fw_ezport_status()) && (fw_entry != NULL)) { + dev_err(apalis_tk1_k20->dev, - "Unsupported firmware version in the device and the " \ -- "local firmware file disables the EZ Port.\n"); -- release_firmware(fw_entry); ++ "Unsupported firmware version in the device and the " + "local firmware file disables the EZ Port.\n"); + release_firmware(fw_entry); - ret = -ENOTSUPP; - goto bad; -- } -+ if (fw_ignore == 0) { -+ ret = apalis_tk1_k20_fw_update(apalis_tk1_k20, revision); ++ return -ENOTSUPP; + } - if (((revision != APALIS_TK1_K20_FW_VER) || erase_only) && - (fw_entry != NULL)) { - i = 0; -- while (apalis_tk1_k20_enter_ezport(apalis_tk1_k20) < 0 ++ if (((revision != APALIS_TK1_K20_FW_VER) || erase_only ++ || force_fw_reload) ++ && (fw_entry != NULL)) { ++ int i = 0; + while (apalis_tk1_k20_enter_ezport(apalis_tk1_k20) < 0 - && i++ < 5) { -- msleep(50); -- } -- if (i >= 5) { -- dev_err(apalis_tk1_k20->dev, -- "Problem entering EZ port mode.\n"); -- release_firmware(fw_entry); ++ && i++ < 5) { + msleep(50); + } + if (i >= 5) { + dev_err(apalis_tk1_k20->dev, + "Problem entering EZ port mode.\n"); + release_firmware(fw_entry); - ret = -EIO; -+ if (ret < 0) - goto bad; -- } -- if (apalis_tk1_k20_erase_chip_ezport(apalis_tk1_k20) < 0) { -- dev_err(apalis_tk1_k20->dev, +- goto bad; ++ return -EIO; + } + if (apalis_tk1_k20_erase_chip_ezport(apalis_tk1_k20) < 0) { + dev_err(apalis_tk1_k20->dev, - "Problem erasing the chip.\n"); -- release_firmware(fw_entry); ++ "Problem erasing the chip. Deferring...\n"); + release_firmware(fw_entry); - ret = -EPROBE_DEFER; - goto bad; -- } -- if (erase_only) { ++ return -EPROBE_DEFER; + } + if (erase_only) { - dev_err(apalis_tk1_k20->dev, - "Chip fully erased.\n"); -- release_firmware(fw_entry); ++ dev_err(apalis_tk1_k20->dev, "Chip fully erased.\n"); + release_firmware(fw_entry); - ret = -EIO; - goto bad; -- } -- if (apalis_tk1_k20_flash_chip_ezport(apalis_tk1_k20) < 0) { -- dev_err(apalis_tk1_k20->dev, ++ return -EIO; + } + if (apalis_tk1_k20_flash_chip_ezport(apalis_tk1_k20) < 0) { + dev_err(apalis_tk1_k20->dev, - "Problem flashing new firmware.\n"); -- release_firmware(fw_entry); ++ "Problem flashing new firmware. Deferring...\n"); + release_firmware(fw_entry); - ret = -EPROBE_DEFER; - goto bad; -- } ++ return -EPROBE_DEFER; + } } -- if (fw_entry != NULL) -- release_firmware(fw_entry); -- -- msleep(10); -- apalis_tk1_k20_reset_chip(apalis_tk1_k20); ++ + if (fw_entry != NULL) + release_firmware(fw_entry); + - msleep(10); ++ return 1; ++} ++ ++int apalis_tk1_k20_dev_init(struct device *dev) ++{ ++ struct apalis_tk1_k20_platform_data *pdata = dev_get_platdata(dev); ++ struct apalis_tk1_k20_regmap *apalis_tk1_k20 = dev_get_drvdata(dev); ++ uint32_t revision = 0x00; ++ int ret, i; ++ ++ apalis_tk1_k20->dev = dev; ++ ++ ret = apalis_tk1_k20_probe_gpios_dt(apalis_tk1_k20); ++ if ((ret < 0) && pdata) { ++ if (pdata) { ++ apalis_tk1_k20->ezpcs_gpio = pdata->ezpcs_gpio; ++ apalis_tk1_k20->reset_gpio = pdata->reset_gpio; ++ apalis_tk1_k20->int2_gpio = pdata->int2_gpio; ++ } else { ++ dev_err(dev, "Error claiming GPIOs\n"); ++ ret = -EINVAL; ++ goto bad; ++ } ++ } + apalis_tk1_k20_reset_chip(apalis_tk1_k20); + msleep(10); +- + ret = apalis_tk1_k20_reg_read(apalis_tk1_k20, APALIS_TK1_K20_REVREG, + &revision); ++ ++#ifdef CONFIG_APALIS_TK1_K20_EZP ++ ++ if (fw_ignore == 0) { ++ ret = apalis_tk1_k20_fw_update(apalis_tk1_k20, revision); ++ ++ if (ret < 0) ++ goto bad; ++ } + if (ret) { + msleep(10); + apalis_tk1_k20_reset_chip(apalis_tk1_k20); + msleep(10); - -- ret = apalis_tk1_k20_reg_read(apalis_tk1_k20, APALIS_TK1_K20_REVREG, -- &revision); ++ + ret = apalis_tk1_k20_reg_read(apalis_tk1_k20, APALIS_TK1_K20_REVREG, + &revision); + } #endif /* CONFIG_APALIS_TK1_K20_EZP */ if (ret) { -@@ -862,7 +884,7 @@ int apalis_tk1_k20_dev_init(struct device *dev) +@@ -862,7 +882,7 @@ int apalis_tk1_k20_dev_init(struct device *dev) goto bad; } @@ -308,7 +320,7 @@ index 913be65c33e6..38d52b6d2d88 100644 dev_err(apalis_tk1_k20->dev, "Unsupported firmware version %d.%d.\n", ((revision & 0xF0) >> 4), (revision & 0x0F)); -@@ -870,6 +892,14 @@ int apalis_tk1_k20_dev_init(struct device *dev) +@@ -870,6 +890,14 @@ int apalis_tk1_k20_dev_init(struct device *dev) goto bad; } @@ -533,7 +545,7 @@ index e24adbb35dfd..0c238b8062ca 100644 goto error_probe; diff --git a/include/linux/mfd/apalis-tk1-k20-api.h b/include/linux/mfd/apalis-tk1-k20-api.h -index 199b433c3d96..112a79b6b4e8 100644 +index 199b433c3d96..75c7821ec43f 100644 --- a/include/linux/mfd/apalis-tk1-k20-api.h +++ b/include/linux/mfd/apalis-tk1-k20-api.h @@ -104,7 +104,7 @@ @@ -541,10 +553,10 @@ index 199b433c3d96..112a79b6b4e8 100644 #define APALIS_TK1_K20_GPIO_IRQ 5 -#define APALIS_TK1_K20_FW_VER 0x11 -+#define APALIS_TK1_K20_FW_VER 0x12 ++#define APALIS_TK1_K20_FW_VER 0x13 #define APALIS_TK1_K20_TESTER_FW_VER 0xFE #define FW_MINOR (APALIS_TK1_K20_FW_VER & 0x0F) -- -2.13.6 +2.19.2 diff --git a/recipes-kernel/linux/linux-toradex-mainline_4.14.bb b/recipes-kernel/linux/linux-toradex-mainline_4.14.bb index 7abc4cf..0cf1cfc 100644 --- a/recipes-kernel/linux/linux-toradex-mainline_4.14.bb +++ b/recipes-kernel/linux/linux-toradex-mainline_4.14.bb @@ -49,6 +49,7 @@ GENERIC_PATCHES = " \ file://0030-apalis-tk1-enable-ddr52-mode-on-emmc.patch \ file://0031-apalis-tk1-force-fixed-ids-for-sdmmc-controllers.patch \ file://0032-apalis-tk1-fix-pcie-reset-for-reliable-gigabit-ether.patch \ + file://0033-apalis-tk1-mfd-k20-supporte-for-fw-version-1.3.patch \ " MACHINE_PATCHES = " \ " |