1*ce38815dSXudong Chen /* 2*ce38815dSXudong Chen * Copyright (c) 2014 MediaTek Inc. 3*ce38815dSXudong Chen * Author: Xudong Chen <xudong.chen@mediatek.com> 4*ce38815dSXudong Chen * 5*ce38815dSXudong Chen * This program is free software; you can redistribute it and/or modify 6*ce38815dSXudong Chen * it under the terms of the GNU General Public License version 2 as 7*ce38815dSXudong Chen * published by the Free Software Foundation. 8*ce38815dSXudong Chen * 9*ce38815dSXudong Chen * This program is distributed in the hope that it will be useful, 10*ce38815dSXudong Chen * but WITHOUT ANY WARRANTY; without even the implied warranty of 11*ce38815dSXudong Chen * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*ce38815dSXudong Chen * GNU General Public License for more details. 13*ce38815dSXudong Chen */ 14*ce38815dSXudong Chen 15*ce38815dSXudong Chen #include <linux/clk.h> 16*ce38815dSXudong Chen #include <linux/completion.h> 17*ce38815dSXudong Chen #include <linux/delay.h> 18*ce38815dSXudong Chen #include <linux/device.h> 19*ce38815dSXudong Chen #include <linux/dma-mapping.h> 20*ce38815dSXudong Chen #include <linux/err.h> 21*ce38815dSXudong Chen #include <linux/errno.h> 22*ce38815dSXudong Chen #include <linux/i2c.h> 23*ce38815dSXudong Chen #include <linux/init.h> 24*ce38815dSXudong Chen #include <linux/interrupt.h> 25*ce38815dSXudong Chen #include <linux/io.h> 26*ce38815dSXudong Chen #include <linux/kernel.h> 27*ce38815dSXudong Chen #include <linux/mm.h> 28*ce38815dSXudong Chen #include <linux/module.h> 29*ce38815dSXudong Chen #include <linux/of_address.h> 30*ce38815dSXudong Chen #include <linux/of_irq.h> 31*ce38815dSXudong Chen #include <linux/platform_device.h> 32*ce38815dSXudong Chen #include <linux/scatterlist.h> 33*ce38815dSXudong Chen #include <linux/sched.h> 34*ce38815dSXudong Chen #include <linux/slab.h> 35*ce38815dSXudong Chen 36*ce38815dSXudong Chen #define I2C_HS_NACKERR (1 << 2) 37*ce38815dSXudong Chen #define I2C_ACKERR (1 << 1) 38*ce38815dSXudong Chen #define I2C_TRANSAC_COMP (1 << 0) 39*ce38815dSXudong Chen #define I2C_TRANSAC_START (1 << 0) 40*ce38815dSXudong Chen #define I2C_DCM_DISABLE 0x0000 41*ce38815dSXudong Chen #define I2C_IO_CONFIG_OPEN_DRAIN 0x0003 42*ce38815dSXudong Chen #define I2C_IO_CONFIG_PUSH_PULL 0x0000 43*ce38815dSXudong Chen #define I2C_SOFT_RST 0x0001 44*ce38815dSXudong Chen #define I2C_FIFO_ADDR_CLR 0x0001 45*ce38815dSXudong Chen #define I2C_DELAY_LEN 0x0002 46*ce38815dSXudong Chen #define I2C_ST_START_CON 0x8001 47*ce38815dSXudong Chen #define I2C_FS_START_CON 0x1800 48*ce38815dSXudong Chen #define I2C_TIME_CLR_VALUE 0x0000 49*ce38815dSXudong Chen #define I2C_TIME_DEFAULT_VALUE 0x0003 50*ce38815dSXudong Chen #define I2C_FS_TIME_INIT_VALUE 0x1303 51*ce38815dSXudong Chen #define I2C_WRRD_TRANAC_VALUE 0x0002 52*ce38815dSXudong Chen #define I2C_RD_TRANAC_VALUE 0x0001 53*ce38815dSXudong Chen 54*ce38815dSXudong Chen #define I2C_DMA_CON_TX 0x0000 55*ce38815dSXudong Chen #define I2C_DMA_CON_RX 0x0001 56*ce38815dSXudong Chen #define I2C_DMA_START_EN 0x0001 57*ce38815dSXudong Chen #define I2C_DMA_INT_FLAG_NONE 0x0000 58*ce38815dSXudong Chen #define I2C_DMA_CLR_FLAG 0x0000 59*ce38815dSXudong Chen 60*ce38815dSXudong Chen #define I2C_DEFAULT_SPEED 100000 /* hz */ 61*ce38815dSXudong Chen #define MAX_FS_MODE_SPEED 400000 62*ce38815dSXudong Chen #define MAX_HS_MODE_SPEED 3400000 63*ce38815dSXudong Chen #define MAX_SAMPLE_CNT_DIV 8 64*ce38815dSXudong Chen #define MAX_STEP_CNT_DIV 64 65*ce38815dSXudong Chen #define MAX_HS_STEP_CNT_DIV 8 66*ce38815dSXudong Chen 67*ce38815dSXudong Chen #define I2C_CONTROL_RS (0x1 << 1) 68*ce38815dSXudong Chen #define I2C_CONTROL_DMA_EN (0x1 << 2) 69*ce38815dSXudong Chen #define I2C_CONTROL_CLK_EXT_EN (0x1 << 3) 70*ce38815dSXudong Chen #define I2C_CONTROL_DIR_CHANGE (0x1 << 4) 71*ce38815dSXudong Chen #define I2C_CONTROL_ACKERR_DET_EN (0x1 << 5) 72*ce38815dSXudong Chen #define I2C_CONTROL_TRANSFER_LEN_CHANGE (0x1 << 6) 73*ce38815dSXudong Chen #define I2C_CONTROL_WRAPPER (0x1 << 0) 74*ce38815dSXudong Chen 75*ce38815dSXudong Chen #define I2C_DRV_NAME "i2c-mt65xx" 76*ce38815dSXudong Chen 77*ce38815dSXudong Chen enum DMA_REGS_OFFSET { 78*ce38815dSXudong Chen OFFSET_INT_FLAG = 0x0, 79*ce38815dSXudong Chen OFFSET_INT_EN = 0x04, 80*ce38815dSXudong Chen OFFSET_EN = 0x08, 81*ce38815dSXudong Chen OFFSET_CON = 0x18, 82*ce38815dSXudong Chen OFFSET_TX_MEM_ADDR = 0x1c, 83*ce38815dSXudong Chen OFFSET_RX_MEM_ADDR = 0x20, 84*ce38815dSXudong Chen OFFSET_TX_LEN = 0x24, 85*ce38815dSXudong Chen OFFSET_RX_LEN = 0x28, 86*ce38815dSXudong Chen }; 87*ce38815dSXudong Chen 88*ce38815dSXudong Chen enum i2c_trans_st_rs { 89*ce38815dSXudong Chen I2C_TRANS_STOP = 0, 90*ce38815dSXudong Chen I2C_TRANS_REPEATED_START, 91*ce38815dSXudong Chen }; 92*ce38815dSXudong Chen 93*ce38815dSXudong Chen enum mtk_trans_op { 94*ce38815dSXudong Chen I2C_MASTER_WR = 1, 95*ce38815dSXudong Chen I2C_MASTER_RD, 96*ce38815dSXudong Chen I2C_MASTER_WRRD, 97*ce38815dSXudong Chen }; 98*ce38815dSXudong Chen 99*ce38815dSXudong Chen enum I2C_REGS_OFFSET { 100*ce38815dSXudong Chen OFFSET_DATA_PORT = 0x0, 101*ce38815dSXudong Chen OFFSET_SLAVE_ADDR = 0x04, 102*ce38815dSXudong Chen OFFSET_INTR_MASK = 0x08, 103*ce38815dSXudong Chen OFFSET_INTR_STAT = 0x0c, 104*ce38815dSXudong Chen OFFSET_CONTROL = 0x10, 105*ce38815dSXudong Chen OFFSET_TRANSFER_LEN = 0x14, 106*ce38815dSXudong Chen OFFSET_TRANSAC_LEN = 0x18, 107*ce38815dSXudong Chen OFFSET_DELAY_LEN = 0x1c, 108*ce38815dSXudong Chen OFFSET_TIMING = 0x20, 109*ce38815dSXudong Chen OFFSET_START = 0x24, 110*ce38815dSXudong Chen OFFSET_EXT_CONF = 0x28, 111*ce38815dSXudong Chen OFFSET_FIFO_STAT = 0x30, 112*ce38815dSXudong Chen OFFSET_FIFO_THRESH = 0x34, 113*ce38815dSXudong Chen OFFSET_FIFO_ADDR_CLR = 0x38, 114*ce38815dSXudong Chen OFFSET_IO_CONFIG = 0x40, 115*ce38815dSXudong Chen OFFSET_RSV_DEBUG = 0x44, 116*ce38815dSXudong Chen OFFSET_HS = 0x48, 117*ce38815dSXudong Chen OFFSET_SOFTRESET = 0x50, 118*ce38815dSXudong Chen OFFSET_DCM_EN = 0x54, 119*ce38815dSXudong Chen OFFSET_PATH_DIR = 0x60, 120*ce38815dSXudong Chen OFFSET_DEBUGSTAT = 0x64, 121*ce38815dSXudong Chen OFFSET_DEBUGCTRL = 0x68, 122*ce38815dSXudong Chen OFFSET_TRANSFER_LEN_AUX = 0x6c, 123*ce38815dSXudong Chen }; 124*ce38815dSXudong Chen 125*ce38815dSXudong Chen struct mtk_i2c_compatible { 126*ce38815dSXudong Chen const struct i2c_adapter_quirks *quirks; 127*ce38815dSXudong Chen unsigned char pmic_i2c: 1; 128*ce38815dSXudong Chen unsigned char dcm: 1; 129*ce38815dSXudong Chen }; 130*ce38815dSXudong Chen 131*ce38815dSXudong Chen struct mtk_i2c { 132*ce38815dSXudong Chen struct i2c_adapter adap; /* i2c host adapter */ 133*ce38815dSXudong Chen struct device *dev; 134*ce38815dSXudong Chen struct completion msg_complete; 135*ce38815dSXudong Chen 136*ce38815dSXudong Chen /* set in i2c probe */ 137*ce38815dSXudong Chen void __iomem *base; /* i2c base addr */ 138*ce38815dSXudong Chen void __iomem *pdmabase; /* dma base address*/ 139*ce38815dSXudong Chen struct clk *clk_main; /* main clock for i2c bus */ 140*ce38815dSXudong Chen struct clk *clk_dma; /* DMA clock for i2c via DMA */ 141*ce38815dSXudong Chen struct clk *clk_pmic; /* PMIC clock for i2c from PMIC */ 142*ce38815dSXudong Chen bool have_pmic; /* can use i2c pins from PMIC */ 143*ce38815dSXudong Chen bool use_push_pull; /* IO config push-pull mode */ 144*ce38815dSXudong Chen 145*ce38815dSXudong Chen u16 irq_stat; /* interrupt status */ 146*ce38815dSXudong Chen unsigned int speed_hz; /* The speed in transfer */ 147*ce38815dSXudong Chen enum mtk_trans_op op; 148*ce38815dSXudong Chen u16 timing_reg; 149*ce38815dSXudong Chen u16 high_speed_reg; 150*ce38815dSXudong Chen const struct mtk_i2c_compatible *dev_comp; 151*ce38815dSXudong Chen }; 152*ce38815dSXudong Chen 153*ce38815dSXudong Chen static const struct i2c_adapter_quirks mt6577_i2c_quirks = { 154*ce38815dSXudong Chen .flags = I2C_AQ_COMB_WRITE_THEN_READ, 155*ce38815dSXudong Chen .max_num_msgs = 1, 156*ce38815dSXudong Chen .max_write_len = 255, 157*ce38815dSXudong Chen .max_read_len = 255, 158*ce38815dSXudong Chen .max_comb_1st_msg_len = 255, 159*ce38815dSXudong Chen .max_comb_2nd_msg_len = 31, 160*ce38815dSXudong Chen }; 161*ce38815dSXudong Chen 162*ce38815dSXudong Chen static const struct mtk_i2c_compatible mt6577_compat = { 163*ce38815dSXudong Chen .quirks = &mt6577_i2c_quirks, 164*ce38815dSXudong Chen .pmic_i2c = 0, 165*ce38815dSXudong Chen .dcm = 1, 166*ce38815dSXudong Chen }; 167*ce38815dSXudong Chen 168*ce38815dSXudong Chen static const struct mtk_i2c_compatible mt6589_compat = { 169*ce38815dSXudong Chen .quirks = &mt6577_i2c_quirks, 170*ce38815dSXudong Chen .pmic_i2c = 1, 171*ce38815dSXudong Chen .dcm = 0, 172*ce38815dSXudong Chen }; 173*ce38815dSXudong Chen 174*ce38815dSXudong Chen static const struct of_device_id mtk_i2c_of_match[] = { 175*ce38815dSXudong Chen { .compatible = "mediatek,mt6577-i2c", .data = &mt6577_compat }, 176*ce38815dSXudong Chen { .compatible = "mediatek,mt6589-i2c", .data = &mt6589_compat }, 177*ce38815dSXudong Chen {} 178*ce38815dSXudong Chen }; 179*ce38815dSXudong Chen MODULE_DEVICE_TABLE(of, mtk_i2c_of_match); 180*ce38815dSXudong Chen 181*ce38815dSXudong Chen static int mtk_i2c_clock_enable(struct mtk_i2c *i2c) 182*ce38815dSXudong Chen { 183*ce38815dSXudong Chen int ret; 184*ce38815dSXudong Chen 185*ce38815dSXudong Chen ret = clk_prepare_enable(i2c->clk_dma); 186*ce38815dSXudong Chen if (ret) 187*ce38815dSXudong Chen return ret; 188*ce38815dSXudong Chen 189*ce38815dSXudong Chen ret = clk_prepare_enable(i2c->clk_main); 190*ce38815dSXudong Chen if (ret) 191*ce38815dSXudong Chen goto err_main; 192*ce38815dSXudong Chen 193*ce38815dSXudong Chen if (i2c->have_pmic) { 194*ce38815dSXudong Chen ret = clk_prepare_enable(i2c->clk_pmic); 195*ce38815dSXudong Chen if (ret) 196*ce38815dSXudong Chen goto err_pmic; 197*ce38815dSXudong Chen } 198*ce38815dSXudong Chen return 0; 199*ce38815dSXudong Chen 200*ce38815dSXudong Chen err_pmic: 201*ce38815dSXudong Chen clk_disable_unprepare(i2c->clk_main); 202*ce38815dSXudong Chen err_main: 203*ce38815dSXudong Chen clk_disable_unprepare(i2c->clk_dma); 204*ce38815dSXudong Chen 205*ce38815dSXudong Chen return ret; 206*ce38815dSXudong Chen } 207*ce38815dSXudong Chen 208*ce38815dSXudong Chen static void mtk_i2c_clock_disable(struct mtk_i2c *i2c) 209*ce38815dSXudong Chen { 210*ce38815dSXudong Chen if (i2c->have_pmic) 211*ce38815dSXudong Chen clk_disable_unprepare(i2c->clk_pmic); 212*ce38815dSXudong Chen 213*ce38815dSXudong Chen clk_disable_unprepare(i2c->clk_main); 214*ce38815dSXudong Chen clk_disable_unprepare(i2c->clk_dma); 215*ce38815dSXudong Chen } 216*ce38815dSXudong Chen 217*ce38815dSXudong Chen static void mtk_i2c_init_hw(struct mtk_i2c *i2c) 218*ce38815dSXudong Chen { 219*ce38815dSXudong Chen u16 control_reg; 220*ce38815dSXudong Chen 221*ce38815dSXudong Chen writew(I2C_SOFT_RST, i2c->base + OFFSET_SOFTRESET); 222*ce38815dSXudong Chen 223*ce38815dSXudong Chen /* Set ioconfig */ 224*ce38815dSXudong Chen if (i2c->use_push_pull) 225*ce38815dSXudong Chen writew(I2C_IO_CONFIG_PUSH_PULL, i2c->base + OFFSET_IO_CONFIG); 226*ce38815dSXudong Chen else 227*ce38815dSXudong Chen writew(I2C_IO_CONFIG_OPEN_DRAIN, i2c->base + OFFSET_IO_CONFIG); 228*ce38815dSXudong Chen 229*ce38815dSXudong Chen if (i2c->dev_comp->dcm) 230*ce38815dSXudong Chen writew(I2C_DCM_DISABLE, i2c->base + OFFSET_DCM_EN); 231*ce38815dSXudong Chen 232*ce38815dSXudong Chen writew(i2c->timing_reg, i2c->base + OFFSET_TIMING); 233*ce38815dSXudong Chen writew(i2c->high_speed_reg, i2c->base + OFFSET_HS); 234*ce38815dSXudong Chen 235*ce38815dSXudong Chen /* If use i2c pin from PMIC mt6397 side, need set PATH_DIR first */ 236*ce38815dSXudong Chen if (i2c->have_pmic) 237*ce38815dSXudong Chen writew(I2C_CONTROL_WRAPPER, i2c->base + OFFSET_PATH_DIR); 238*ce38815dSXudong Chen 239*ce38815dSXudong Chen control_reg = I2C_CONTROL_ACKERR_DET_EN | 240*ce38815dSXudong Chen I2C_CONTROL_CLK_EXT_EN | I2C_CONTROL_DMA_EN; 241*ce38815dSXudong Chen writew(control_reg, i2c->base + OFFSET_CONTROL); 242*ce38815dSXudong Chen writew(I2C_DELAY_LEN, i2c->base + OFFSET_DELAY_LEN); 243*ce38815dSXudong Chen } 244*ce38815dSXudong Chen 245*ce38815dSXudong Chen /* 246*ce38815dSXudong Chen * Calculate i2c port speed 247*ce38815dSXudong Chen * 248*ce38815dSXudong Chen * Hardware design: 249*ce38815dSXudong Chen * i2c_bus_freq = parent_clk / (clock_div * 2 * sample_cnt * step_cnt) 250*ce38815dSXudong Chen * clock_div: fixed in hardware, but may be various in different SoCs 251*ce38815dSXudong Chen * 252*ce38815dSXudong Chen * The calculation want to pick the highest bus frequency that is still 253*ce38815dSXudong Chen * less than or equal to i2c->speed_hz. The calculation try to get 254*ce38815dSXudong Chen * sample_cnt and step_cn 255*ce38815dSXudong Chen */ 256*ce38815dSXudong Chen static int mtk_i2c_set_speed(struct mtk_i2c *i2c, unsigned int parent_clk, 257*ce38815dSXudong Chen unsigned int clock_div) 258*ce38815dSXudong Chen { 259*ce38815dSXudong Chen unsigned int clk_src; 260*ce38815dSXudong Chen unsigned int step_cnt; 261*ce38815dSXudong Chen unsigned int sample_cnt; 262*ce38815dSXudong Chen unsigned int max_step_cnt; 263*ce38815dSXudong Chen unsigned int target_speed; 264*ce38815dSXudong Chen unsigned int base_sample_cnt = MAX_SAMPLE_CNT_DIV; 265*ce38815dSXudong Chen unsigned int base_step_cnt; 266*ce38815dSXudong Chen unsigned int opt_div; 267*ce38815dSXudong Chen unsigned int best_mul; 268*ce38815dSXudong Chen unsigned int cnt_mul; 269*ce38815dSXudong Chen 270*ce38815dSXudong Chen clk_src = parent_clk / clock_div; 271*ce38815dSXudong Chen target_speed = i2c->speed_hz; 272*ce38815dSXudong Chen 273*ce38815dSXudong Chen if (target_speed > MAX_HS_MODE_SPEED) 274*ce38815dSXudong Chen target_speed = MAX_HS_MODE_SPEED; 275*ce38815dSXudong Chen 276*ce38815dSXudong Chen if (target_speed > MAX_FS_MODE_SPEED) 277*ce38815dSXudong Chen max_step_cnt = MAX_HS_STEP_CNT_DIV; 278*ce38815dSXudong Chen else 279*ce38815dSXudong Chen max_step_cnt = MAX_STEP_CNT_DIV; 280*ce38815dSXudong Chen 281*ce38815dSXudong Chen base_step_cnt = max_step_cnt; 282*ce38815dSXudong Chen /* Find the best combination */ 283*ce38815dSXudong Chen opt_div = DIV_ROUND_UP(clk_src >> 1, target_speed); 284*ce38815dSXudong Chen best_mul = MAX_SAMPLE_CNT_DIV * max_step_cnt; 285*ce38815dSXudong Chen 286*ce38815dSXudong Chen /* Search for the best pair (sample_cnt, step_cnt) with 287*ce38815dSXudong Chen * 0 < sample_cnt < MAX_SAMPLE_CNT_DIV 288*ce38815dSXudong Chen * 0 < step_cnt < max_step_cnt 289*ce38815dSXudong Chen * sample_cnt * step_cnt >= opt_div 290*ce38815dSXudong Chen * optimizing for sample_cnt * step_cnt being minimal 291*ce38815dSXudong Chen */ 292*ce38815dSXudong Chen for (sample_cnt = 1; sample_cnt <= MAX_SAMPLE_CNT_DIV; sample_cnt++) { 293*ce38815dSXudong Chen step_cnt = DIV_ROUND_UP(opt_div, sample_cnt); 294*ce38815dSXudong Chen cnt_mul = step_cnt * sample_cnt; 295*ce38815dSXudong Chen if (step_cnt > max_step_cnt) 296*ce38815dSXudong Chen continue; 297*ce38815dSXudong Chen 298*ce38815dSXudong Chen if (cnt_mul < best_mul) { 299*ce38815dSXudong Chen best_mul = cnt_mul; 300*ce38815dSXudong Chen base_sample_cnt = sample_cnt; 301*ce38815dSXudong Chen base_step_cnt = step_cnt; 302*ce38815dSXudong Chen if (best_mul == opt_div) 303*ce38815dSXudong Chen break; 304*ce38815dSXudong Chen } 305*ce38815dSXudong Chen } 306*ce38815dSXudong Chen 307*ce38815dSXudong Chen sample_cnt = base_sample_cnt; 308*ce38815dSXudong Chen step_cnt = base_step_cnt; 309*ce38815dSXudong Chen 310*ce38815dSXudong Chen if ((clk_src / (2 * sample_cnt * step_cnt)) > target_speed) { 311*ce38815dSXudong Chen /* In this case, hardware can't support such 312*ce38815dSXudong Chen * low i2c_bus_freq 313*ce38815dSXudong Chen */ 314*ce38815dSXudong Chen dev_dbg(i2c->dev, "Unsupported speed (%uhz)\n", target_speed); 315*ce38815dSXudong Chen return -EINVAL; 316*ce38815dSXudong Chen } 317*ce38815dSXudong Chen 318*ce38815dSXudong Chen step_cnt--; 319*ce38815dSXudong Chen sample_cnt--; 320*ce38815dSXudong Chen 321*ce38815dSXudong Chen if (target_speed > MAX_FS_MODE_SPEED) { 322*ce38815dSXudong Chen /* Set the high speed mode register */ 323*ce38815dSXudong Chen i2c->timing_reg = I2C_FS_TIME_INIT_VALUE; 324*ce38815dSXudong Chen i2c->high_speed_reg = I2C_TIME_DEFAULT_VALUE | 325*ce38815dSXudong Chen (sample_cnt << 12) | (step_cnt << 8); 326*ce38815dSXudong Chen } else { 327*ce38815dSXudong Chen i2c->timing_reg = (sample_cnt << 8) | (step_cnt << 0); 328*ce38815dSXudong Chen /* Disable the high speed transaction */ 329*ce38815dSXudong Chen i2c->high_speed_reg = I2C_TIME_CLR_VALUE; 330*ce38815dSXudong Chen } 331*ce38815dSXudong Chen 332*ce38815dSXudong Chen return 0; 333*ce38815dSXudong Chen } 334*ce38815dSXudong Chen 335*ce38815dSXudong Chen static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs) 336*ce38815dSXudong Chen { 337*ce38815dSXudong Chen u16 addr_reg; 338*ce38815dSXudong Chen u16 control_reg; 339*ce38815dSXudong Chen dma_addr_t rpaddr = 0; 340*ce38815dSXudong Chen dma_addr_t wpaddr = 0; 341*ce38815dSXudong Chen int ret; 342*ce38815dSXudong Chen 343*ce38815dSXudong Chen i2c->irq_stat = 0; 344*ce38815dSXudong Chen 345*ce38815dSXudong Chen reinit_completion(&i2c->msg_complete); 346*ce38815dSXudong Chen 347*ce38815dSXudong Chen control_reg = readw(i2c->base + OFFSET_CONTROL) & 348*ce38815dSXudong Chen ~(I2C_CONTROL_DIR_CHANGE | I2C_CONTROL_RS); 349*ce38815dSXudong Chen if (i2c->speed_hz > 400000) 350*ce38815dSXudong Chen control_reg |= I2C_CONTROL_RS; 351*ce38815dSXudong Chen 352*ce38815dSXudong Chen if (i2c->op == I2C_MASTER_WRRD) 353*ce38815dSXudong Chen control_reg |= I2C_CONTROL_DIR_CHANGE | I2C_CONTROL_RS; 354*ce38815dSXudong Chen 355*ce38815dSXudong Chen writew(control_reg, i2c->base + OFFSET_CONTROL); 356*ce38815dSXudong Chen 357*ce38815dSXudong Chen /* set start condition */ 358*ce38815dSXudong Chen if (i2c->speed_hz <= 100000) 359*ce38815dSXudong Chen writew(I2C_ST_START_CON, i2c->base + OFFSET_EXT_CONF); 360*ce38815dSXudong Chen else 361*ce38815dSXudong Chen writew(I2C_FS_START_CON, i2c->base + OFFSET_EXT_CONF); 362*ce38815dSXudong Chen 363*ce38815dSXudong Chen addr_reg = msgs->addr << 1; 364*ce38815dSXudong Chen if (i2c->op == I2C_MASTER_RD) 365*ce38815dSXudong Chen addr_reg |= 0x1; 366*ce38815dSXudong Chen 367*ce38815dSXudong Chen writew(addr_reg, i2c->base + OFFSET_SLAVE_ADDR); 368*ce38815dSXudong Chen 369*ce38815dSXudong Chen /* Clear interrupt status */ 370*ce38815dSXudong Chen writew(I2C_HS_NACKERR | I2C_ACKERR | I2C_TRANSAC_COMP, 371*ce38815dSXudong Chen i2c->base + OFFSET_INTR_STAT); 372*ce38815dSXudong Chen writew(I2C_FIFO_ADDR_CLR, i2c->base + OFFSET_FIFO_ADDR_CLR); 373*ce38815dSXudong Chen 374*ce38815dSXudong Chen /* Enable interrupt */ 375*ce38815dSXudong Chen writew(I2C_HS_NACKERR | I2C_ACKERR | I2C_TRANSAC_COMP, 376*ce38815dSXudong Chen i2c->base + OFFSET_INTR_MASK); 377*ce38815dSXudong Chen 378*ce38815dSXudong Chen /* Set transfer and transaction len */ 379*ce38815dSXudong Chen if (i2c->op == I2C_MASTER_WRRD) { 380*ce38815dSXudong Chen writew(msgs->len | ((msgs + 1)->len) << 8, 381*ce38815dSXudong Chen i2c->base + OFFSET_TRANSFER_LEN); 382*ce38815dSXudong Chen writew(I2C_WRRD_TRANAC_VALUE, i2c->base + OFFSET_TRANSAC_LEN); 383*ce38815dSXudong Chen } else { 384*ce38815dSXudong Chen writew(msgs->len, i2c->base + OFFSET_TRANSFER_LEN); 385*ce38815dSXudong Chen writew(I2C_RD_TRANAC_VALUE, i2c->base + OFFSET_TRANSAC_LEN); 386*ce38815dSXudong Chen } 387*ce38815dSXudong Chen 388*ce38815dSXudong Chen /* Prepare buffer data to start transfer */ 389*ce38815dSXudong Chen if (i2c->op == I2C_MASTER_RD) { 390*ce38815dSXudong Chen writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); 391*ce38815dSXudong Chen writel(I2C_DMA_CON_RX, i2c->pdmabase + OFFSET_CON); 392*ce38815dSXudong Chen rpaddr = dma_map_single(i2c->dev, msgs->buf, 393*ce38815dSXudong Chen msgs->len, DMA_FROM_DEVICE); 394*ce38815dSXudong Chen if (dma_mapping_error(i2c->dev, rpaddr)) 395*ce38815dSXudong Chen return -ENOMEM; 396*ce38815dSXudong Chen writel((u32)rpaddr, i2c->pdmabase + OFFSET_RX_MEM_ADDR); 397*ce38815dSXudong Chen writel(msgs->len, i2c->pdmabase + OFFSET_RX_LEN); 398*ce38815dSXudong Chen } else if (i2c->op == I2C_MASTER_WR) { 399*ce38815dSXudong Chen writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); 400*ce38815dSXudong Chen writel(I2C_DMA_CON_TX, i2c->pdmabase + OFFSET_CON); 401*ce38815dSXudong Chen wpaddr = dma_map_single(i2c->dev, msgs->buf, 402*ce38815dSXudong Chen msgs->len, DMA_TO_DEVICE); 403*ce38815dSXudong Chen if (dma_mapping_error(i2c->dev, wpaddr)) 404*ce38815dSXudong Chen return -ENOMEM; 405*ce38815dSXudong Chen writel((u32)wpaddr, i2c->pdmabase + OFFSET_TX_MEM_ADDR); 406*ce38815dSXudong Chen writel(msgs->len, i2c->pdmabase + OFFSET_TX_LEN); 407*ce38815dSXudong Chen } else { 408*ce38815dSXudong Chen writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_INT_FLAG); 409*ce38815dSXudong Chen writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_CON); 410*ce38815dSXudong Chen wpaddr = dma_map_single(i2c->dev, msgs->buf, 411*ce38815dSXudong Chen msgs->len, DMA_TO_DEVICE); 412*ce38815dSXudong Chen if (dma_mapping_error(i2c->dev, wpaddr)) 413*ce38815dSXudong Chen return -ENOMEM; 414*ce38815dSXudong Chen rpaddr = dma_map_single(i2c->dev, (msgs + 1)->buf, 415*ce38815dSXudong Chen (msgs + 1)->len, 416*ce38815dSXudong Chen DMA_FROM_DEVICE); 417*ce38815dSXudong Chen if (dma_mapping_error(i2c->dev, rpaddr)) { 418*ce38815dSXudong Chen dma_unmap_single(i2c->dev, wpaddr, 419*ce38815dSXudong Chen msgs->len, DMA_TO_DEVICE); 420*ce38815dSXudong Chen return -ENOMEM; 421*ce38815dSXudong Chen } 422*ce38815dSXudong Chen writel((u32)wpaddr, i2c->pdmabase + OFFSET_TX_MEM_ADDR); 423*ce38815dSXudong Chen writel((u32)rpaddr, i2c->pdmabase + OFFSET_RX_MEM_ADDR); 424*ce38815dSXudong Chen writel(msgs->len, i2c->pdmabase + OFFSET_TX_LEN); 425*ce38815dSXudong Chen writel((msgs + 1)->len, i2c->pdmabase + OFFSET_RX_LEN); 426*ce38815dSXudong Chen } 427*ce38815dSXudong Chen 428*ce38815dSXudong Chen writel(I2C_DMA_START_EN, i2c->pdmabase + OFFSET_EN); 429*ce38815dSXudong Chen writew(I2C_TRANSAC_START, i2c->base + OFFSET_START); 430*ce38815dSXudong Chen 431*ce38815dSXudong Chen ret = wait_for_completion_timeout(&i2c->msg_complete, 432*ce38815dSXudong Chen i2c->adap.timeout); 433*ce38815dSXudong Chen 434*ce38815dSXudong Chen /* Clear interrupt mask */ 435*ce38815dSXudong Chen writew(~(I2C_HS_NACKERR | I2C_ACKERR | 436*ce38815dSXudong Chen I2C_TRANSAC_COMP), i2c->base + OFFSET_INTR_MASK); 437*ce38815dSXudong Chen 438*ce38815dSXudong Chen if (i2c->op == I2C_MASTER_WR) { 439*ce38815dSXudong Chen dma_unmap_single(i2c->dev, wpaddr, 440*ce38815dSXudong Chen msgs->len, DMA_TO_DEVICE); 441*ce38815dSXudong Chen } else if (i2c->op == I2C_MASTER_RD) { 442*ce38815dSXudong Chen dma_unmap_single(i2c->dev, rpaddr, 443*ce38815dSXudong Chen msgs->len, DMA_FROM_DEVICE); 444*ce38815dSXudong Chen } else { 445*ce38815dSXudong Chen dma_unmap_single(i2c->dev, wpaddr, msgs->len, 446*ce38815dSXudong Chen DMA_TO_DEVICE); 447*ce38815dSXudong Chen dma_unmap_single(i2c->dev, rpaddr, (msgs + 1)->len, 448*ce38815dSXudong Chen DMA_FROM_DEVICE); 449*ce38815dSXudong Chen } 450*ce38815dSXudong Chen 451*ce38815dSXudong Chen if (ret == 0) { 452*ce38815dSXudong Chen dev_dbg(i2c->dev, "addr: %x, transfer timeout\n", msgs->addr); 453*ce38815dSXudong Chen mtk_i2c_init_hw(i2c); 454*ce38815dSXudong Chen return -ETIMEDOUT; 455*ce38815dSXudong Chen } 456*ce38815dSXudong Chen 457*ce38815dSXudong Chen completion_done(&i2c->msg_complete); 458*ce38815dSXudong Chen 459*ce38815dSXudong Chen if (i2c->irq_stat & (I2C_HS_NACKERR | I2C_ACKERR)) { 460*ce38815dSXudong Chen dev_dbg(i2c->dev, "addr: %x, transfer ACK error\n", msgs->addr); 461*ce38815dSXudong Chen mtk_i2c_init_hw(i2c); 462*ce38815dSXudong Chen return -ENXIO; 463*ce38815dSXudong Chen } 464*ce38815dSXudong Chen 465*ce38815dSXudong Chen return 0; 466*ce38815dSXudong Chen } 467*ce38815dSXudong Chen 468*ce38815dSXudong Chen static int mtk_i2c_transfer(struct i2c_adapter *adap, 469*ce38815dSXudong Chen struct i2c_msg msgs[], int num) 470*ce38815dSXudong Chen { 471*ce38815dSXudong Chen int ret; 472*ce38815dSXudong Chen int left_num = num; 473*ce38815dSXudong Chen struct mtk_i2c *i2c = i2c_get_adapdata(adap); 474*ce38815dSXudong Chen 475*ce38815dSXudong Chen ret = mtk_i2c_clock_enable(i2c); 476*ce38815dSXudong Chen if (ret) 477*ce38815dSXudong Chen return ret; 478*ce38815dSXudong Chen 479*ce38815dSXudong Chen if (!msgs->buf) { 480*ce38815dSXudong Chen dev_dbg(i2c->dev, "data buffer is NULL.\n"); 481*ce38815dSXudong Chen ret = -EINVAL; 482*ce38815dSXudong Chen goto err_exit; 483*ce38815dSXudong Chen } 484*ce38815dSXudong Chen 485*ce38815dSXudong Chen if (msgs->flags & I2C_M_RD) 486*ce38815dSXudong Chen i2c->op = I2C_MASTER_RD; 487*ce38815dSXudong Chen else 488*ce38815dSXudong Chen i2c->op = I2C_MASTER_WR; 489*ce38815dSXudong Chen 490*ce38815dSXudong Chen if (num > 1) { 491*ce38815dSXudong Chen /* combined two messages into one transaction */ 492*ce38815dSXudong Chen i2c->op = I2C_MASTER_WRRD; 493*ce38815dSXudong Chen left_num--; 494*ce38815dSXudong Chen } 495*ce38815dSXudong Chen 496*ce38815dSXudong Chen /* always use DMA mode. */ 497*ce38815dSXudong Chen ret = mtk_i2c_do_transfer(i2c, msgs); 498*ce38815dSXudong Chen if (ret < 0) 499*ce38815dSXudong Chen goto err_exit; 500*ce38815dSXudong Chen 501*ce38815dSXudong Chen /* the return value is number of executed messages */ 502*ce38815dSXudong Chen ret = num; 503*ce38815dSXudong Chen 504*ce38815dSXudong Chen err_exit: 505*ce38815dSXudong Chen mtk_i2c_clock_disable(i2c); 506*ce38815dSXudong Chen return ret; 507*ce38815dSXudong Chen } 508*ce38815dSXudong Chen 509*ce38815dSXudong Chen static irqreturn_t mtk_i2c_irq(int irqno, void *dev_id) 510*ce38815dSXudong Chen { 511*ce38815dSXudong Chen struct mtk_i2c *i2c = dev_id; 512*ce38815dSXudong Chen 513*ce38815dSXudong Chen i2c->irq_stat = readw(i2c->base + OFFSET_INTR_STAT); 514*ce38815dSXudong Chen writew(I2C_HS_NACKERR | I2C_ACKERR 515*ce38815dSXudong Chen | I2C_TRANSAC_COMP, i2c->base + OFFSET_INTR_STAT); 516*ce38815dSXudong Chen 517*ce38815dSXudong Chen complete(&i2c->msg_complete); 518*ce38815dSXudong Chen 519*ce38815dSXudong Chen return IRQ_HANDLED; 520*ce38815dSXudong Chen } 521*ce38815dSXudong Chen 522*ce38815dSXudong Chen static u32 mtk_i2c_functionality(struct i2c_adapter *adap) 523*ce38815dSXudong Chen { 524*ce38815dSXudong Chen return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; 525*ce38815dSXudong Chen } 526*ce38815dSXudong Chen 527*ce38815dSXudong Chen static const struct i2c_algorithm mtk_i2c_algorithm = { 528*ce38815dSXudong Chen .master_xfer = mtk_i2c_transfer, 529*ce38815dSXudong Chen .functionality = mtk_i2c_functionality, 530*ce38815dSXudong Chen }; 531*ce38815dSXudong Chen 532*ce38815dSXudong Chen static int mtk_i2c_parse_dt(struct device_node *np, struct mtk_i2c *i2c, 533*ce38815dSXudong Chen unsigned int *clk_src_div) 534*ce38815dSXudong Chen { 535*ce38815dSXudong Chen int ret; 536*ce38815dSXudong Chen 537*ce38815dSXudong Chen ret = of_property_read_u32(np, "clock-frequency", &i2c->speed_hz); 538*ce38815dSXudong Chen if (ret < 0) 539*ce38815dSXudong Chen i2c->speed_hz = I2C_DEFAULT_SPEED; 540*ce38815dSXudong Chen 541*ce38815dSXudong Chen ret = of_property_read_u32(np, "clock-div", clk_src_div); 542*ce38815dSXudong Chen if (ret < 0) 543*ce38815dSXudong Chen return ret; 544*ce38815dSXudong Chen 545*ce38815dSXudong Chen if (*clk_src_div == 0) 546*ce38815dSXudong Chen return -EINVAL; 547*ce38815dSXudong Chen 548*ce38815dSXudong Chen i2c->have_pmic = of_property_read_bool(np, "mediatek,have-pmic"); 549*ce38815dSXudong Chen i2c->use_push_pull = 550*ce38815dSXudong Chen of_property_read_bool(np, "mediatek,use-push-pull"); 551*ce38815dSXudong Chen 552*ce38815dSXudong Chen return 0; 553*ce38815dSXudong Chen } 554*ce38815dSXudong Chen 555*ce38815dSXudong Chen static int mtk_i2c_probe(struct platform_device *pdev) 556*ce38815dSXudong Chen { 557*ce38815dSXudong Chen const struct of_device_id *of_id; 558*ce38815dSXudong Chen int ret = 0; 559*ce38815dSXudong Chen struct mtk_i2c *i2c; 560*ce38815dSXudong Chen struct clk *clk; 561*ce38815dSXudong Chen unsigned int clk_src_div; 562*ce38815dSXudong Chen struct resource *res; 563*ce38815dSXudong Chen int irq; 564*ce38815dSXudong Chen 565*ce38815dSXudong Chen i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); 566*ce38815dSXudong Chen if (!i2c) 567*ce38815dSXudong Chen return -ENOMEM; 568*ce38815dSXudong Chen 569*ce38815dSXudong Chen ret = mtk_i2c_parse_dt(pdev->dev.of_node, i2c, &clk_src_div); 570*ce38815dSXudong Chen if (ret) 571*ce38815dSXudong Chen return -EINVAL; 572*ce38815dSXudong Chen 573*ce38815dSXudong Chen res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 574*ce38815dSXudong Chen i2c->base = devm_ioremap_resource(&pdev->dev, res); 575*ce38815dSXudong Chen if (IS_ERR(i2c->base)) 576*ce38815dSXudong Chen return PTR_ERR(i2c->base); 577*ce38815dSXudong Chen 578*ce38815dSXudong Chen res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 579*ce38815dSXudong Chen i2c->pdmabase = devm_ioremap_resource(&pdev->dev, res); 580*ce38815dSXudong Chen if (IS_ERR(i2c->pdmabase)) 581*ce38815dSXudong Chen return PTR_ERR(i2c->pdmabase); 582*ce38815dSXudong Chen 583*ce38815dSXudong Chen irq = platform_get_irq(pdev, 0); 584*ce38815dSXudong Chen if (irq <= 0) 585*ce38815dSXudong Chen return irq; 586*ce38815dSXudong Chen 587*ce38815dSXudong Chen init_completion(&i2c->msg_complete); 588*ce38815dSXudong Chen 589*ce38815dSXudong Chen of_id = of_match_node(mtk_i2c_of_match, pdev->dev.of_node); 590*ce38815dSXudong Chen if (!of_id) 591*ce38815dSXudong Chen return -EINVAL; 592*ce38815dSXudong Chen 593*ce38815dSXudong Chen i2c->dev_comp = of_id->data; 594*ce38815dSXudong Chen i2c->adap.dev.of_node = pdev->dev.of_node; 595*ce38815dSXudong Chen i2c->dev = &pdev->dev; 596*ce38815dSXudong Chen i2c->adap.dev.parent = &pdev->dev; 597*ce38815dSXudong Chen i2c->adap.owner = THIS_MODULE; 598*ce38815dSXudong Chen i2c->adap.algo = &mtk_i2c_algorithm; 599*ce38815dSXudong Chen i2c->adap.quirks = i2c->dev_comp->quirks; 600*ce38815dSXudong Chen i2c->adap.timeout = 2 * HZ; 601*ce38815dSXudong Chen i2c->adap.retries = 1; 602*ce38815dSXudong Chen 603*ce38815dSXudong Chen if (i2c->have_pmic && !i2c->dev_comp->pmic_i2c) 604*ce38815dSXudong Chen return -EINVAL; 605*ce38815dSXudong Chen 606*ce38815dSXudong Chen i2c->clk_main = devm_clk_get(&pdev->dev, "main"); 607*ce38815dSXudong Chen if (IS_ERR(i2c->clk_main)) { 608*ce38815dSXudong Chen dev_err(&pdev->dev, "cannot get main clock\n"); 609*ce38815dSXudong Chen return PTR_ERR(i2c->clk_main); 610*ce38815dSXudong Chen } 611*ce38815dSXudong Chen 612*ce38815dSXudong Chen i2c->clk_dma = devm_clk_get(&pdev->dev, "dma"); 613*ce38815dSXudong Chen if (IS_ERR(i2c->clk_dma)) { 614*ce38815dSXudong Chen dev_err(&pdev->dev, "cannot get dma clock\n"); 615*ce38815dSXudong Chen return PTR_ERR(i2c->clk_dma); 616*ce38815dSXudong Chen } 617*ce38815dSXudong Chen 618*ce38815dSXudong Chen clk = i2c->clk_main; 619*ce38815dSXudong Chen if (i2c->have_pmic) { 620*ce38815dSXudong Chen i2c->clk_pmic = devm_clk_get(&pdev->dev, "pmic"); 621*ce38815dSXudong Chen if (IS_ERR(i2c->clk_pmic)) { 622*ce38815dSXudong Chen dev_err(&pdev->dev, "cannot get pmic clock\n"); 623*ce38815dSXudong Chen return PTR_ERR(i2c->clk_pmic); 624*ce38815dSXudong Chen } 625*ce38815dSXudong Chen clk = i2c->clk_pmic; 626*ce38815dSXudong Chen } 627*ce38815dSXudong Chen 628*ce38815dSXudong Chen strlcpy(i2c->adap.name, I2C_DRV_NAME, sizeof(i2c->adap.name)); 629*ce38815dSXudong Chen 630*ce38815dSXudong Chen ret = mtk_i2c_set_speed(i2c, clk_get_rate(clk), clk_src_div); 631*ce38815dSXudong Chen if (ret) { 632*ce38815dSXudong Chen dev_err(&pdev->dev, "Failed to set the speed.\n"); 633*ce38815dSXudong Chen return -EINVAL; 634*ce38815dSXudong Chen } 635*ce38815dSXudong Chen 636*ce38815dSXudong Chen ret = mtk_i2c_clock_enable(i2c); 637*ce38815dSXudong Chen if (ret) { 638*ce38815dSXudong Chen dev_err(&pdev->dev, "clock enable failed!\n"); 639*ce38815dSXudong Chen return ret; 640*ce38815dSXudong Chen } 641*ce38815dSXudong Chen mtk_i2c_init_hw(i2c); 642*ce38815dSXudong Chen mtk_i2c_clock_disable(i2c); 643*ce38815dSXudong Chen 644*ce38815dSXudong Chen ret = devm_request_irq(&pdev->dev, irq, mtk_i2c_irq, 645*ce38815dSXudong Chen IRQF_TRIGGER_NONE, I2C_DRV_NAME, i2c); 646*ce38815dSXudong Chen if (ret < 0) { 647*ce38815dSXudong Chen dev_err(&pdev->dev, 648*ce38815dSXudong Chen "Request I2C IRQ %d fail\n", irq); 649*ce38815dSXudong Chen return ret; 650*ce38815dSXudong Chen } 651*ce38815dSXudong Chen 652*ce38815dSXudong Chen i2c_set_adapdata(&i2c->adap, i2c); 653*ce38815dSXudong Chen ret = i2c_add_adapter(&i2c->adap); 654*ce38815dSXudong Chen if (ret) { 655*ce38815dSXudong Chen dev_err(&pdev->dev, "Failed to add i2c bus to i2c core\n"); 656*ce38815dSXudong Chen return ret; 657*ce38815dSXudong Chen } 658*ce38815dSXudong Chen 659*ce38815dSXudong Chen platform_set_drvdata(pdev, i2c); 660*ce38815dSXudong Chen 661*ce38815dSXudong Chen return 0; 662*ce38815dSXudong Chen } 663*ce38815dSXudong Chen 664*ce38815dSXudong Chen static int mtk_i2c_remove(struct platform_device *pdev) 665*ce38815dSXudong Chen { 666*ce38815dSXudong Chen struct mtk_i2c *i2c = platform_get_drvdata(pdev); 667*ce38815dSXudong Chen 668*ce38815dSXudong Chen i2c_del_adapter(&i2c->adap); 669*ce38815dSXudong Chen 670*ce38815dSXudong Chen return 0; 671*ce38815dSXudong Chen } 672*ce38815dSXudong Chen 673*ce38815dSXudong Chen static struct platform_driver mtk_i2c_driver = { 674*ce38815dSXudong Chen .probe = mtk_i2c_probe, 675*ce38815dSXudong Chen .remove = mtk_i2c_remove, 676*ce38815dSXudong Chen .driver = { 677*ce38815dSXudong Chen .name = I2C_DRV_NAME, 678*ce38815dSXudong Chen .of_match_table = of_match_ptr(mtk_i2c_of_match), 679*ce38815dSXudong Chen }, 680*ce38815dSXudong Chen }; 681*ce38815dSXudong Chen 682*ce38815dSXudong Chen module_platform_driver(mtk_i2c_driver); 683*ce38815dSXudong Chen 684*ce38815dSXudong Chen MODULE_LICENSE("GPL v2"); 685*ce38815dSXudong Chen MODULE_DESCRIPTION("MediaTek I2C Bus Driver"); 686*ce38815dSXudong Chen MODULE_AUTHOR("Xudong Chen <xudong.chen@mediatek.com>"); 687