summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Sliwa <dominik.sliwa@toradex.com>2017-11-24 12:43:21 +0100
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2017-11-29 15:03:43 +0100
commita9e9e4234b68eb45fd5f4cf01b16df35afbd505e (patch)
treea14b0b3b9352152b61420b7f77b68d04c89a4359
parent09418f875a5b1d4a1f0a7dfb0d36d0ae90de1b20 (diff)
mfd: apalis-tk1: 0.11 fw support
Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com> Acked-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
-rw-r--r--arch/arm/boot/dts/tegra124-apalis-eval.dts8
-rw-r--r--arch/arm/boot/dts/tegra124-apalis-v1.2-eval.dts8
-rw-r--r--arch/arm/mach-tegra/board-apalis-tk1.c2
-rw-r--r--drivers/mfd/apalis-tk1-k20.c35
-rw-r--r--drivers/net/can/apalis-tk1-k20-can.c4
-rw-r--r--include/linux/mfd/apalis-tk1-k20.h2
6 files changed, 44 insertions, 15 deletions
diff --git a/arch/arm/boot/dts/tegra124-apalis-eval.dts b/arch/arm/boot/dts/tegra124-apalis-eval.dts
index a91852377643..0931a3ba2d7a 100644
--- a/arch/arm/boot/dts/tegra124-apalis-eval.dts
+++ b/arch/arm/boot/dts/tegra124-apalis-eval.dts
@@ -136,7 +136,9 @@
/* SPI2: MCU SPI */
spi@7000d600 {
status = "okay";
- spi-max-frequency = <6000000>;
+ spi-max-frequency = <12000000>;
+ nvidia,polling-mode;
+ nvidia,boost-reg-access;
k20mcu: apalis-tk1-k20@1 {
compatible = "toradex,apalis-tk1-k20";
@@ -160,8 +162,8 @@
controller-data {
nvidia,enable-hw-based-cs;
- nvidia,cs-setup-clk-count = <12>;
- nvidia,cs-hold-clk-count = <12>;
+ nvidia,cs-setup-clk-count = <1>;
+ nvidia,cs-hold-clk-count = <1>;
};
};
diff --git a/arch/arm/boot/dts/tegra124-apalis-v1.2-eval.dts b/arch/arm/boot/dts/tegra124-apalis-v1.2-eval.dts
index 786488a94716..630f19f267d3 100644
--- a/arch/arm/boot/dts/tegra124-apalis-v1.2-eval.dts
+++ b/arch/arm/boot/dts/tegra124-apalis-v1.2-eval.dts
@@ -136,7 +136,9 @@
/* SPI2: MCU SPI */
spi@7000d600 {
status = "okay";
- spi-max-frequency = <6000000>;
+ spi-max-frequency = <12000000>;
+ nvidia,polling-mode;
+ nvidia,boost-reg-access;
k20mcu: apalis-tk1-k20@1 {
compatible = "toradex,apalis-tk1-k20";
@@ -160,8 +162,8 @@
controller-data {
nvidia,enable-hw-based-cs;
- nvidia,cs-setup-clk-count = <12>;
- nvidia,cs-hold-clk-count = <12>;
+ nvidia,cs-setup-clk-count = <1>;
+ nvidia,cs-hold-clk-count = <1>;
};
};
diff --git a/arch/arm/mach-tegra/board-apalis-tk1.c b/arch/arm/mach-tegra/board-apalis-tk1.c
index d88ccb9889b8..0677de795b35 100644
--- a/arch/arm/mach-tegra/board-apalis-tk1.c
+++ b/arch/arm/mach-tegra/board-apalis-tk1.c
@@ -126,7 +126,7 @@ static __initdata struct tegra_clk_init_table apalis_tk1_clk_init_table[] = {
{ "i2c4", "pll_p", 3200000, false},
{ "i2c5", "pll_p", 3200000, false},
{ "sbc1", "pll_p", 25000000, false},
- { "sbc2", "clk_m", 12000000, false},
+ { "sbc2", "clk_m", 24000000, false},
{ "sbc3", "pll_p", 25000000, false},
{ "sbc4", "pll_p", 25000000, false},
{ "sbc5", "pll_p", 25000000, false},
diff --git a/drivers/mfd/apalis-tk1-k20.c b/drivers/mfd/apalis-tk1-k20.c
index a71a4520827d..9befabd5d1df 100644
--- a/drivers/mfd/apalis-tk1-k20.c
+++ b/drivers/mfd/apalis-tk1-k20.c
@@ -27,6 +27,7 @@
#include "apalis-tk1-k20-ezp.h"
#undef CONFIG_EXPERIMENTAL_K20_HSMODE
+#define CONFIG_V12_K20_HSMODE
#define APALIS_TK1_K20_MAX_MSG 4
static const struct spi_device_id apalis_tk1_k20_device_ids[] = {
{
@@ -54,7 +55,7 @@ static const struct regmap_config apalis_tk1_k20_regmap_spi_config = {
.max_register = APALIS_TK1_K20_NUMREGS,
.cache_type = REGCACHE_NONE,
-#ifdef CONFIG_EXPERIMENTAL_K20_HSMODE
+#if defined(CONFIG_EXPERIMENTAL_K20_HSMODE) || defined(CONFIG_V12_K20_HSMODE)
.use_single_rw = 0,
#else
.use_single_rw = 1,
@@ -80,13 +81,12 @@ static int apalis_tk1_k20_spi_read(void *context, const void *reg,
};
#ifdef CONFIG_EXPERIMENTAL_K20_HSMODE
struct spi_transfer ts[APALIS_TK1_K20_MAX_BULK /
- APALIS_TK1_K20_MAX_MSG];
+ APALIS_TK1_K20_MAX_MSG];
int i = 0;
int transfer_count;
#endif
struct spi_message m;
int ret;
-
spi->mode = SPI_MODE_1;
if (reg_size != 1)
@@ -100,6 +100,20 @@ static int apalis_tk1_k20_spi_read(void *context, const void *reg,
t.len = 2;
/* just use the same transfer */
ret = spi_sync(spi, &m);
+
+#ifdef CONFIG_V12_K20_HSMODE
+ } else if ((val_size > 1) && (val_size < APALIS_TK1_K20_MAX_BULK)) {
+ w[0] = APALIS_TK1_K20_BULK_READ_INST;
+ spi_message_init(&m);
+ spi_message_add_tail(&t, &m);
+ ret = spi_sync(spi, &m);
+ /* no need to reinit the message*/
+ t.len = val_size + 1;
+ /* just use the same transfer */
+ ret = spi_sync(spi, &m);
+
+#endif
+
#ifdef CONFIG_EXPERIMENTAL_K20_HSMODE
} else if ((val_size > 1) && (val_size < APALIS_TK1_K20_MAX_BULK)) {
spi_message_init(&m);
@@ -162,7 +176,10 @@ static int apalis_tk1_k20_spi_read(void *context, const void *reg,
spi_message_init(&m);
t.len = val_size + 1;
spi_message_add_tail(&t, &m);
- ret = spi_sync(spi, &m);
+ /* Give k20 some time to recover */
+ udelay(2000);
+ ret = spi_sync(spi, &m);
+
if (r[0] == TK1_K20_SENTINEL) {
memcpy(p, &r[1], val_size);
return ret;
@@ -202,6 +219,14 @@ static int apalis_tk1_k20_spi_write(void *context, const void *data,
out_data[1] = ((uint8_t *)data)[0];
out_data[2] = ((uint8_t *)data)[1];
ret = spi_write(spi, out_data, 3);
+
+#ifdef CONFIG_V12_K20_HSMODE
+ } else if ((count > 2) && (count < APALIS_TK1_K20_MAX_BULK)) {
+ out_data[0] = APALIS_TK1_K20_BULK_WRITE_INST;
+ out_data[1] = count - 1;
+ memcpy(&out_data[2], data, count);
+ ret = spi_write(spi, out_data, count + 2);
+#endif
#ifdef CONFIG_EXPERIMENTAL_K20_HSMODE
} else if ((count > 2) && (count < APALIS_TK1_K20_MAX_BULK)) {
@@ -1017,7 +1042,7 @@ static int apalis_tk1_k20_spi_probe(struct spi_device *spi)
apalis_tk1_k20->irq = spi->irq;
spi->max_speed_hz = (spi->max_speed_hz >= APALIS_TK1_K20_MAX_SPI_SPEED)
- ? APALIS_TK1_K20_MAX_SPI_SPEED : spi->max_speed_hz;
+ ? APALIS_TK1_K20_MAX_SPI_SPEED : spi->max_speed_hz;
ret = spi_setup(spi);
if (ret)
diff --git a/drivers/net/can/apalis-tk1-k20-can.c b/drivers/net/can/apalis-tk1-k20-can.c
index 1df9fae96cc3..22437c48296f 100644
--- a/drivers/net/can/apalis-tk1-k20-can.c
+++ b/drivers/net/can/apalis-tk1-k20-can.c
@@ -148,7 +148,7 @@ static void apalis_tk1_k20_can_hw_rx_frame(struct net_device *net, u8 *buf,
apalis_tk1_k20_lock(priv->apalis_tk1_k20);
apalis_tk1_k20_reg_read_bulk(priv->apalis_tk1_k20,
- APALIS_TK1_K20_CAN_OUT_BUF
+ APALIS_TK1_K20_CAN_IN_BUF
+ APALIS_TK1_K20_CAN_DEV_OFFSET(
priv->pdata->id), buf,
CAN_TRANSFER_BUF_LEN);
@@ -177,7 +177,7 @@ static void apalis_tk1_k20_can_hw_rx(struct net_device *net, int buf_idx)
struct apalis_tk1_k20_priv *priv = netdev_priv(net);
struct sk_buff *skb;
struct can_frame *frame;
- u32 available_frames = 0;
+ u8 available_frames = 0;
u8 buf[CAN_TRANSFER_BUF_LEN];
skb = alloc_can_skb(priv->net, &frame);
diff --git a/include/linux/mfd/apalis-tk1-k20.h b/include/linux/mfd/apalis-tk1-k20.h
index 47b906e181e1..1d0fdacac5b7 100644
--- a/include/linux/mfd/apalis-tk1-k20.h
+++ b/include/linux/mfd/apalis-tk1-k20.h
@@ -106,7 +106,7 @@
#define APALIS_TK1_K20_TSC_IRQ 4
#define APALIS_TK1_K20_GPIO_IRQ 5
-#define APALIS_TK1_K20_FW_VER 0x0A
+#define APALIS_TK1_K20_FW_VER 0x0B
#define FW_MINOR (APALIS_TK1_K20_FW_VER & 0x0F)
#define FW_MAJOR ((APALIS_TK1_K20_FW_VER & 0xF0) >> 4)