Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: mediatek: adjust register to enhance time accuracy

this patch adjust register to enhance time accuracy.

Signed-off-by: Leilk Liu <leilk.liu@mediatek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Leilk Liu and committed by
Mark Brown
058fe49d d27ae103

+42 -5
+40 -5
drivers/spi/spi-mt65xx.c
··· 35 35 #define SPI_CMD_REG 0x0018 36 36 #define SPI_STATUS0_REG 0x001c 37 37 #define SPI_PAD_SEL_REG 0x0024 38 + #define SPI_CFG2_REG 0x0028 38 39 39 40 #define SPI_CFG0_SCK_HIGH_OFFSET 0 40 41 #define SPI_CFG0_SCK_LOW_OFFSET 8 41 42 #define SPI_CFG0_CS_HOLD_OFFSET 16 42 43 #define SPI_CFG0_CS_SETUP_OFFSET 24 44 + #define SPI_ADJUST_CFG0_SCK_LOW_OFFSET 16 45 + #define SPI_ADJUST_CFG0_CS_HOLD_OFFSET 0 46 + #define SPI_ADJUST_CFG0_CS_SETUP_OFFSET 16 43 47 44 48 #define SPI_CFG1_CS_IDLE_OFFSET 0 45 49 #define SPI_CFG1_PACKET_LOOP_OFFSET 8 ··· 59 55 #define SPI_CMD_RST BIT(2) 60 56 #define SPI_CMD_PAUSE_EN BIT(4) 61 57 #define SPI_CMD_DEASSERT BIT(5) 58 + #define SPI_CMD_SAMPLE_SEL BIT(6) 59 + #define SPI_CMD_CS_POL BIT(7) 62 60 #define SPI_CMD_CPHA BIT(8) 63 61 #define SPI_CMD_CPOL BIT(9) 64 62 #define SPI_CMD_RX_DMA BIT(10) ··· 86 80 bool need_pad_sel; 87 81 /* Must explicitly send dummy Tx bytes to do Rx only transfer */ 88 82 bool must_tx; 83 + /* some IC design adjust cfg register to enhance time accuracy */ 84 + bool enhance_timing; 89 85 }; 90 86 91 87 struct mtk_spi { ··· 116 108 static const struct mtk_chip_config mtk_default_chip_info = { 117 109 .rx_mlsb = 1, 118 110 .tx_mlsb = 1, 111 + .cs_pol = 0, 112 + .sample_sel = 0, 119 113 }; 120 114 121 115 static const struct of_device_id mtk_spi_of_match[] = { ··· 192 182 reg_val |= SPI_CMD_RX_ENDIAN; 193 183 #endif 194 184 185 + if (mdata->dev_comp->enhance_timing) { 186 + if (chip_config->cs_pol) 187 + reg_val |= SPI_CMD_CS_POL; 188 + else 189 + reg_val &= ~SPI_CMD_CS_POL; 190 + if (chip_config->sample_sel) 191 + reg_val |= SPI_CMD_SAMPLE_SEL; 192 + else 193 + reg_val &= ~SPI_CMD_SAMPLE_SEL; 194 + } 195 + 195 196 /* set finish and pause interrupt always enable */ 196 197 reg_val |= SPI_CMD_FINISH_IE | SPI_CMD_PAUSE_IE; 197 198 ··· 254 233 sck_time = (div + 1) / 2; 255 234 cs_time = sck_time * 2; 256 235 257 - reg_val |= (((sck_time - 1) & 0xff) << SPI_CFG0_SCK_HIGH_OFFSET); 258 - reg_val |= (((sck_time - 1) & 0xff) << SPI_CFG0_SCK_LOW_OFFSET); 259 - reg_val |= (((cs_time - 1) & 0xff) << SPI_CFG0_CS_HOLD_OFFSET); 260 - reg_val |= (((cs_time - 1) & 0xff) << SPI_CFG0_CS_SETUP_OFFSET); 261 - writel(reg_val, mdata->base + SPI_CFG0_REG); 236 + if (mdata->dev_comp->enhance_timing) { 237 + reg_val |= (((sck_time - 1) & 0xffff) 238 + << SPI_CFG0_SCK_HIGH_OFFSET); 239 + reg_val |= (((sck_time - 1) & 0xffff) 240 + << SPI_ADJUST_CFG0_SCK_LOW_OFFSET); 241 + writel(reg_val, mdata->base + SPI_CFG2_REG); 242 + reg_val |= (((cs_time - 1) & 0xffff) 243 + << SPI_ADJUST_CFG0_CS_HOLD_OFFSET); 244 + reg_val |= (((cs_time - 1) & 0xffff) 245 + << SPI_ADJUST_CFG0_CS_SETUP_OFFSET); 246 + writel(reg_val, mdata->base + SPI_CFG0_REG); 247 + } else { 248 + reg_val |= (((sck_time - 1) & 0xff) 249 + << SPI_CFG0_SCK_HIGH_OFFSET); 250 + reg_val |= (((sck_time - 1) & 0xff) << SPI_CFG0_SCK_LOW_OFFSET); 251 + reg_val |= (((cs_time - 1) & 0xff) << SPI_CFG0_CS_HOLD_OFFSET); 252 + reg_val |= (((cs_time - 1) & 0xff) << SPI_CFG0_CS_SETUP_OFFSET); 253 + writel(reg_val, mdata->base + SPI_CFG0_REG); 254 + } 262 255 263 256 reg_val = readl(mdata->base + SPI_CFG1_REG); 264 257 reg_val &= ~SPI_CFG1_CS_IDLE_MASK;
+2
include/linux/platform_data/spi-mt65xx.h
··· 16 16 struct mtk_chip_config { 17 17 u32 tx_mlsb; 18 18 u32 rx_mlsb; 19 + u32 cs_pol; 20 + u32 sample_sel; 19 21 }; 20 22 #endif