summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Sliwa <dominik.sliwa@toradex.com>2018-12-17 01:53:00 +0100
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2018-12-17 17:05:22 +0100
commit730847512490116aa0bc849cf8c6393f0d56952c (patch)
tree16a0eaa6099eb8704b276378bfd809d90409d534
parent904cabdbacaaccb9642866b0f2f8327730c3db3d (diff)
apalis-tk1-mainline: mfd: k20: support fw 1.3
Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com> Acked-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
-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.bb1
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 = " \
"