From a9e9e4234b68eb45fd5f4cf01b16df35afbd505e Mon Sep 17 00:00:00 2001 From: Dominik Sliwa Date: Fri, 24 Nov 2017 12:43:21 +0100 Subject: mfd: apalis-tk1: 0.11 fw support Signed-off-by: Dominik Sliwa Acked-by: Marcel Ziswiler --- arch/arm/boot/dts/tegra124-apalis-eval.dts | 8 +++--- arch/arm/boot/dts/tegra124-apalis-v1.2-eval.dts | 8 +++--- arch/arm/mach-tegra/board-apalis-tk1.c | 2 +- drivers/mfd/apalis-tk1-k20.c | 35 +++++++++++++++++++++---- drivers/net/can/apalis-tk1-k20-can.c | 4 +-- include/linux/mfd/apalis-tk1-k20.h | 2 +- 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) -- cgit v1.2.3