1*95a7f10eSVladimir Barinov /* 2*95a7f10eSVladimir Barinov * TI DAVINCI I2C adapter driver. 3*95a7f10eSVladimir Barinov * 4*95a7f10eSVladimir Barinov * Copyright (C) 2006 Texas Instruments. 5*95a7f10eSVladimir Barinov * Copyright (C) 2007 MontaVista Software Inc. 6*95a7f10eSVladimir Barinov * 7*95a7f10eSVladimir Barinov * Updated by Vinod & Sudhakar Feb 2005 8*95a7f10eSVladimir Barinov * 9*95a7f10eSVladimir Barinov * ---------------------------------------------------------------------------- 10*95a7f10eSVladimir Barinov * 11*95a7f10eSVladimir Barinov * This program is free software; you can redistribute it and/or modify 12*95a7f10eSVladimir Barinov * it under the terms of the GNU General Public License as published by 13*95a7f10eSVladimir Barinov * the Free Software Foundation; either version 2 of the License, or 14*95a7f10eSVladimir Barinov * (at your option) any later version. 15*95a7f10eSVladimir Barinov * 16*95a7f10eSVladimir Barinov * This program is distributed in the hope that it will be useful, 17*95a7f10eSVladimir Barinov * but WITHOUT ANY WARRANTY; without even the implied warranty of 18*95a7f10eSVladimir Barinov * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19*95a7f10eSVladimir Barinov * GNU General Public License for more details. 20*95a7f10eSVladimir Barinov * 21*95a7f10eSVladimir Barinov * You should have received a copy of the GNU General Public License 22*95a7f10eSVladimir Barinov * along with this program; if not, write to the Free Software 23*95a7f10eSVladimir Barinov * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 24*95a7f10eSVladimir Barinov * ---------------------------------------------------------------------------- 25*95a7f10eSVladimir Barinov * 26*95a7f10eSVladimir Barinov */ 27*95a7f10eSVladimir Barinov #include <linux/kernel.h> 28*95a7f10eSVladimir Barinov #include <linux/module.h> 29*95a7f10eSVladimir Barinov #include <linux/delay.h> 30*95a7f10eSVladimir Barinov #include <linux/i2c.h> 31*95a7f10eSVladimir Barinov #include <linux/clk.h> 32*95a7f10eSVladimir Barinov #include <linux/errno.h> 33*95a7f10eSVladimir Barinov #include <linux/sched.h> 34*95a7f10eSVladimir Barinov #include <linux/err.h> 35*95a7f10eSVladimir Barinov #include <linux/interrupt.h> 36*95a7f10eSVladimir Barinov #include <linux/platform_device.h> 37*95a7f10eSVladimir Barinov #include <linux/io.h> 38*95a7f10eSVladimir Barinov 39*95a7f10eSVladimir Barinov #include <asm/hardware.h> 40*95a7f10eSVladimir Barinov #include <asm/mach-types.h> 41*95a7f10eSVladimir Barinov 42*95a7f10eSVladimir Barinov #include <asm/arch/i2c.h> 43*95a7f10eSVladimir Barinov 44*95a7f10eSVladimir Barinov /* ----- global defines ----------------------------------------------- */ 45*95a7f10eSVladimir Barinov 46*95a7f10eSVladimir Barinov #define DAVINCI_I2C_TIMEOUT (1*HZ) 47*95a7f10eSVladimir Barinov #define I2C_DAVINCI_INTR_ALL (DAVINCI_I2C_IMR_AAS | \ 48*95a7f10eSVladimir Barinov DAVINCI_I2C_IMR_SCD | \ 49*95a7f10eSVladimir Barinov DAVINCI_I2C_IMR_ARDY | \ 50*95a7f10eSVladimir Barinov DAVINCI_I2C_IMR_NACK | \ 51*95a7f10eSVladimir Barinov DAVINCI_I2C_IMR_AL) 52*95a7f10eSVladimir Barinov 53*95a7f10eSVladimir Barinov #define DAVINCI_I2C_OAR_REG 0x00 54*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IMR_REG 0x04 55*95a7f10eSVladimir Barinov #define DAVINCI_I2C_STR_REG 0x08 56*95a7f10eSVladimir Barinov #define DAVINCI_I2C_CLKL_REG 0x0c 57*95a7f10eSVladimir Barinov #define DAVINCI_I2C_CLKH_REG 0x10 58*95a7f10eSVladimir Barinov #define DAVINCI_I2C_CNT_REG 0x14 59*95a7f10eSVladimir Barinov #define DAVINCI_I2C_DRR_REG 0x18 60*95a7f10eSVladimir Barinov #define DAVINCI_I2C_SAR_REG 0x1c 61*95a7f10eSVladimir Barinov #define DAVINCI_I2C_DXR_REG 0x20 62*95a7f10eSVladimir Barinov #define DAVINCI_I2C_MDR_REG 0x24 63*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IVR_REG 0x28 64*95a7f10eSVladimir Barinov #define DAVINCI_I2C_EMDR_REG 0x2c 65*95a7f10eSVladimir Barinov #define DAVINCI_I2C_PSC_REG 0x30 66*95a7f10eSVladimir Barinov 67*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IVR_AAS 0x07 68*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IVR_SCD 0x06 69*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IVR_XRDY 0x05 70*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IVR_RDR 0x04 71*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IVR_ARDY 0x03 72*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IVR_NACK 0x02 73*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IVR_AL 0x01 74*95a7f10eSVladimir Barinov 75*95a7f10eSVladimir Barinov #define DAVINCI_I2C_STR_BB (1 << 12) 76*95a7f10eSVladimir Barinov #define DAVINCI_I2C_STR_RSFULL (1 << 11) 77*95a7f10eSVladimir Barinov #define DAVINCI_I2C_STR_SCD (1 << 5) 78*95a7f10eSVladimir Barinov #define DAVINCI_I2C_STR_ARDY (1 << 2) 79*95a7f10eSVladimir Barinov #define DAVINCI_I2C_STR_NACK (1 << 1) 80*95a7f10eSVladimir Barinov #define DAVINCI_I2C_STR_AL (1 << 0) 81*95a7f10eSVladimir Barinov 82*95a7f10eSVladimir Barinov #define DAVINCI_I2C_MDR_NACK (1 << 15) 83*95a7f10eSVladimir Barinov #define DAVINCI_I2C_MDR_STT (1 << 13) 84*95a7f10eSVladimir Barinov #define DAVINCI_I2C_MDR_STP (1 << 11) 85*95a7f10eSVladimir Barinov #define DAVINCI_I2C_MDR_MST (1 << 10) 86*95a7f10eSVladimir Barinov #define DAVINCI_I2C_MDR_TRX (1 << 9) 87*95a7f10eSVladimir Barinov #define DAVINCI_I2C_MDR_XA (1 << 8) 88*95a7f10eSVladimir Barinov #define DAVINCI_I2C_MDR_IRS (1 << 5) 89*95a7f10eSVladimir Barinov 90*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IMR_AAS (1 << 6) 91*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IMR_SCD (1 << 5) 92*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IMR_XRDY (1 << 4) 93*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IMR_RRDY (1 << 3) 94*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IMR_ARDY (1 << 2) 95*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IMR_NACK (1 << 1) 96*95a7f10eSVladimir Barinov #define DAVINCI_I2C_IMR_AL (1 << 0) 97*95a7f10eSVladimir Barinov 98*95a7f10eSVladimir Barinov #define MOD_REG_BIT(val, mask, set) do { \ 99*95a7f10eSVladimir Barinov if (set) { \ 100*95a7f10eSVladimir Barinov val |= mask; \ 101*95a7f10eSVladimir Barinov } else { \ 102*95a7f10eSVladimir Barinov val &= ~mask; \ 103*95a7f10eSVladimir Barinov } \ 104*95a7f10eSVladimir Barinov } while (0) 105*95a7f10eSVladimir Barinov 106*95a7f10eSVladimir Barinov struct davinci_i2c_dev { 107*95a7f10eSVladimir Barinov struct device *dev; 108*95a7f10eSVladimir Barinov void __iomem *base; 109*95a7f10eSVladimir Barinov struct completion cmd_complete; 110*95a7f10eSVladimir Barinov struct clk *clk; 111*95a7f10eSVladimir Barinov int cmd_err; 112*95a7f10eSVladimir Barinov u8 *buf; 113*95a7f10eSVladimir Barinov size_t buf_len; 114*95a7f10eSVladimir Barinov int irq; 115*95a7f10eSVladimir Barinov struct i2c_adapter adapter; 116*95a7f10eSVladimir Barinov }; 117*95a7f10eSVladimir Barinov 118*95a7f10eSVladimir Barinov /* default platform data to use if not supplied in the platform_device */ 119*95a7f10eSVladimir Barinov static struct davinci_i2c_platform_data davinci_i2c_platform_data_default = { 120*95a7f10eSVladimir Barinov .bus_freq = 100, 121*95a7f10eSVladimir Barinov .bus_delay = 0, 122*95a7f10eSVladimir Barinov }; 123*95a7f10eSVladimir Barinov 124*95a7f10eSVladimir Barinov static inline void davinci_i2c_write_reg(struct davinci_i2c_dev *i2c_dev, 125*95a7f10eSVladimir Barinov int reg, u16 val) 126*95a7f10eSVladimir Barinov { 127*95a7f10eSVladimir Barinov __raw_writew(val, i2c_dev->base + reg); 128*95a7f10eSVladimir Barinov } 129*95a7f10eSVladimir Barinov 130*95a7f10eSVladimir Barinov static inline u16 davinci_i2c_read_reg(struct davinci_i2c_dev *i2c_dev, int reg) 131*95a7f10eSVladimir Barinov { 132*95a7f10eSVladimir Barinov return __raw_readw(i2c_dev->base + reg); 133*95a7f10eSVladimir Barinov } 134*95a7f10eSVladimir Barinov 135*95a7f10eSVladimir Barinov /* 136*95a7f10eSVladimir Barinov * This functions configures I2C and brings I2C out of reset. 137*95a7f10eSVladimir Barinov * This function is called during I2C init function. This function 138*95a7f10eSVladimir Barinov * also gets called if I2C encounters any errors. 139*95a7f10eSVladimir Barinov */ 140*95a7f10eSVladimir Barinov static int i2c_davinci_init(struct davinci_i2c_dev *dev) 141*95a7f10eSVladimir Barinov { 142*95a7f10eSVladimir Barinov struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; 143*95a7f10eSVladimir Barinov u16 psc; 144*95a7f10eSVladimir Barinov u32 clk; 145*95a7f10eSVladimir Barinov u32 clkh; 146*95a7f10eSVladimir Barinov u32 clkl; 147*95a7f10eSVladimir Barinov u32 input_clock = clk_get_rate(dev->clk); 148*95a7f10eSVladimir Barinov u16 w; 149*95a7f10eSVladimir Barinov 150*95a7f10eSVladimir Barinov if (!pdata) 151*95a7f10eSVladimir Barinov pdata = &davinci_i2c_platform_data_default; 152*95a7f10eSVladimir Barinov 153*95a7f10eSVladimir Barinov /* put I2C into reset */ 154*95a7f10eSVladimir Barinov w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); 155*95a7f10eSVladimir Barinov MOD_REG_BIT(w, DAVINCI_I2C_MDR_IRS, 0); 156*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); 157*95a7f10eSVladimir Barinov 158*95a7f10eSVladimir Barinov /* NOTE: I2C Clock divider programming info 159*95a7f10eSVladimir Barinov * As per I2C specs the following formulas provide prescaler 160*95a7f10eSVladimir Barinov * and low/high divider values 161*95a7f10eSVladimir Barinov * input clk --> PSC Div -----------> ICCL/H Div --> output clock 162*95a7f10eSVladimir Barinov * module clk 163*95a7f10eSVladimir Barinov * 164*95a7f10eSVladimir Barinov * output clk = module clk / (PSC + 1) [ (ICCL + d) + (ICCH + d) ] 165*95a7f10eSVladimir Barinov * 166*95a7f10eSVladimir Barinov * Thus, 167*95a7f10eSVladimir Barinov * (ICCL + ICCH) = clk = (input clk / ((psc +1) * output clk)) - 2d; 168*95a7f10eSVladimir Barinov * 169*95a7f10eSVladimir Barinov * where if PSC == 0, d = 7, 170*95a7f10eSVladimir Barinov * if PSC == 1, d = 6 171*95a7f10eSVladimir Barinov * if PSC > 1 , d = 5 172*95a7f10eSVladimir Barinov */ 173*95a7f10eSVladimir Barinov 174*95a7f10eSVladimir Barinov psc = 26; /* To get 1MHz clock */ 175*95a7f10eSVladimir Barinov 176*95a7f10eSVladimir Barinov clk = ((input_clock / (psc + 1)) / (pdata->bus_freq * 1000)) - 10; 177*95a7f10eSVladimir Barinov clkh = (50 * clk) / 100; 178*95a7f10eSVladimir Barinov clkl = clk - clkh; 179*95a7f10eSVladimir Barinov 180*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_PSC_REG, psc); 181*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKH_REG, clkh); 182*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKL_REG, clkl); 183*95a7f10eSVladimir Barinov 184*95a7f10eSVladimir Barinov dev_dbg(dev->dev, "CLK = %d\n", clk); 185*95a7f10eSVladimir Barinov dev_dbg(dev->dev, "PSC = %d\n", 186*95a7f10eSVladimir Barinov davinci_i2c_read_reg(dev, DAVINCI_I2C_PSC_REG)); 187*95a7f10eSVladimir Barinov dev_dbg(dev->dev, "CLKL = %d\n", 188*95a7f10eSVladimir Barinov davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKL_REG)); 189*95a7f10eSVladimir Barinov dev_dbg(dev->dev, "CLKH = %d\n", 190*95a7f10eSVladimir Barinov davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKH_REG)); 191*95a7f10eSVladimir Barinov 192*95a7f10eSVladimir Barinov /* Take the I2C module out of reset: */ 193*95a7f10eSVladimir Barinov w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); 194*95a7f10eSVladimir Barinov MOD_REG_BIT(w, DAVINCI_I2C_MDR_IRS, 1); 195*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); 196*95a7f10eSVladimir Barinov 197*95a7f10eSVladimir Barinov /* Enable interrupts */ 198*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, I2C_DAVINCI_INTR_ALL); 199*95a7f10eSVladimir Barinov 200*95a7f10eSVladimir Barinov return 0; 201*95a7f10eSVladimir Barinov } 202*95a7f10eSVladimir Barinov 203*95a7f10eSVladimir Barinov /* 204*95a7f10eSVladimir Barinov * Waiting for bus not busy 205*95a7f10eSVladimir Barinov */ 206*95a7f10eSVladimir Barinov static int i2c_davinci_wait_bus_not_busy(struct davinci_i2c_dev *dev, 207*95a7f10eSVladimir Barinov char allow_sleep) 208*95a7f10eSVladimir Barinov { 209*95a7f10eSVladimir Barinov unsigned long timeout; 210*95a7f10eSVladimir Barinov 211*95a7f10eSVladimir Barinov timeout = jiffies + DAVINCI_I2C_TIMEOUT; 212*95a7f10eSVladimir Barinov while (davinci_i2c_read_reg(dev, DAVINCI_I2C_STR_REG) 213*95a7f10eSVladimir Barinov & DAVINCI_I2C_STR_BB) { 214*95a7f10eSVladimir Barinov if (time_after(jiffies, timeout)) { 215*95a7f10eSVladimir Barinov dev_warn(dev->dev, 216*95a7f10eSVladimir Barinov "timeout waiting for bus ready\n"); 217*95a7f10eSVladimir Barinov return -ETIMEDOUT; 218*95a7f10eSVladimir Barinov } 219*95a7f10eSVladimir Barinov if (allow_sleep) 220*95a7f10eSVladimir Barinov schedule_timeout(1); 221*95a7f10eSVladimir Barinov } 222*95a7f10eSVladimir Barinov 223*95a7f10eSVladimir Barinov return 0; 224*95a7f10eSVladimir Barinov } 225*95a7f10eSVladimir Barinov 226*95a7f10eSVladimir Barinov /* 227*95a7f10eSVladimir Barinov * Low level master read/write transaction. This function is called 228*95a7f10eSVladimir Barinov * from i2c_davinci_xfer. 229*95a7f10eSVladimir Barinov */ 230*95a7f10eSVladimir Barinov static int 231*95a7f10eSVladimir Barinov i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop) 232*95a7f10eSVladimir Barinov { 233*95a7f10eSVladimir Barinov struct davinci_i2c_dev *dev = i2c_get_adapdata(adap); 234*95a7f10eSVladimir Barinov struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; 235*95a7f10eSVladimir Barinov u32 flag; 236*95a7f10eSVladimir Barinov u32 stat; 237*95a7f10eSVladimir Barinov u16 w; 238*95a7f10eSVladimir Barinov int r; 239*95a7f10eSVladimir Barinov 240*95a7f10eSVladimir Barinov if (msg->len == 0) 241*95a7f10eSVladimir Barinov return -EINVAL; 242*95a7f10eSVladimir Barinov 243*95a7f10eSVladimir Barinov if (!pdata) 244*95a7f10eSVladimir Barinov pdata = &davinci_i2c_platform_data_default; 245*95a7f10eSVladimir Barinov /* Introduce a delay, required for some boards (e.g Davinci EVM) */ 246*95a7f10eSVladimir Barinov if (pdata->bus_delay) 247*95a7f10eSVladimir Barinov udelay(pdata->bus_delay); 248*95a7f10eSVladimir Barinov 249*95a7f10eSVladimir Barinov /* set the slave address */ 250*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_SAR_REG, msg->addr); 251*95a7f10eSVladimir Barinov 252*95a7f10eSVladimir Barinov dev->buf = msg->buf; 253*95a7f10eSVladimir Barinov dev->buf_len = msg->len; 254*95a7f10eSVladimir Barinov 255*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_CNT_REG, dev->buf_len); 256*95a7f10eSVladimir Barinov 257*95a7f10eSVladimir Barinov init_completion(&dev->cmd_complete); 258*95a7f10eSVladimir Barinov dev->cmd_err = 0; 259*95a7f10eSVladimir Barinov 260*95a7f10eSVladimir Barinov /* Clear any pending interrupts by reading the IVR */ 261*95a7f10eSVladimir Barinov stat = davinci_i2c_read_reg(dev, DAVINCI_I2C_IVR_REG); 262*95a7f10eSVladimir Barinov 263*95a7f10eSVladimir Barinov /* Take I2C out of reset, configure it as master and set the 264*95a7f10eSVladimir Barinov * start bit */ 265*95a7f10eSVladimir Barinov flag = DAVINCI_I2C_MDR_IRS | DAVINCI_I2C_MDR_MST | DAVINCI_I2C_MDR_STT; 266*95a7f10eSVladimir Barinov 267*95a7f10eSVladimir Barinov /* if the slave address is ten bit address, enable XA bit */ 268*95a7f10eSVladimir Barinov if (msg->flags & I2C_M_TEN) 269*95a7f10eSVladimir Barinov flag |= DAVINCI_I2C_MDR_XA; 270*95a7f10eSVladimir Barinov if (!(msg->flags & I2C_M_RD)) 271*95a7f10eSVladimir Barinov flag |= DAVINCI_I2C_MDR_TRX; 272*95a7f10eSVladimir Barinov if (stop) 273*95a7f10eSVladimir Barinov flag |= DAVINCI_I2C_MDR_STP; 274*95a7f10eSVladimir Barinov 275*95a7f10eSVladimir Barinov /* Enable receive or transmit interrupts */ 276*95a7f10eSVladimir Barinov w = davinci_i2c_read_reg(dev, DAVINCI_I2C_IMR_REG); 277*95a7f10eSVladimir Barinov if (msg->flags & I2C_M_RD) 278*95a7f10eSVladimir Barinov MOD_REG_BIT(w, DAVINCI_I2C_IMR_RRDY, 1); 279*95a7f10eSVladimir Barinov else 280*95a7f10eSVladimir Barinov MOD_REG_BIT(w, DAVINCI_I2C_IMR_XRDY, 1); 281*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, w); 282*95a7f10eSVladimir Barinov 283*95a7f10eSVladimir Barinov /* write the data into mode register */ 284*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); 285*95a7f10eSVladimir Barinov 286*95a7f10eSVladimir Barinov r = wait_for_completion_interruptible_timeout(&dev->cmd_complete, 287*95a7f10eSVladimir Barinov DAVINCI_I2C_TIMEOUT); 288*95a7f10eSVladimir Barinov dev->buf_len = 0; 289*95a7f10eSVladimir Barinov if (r < 0) 290*95a7f10eSVladimir Barinov return r; 291*95a7f10eSVladimir Barinov 292*95a7f10eSVladimir Barinov if (r == 0) { 293*95a7f10eSVladimir Barinov dev_err(dev->dev, "controller timed out\n"); 294*95a7f10eSVladimir Barinov i2c_davinci_init(dev); 295*95a7f10eSVladimir Barinov return -ETIMEDOUT; 296*95a7f10eSVladimir Barinov } 297*95a7f10eSVladimir Barinov 298*95a7f10eSVladimir Barinov /* no error */ 299*95a7f10eSVladimir Barinov if (likely(!dev->cmd_err)) 300*95a7f10eSVladimir Barinov return msg->len; 301*95a7f10eSVladimir Barinov 302*95a7f10eSVladimir Barinov /* We have an error */ 303*95a7f10eSVladimir Barinov if (dev->cmd_err & DAVINCI_I2C_STR_AL) { 304*95a7f10eSVladimir Barinov i2c_davinci_init(dev); 305*95a7f10eSVladimir Barinov return -EIO; 306*95a7f10eSVladimir Barinov } 307*95a7f10eSVladimir Barinov 308*95a7f10eSVladimir Barinov if (dev->cmd_err & DAVINCI_I2C_STR_NACK) { 309*95a7f10eSVladimir Barinov if (msg->flags & I2C_M_IGNORE_NAK) 310*95a7f10eSVladimir Barinov return msg->len; 311*95a7f10eSVladimir Barinov if (stop) { 312*95a7f10eSVladimir Barinov w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); 313*95a7f10eSVladimir Barinov MOD_REG_BIT(w, DAVINCI_I2C_MDR_STP, 1); 314*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); 315*95a7f10eSVladimir Barinov } 316*95a7f10eSVladimir Barinov return -EREMOTEIO; 317*95a7f10eSVladimir Barinov } 318*95a7f10eSVladimir Barinov return -EIO; 319*95a7f10eSVladimir Barinov } 320*95a7f10eSVladimir Barinov 321*95a7f10eSVladimir Barinov /* 322*95a7f10eSVladimir Barinov * Prepare controller for a transaction and call i2c_davinci_xfer_msg 323*95a7f10eSVladimir Barinov */ 324*95a7f10eSVladimir Barinov static int 325*95a7f10eSVladimir Barinov i2c_davinci_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) 326*95a7f10eSVladimir Barinov { 327*95a7f10eSVladimir Barinov struct davinci_i2c_dev *dev = i2c_get_adapdata(adap); 328*95a7f10eSVladimir Barinov int i; 329*95a7f10eSVladimir Barinov int ret; 330*95a7f10eSVladimir Barinov 331*95a7f10eSVladimir Barinov dev_dbg(dev->dev, "%s: msgs: %d\n", __FUNCTION__, num); 332*95a7f10eSVladimir Barinov 333*95a7f10eSVladimir Barinov ret = i2c_davinci_wait_bus_not_busy(dev, 1); 334*95a7f10eSVladimir Barinov if (ret < 0) { 335*95a7f10eSVladimir Barinov dev_warn(dev->dev, "timeout waiting for bus ready\n"); 336*95a7f10eSVladimir Barinov return ret; 337*95a7f10eSVladimir Barinov } 338*95a7f10eSVladimir Barinov 339*95a7f10eSVladimir Barinov for (i = 0; i < num; i++) { 340*95a7f10eSVladimir Barinov ret = i2c_davinci_xfer_msg(adap, &msgs[i], (i == (num - 1))); 341*95a7f10eSVladimir Barinov if (ret < 0) 342*95a7f10eSVladimir Barinov return ret; 343*95a7f10eSVladimir Barinov } 344*95a7f10eSVladimir Barinov 345*95a7f10eSVladimir Barinov dev_dbg(dev->dev, "%s:%d ret: %d\n", __FUNCTION__, __LINE__, ret); 346*95a7f10eSVladimir Barinov 347*95a7f10eSVladimir Barinov return num; 348*95a7f10eSVladimir Barinov } 349*95a7f10eSVladimir Barinov 350*95a7f10eSVladimir Barinov static u32 i2c_davinci_func(struct i2c_adapter *adap) 351*95a7f10eSVladimir Barinov { 352*95a7f10eSVladimir Barinov return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK); 353*95a7f10eSVladimir Barinov } 354*95a7f10eSVladimir Barinov 355*95a7f10eSVladimir Barinov /* 356*95a7f10eSVladimir Barinov * Interrupt service routine. This gets called whenever an I2C interrupt 357*95a7f10eSVladimir Barinov * occurs. 358*95a7f10eSVladimir Barinov */ 359*95a7f10eSVladimir Barinov static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) 360*95a7f10eSVladimir Barinov { 361*95a7f10eSVladimir Barinov struct davinci_i2c_dev *dev = dev_id; 362*95a7f10eSVladimir Barinov u32 stat; 363*95a7f10eSVladimir Barinov int count = 0; 364*95a7f10eSVladimir Barinov u16 w; 365*95a7f10eSVladimir Barinov 366*95a7f10eSVladimir Barinov while ((stat = davinci_i2c_read_reg(dev, DAVINCI_I2C_IVR_REG))) { 367*95a7f10eSVladimir Barinov dev_dbg(dev->dev, "%s: stat=0x%x\n", __FUNCTION__, stat); 368*95a7f10eSVladimir Barinov if (count++ == 100) { 369*95a7f10eSVladimir Barinov dev_warn(dev->dev, "Too much work in one IRQ\n"); 370*95a7f10eSVladimir Barinov break; 371*95a7f10eSVladimir Barinov } 372*95a7f10eSVladimir Barinov 373*95a7f10eSVladimir Barinov switch (stat) { 374*95a7f10eSVladimir Barinov case DAVINCI_I2C_IVR_AL: 375*95a7f10eSVladimir Barinov dev->cmd_err |= DAVINCI_I2C_STR_AL; 376*95a7f10eSVladimir Barinov complete(&dev->cmd_complete); 377*95a7f10eSVladimir Barinov break; 378*95a7f10eSVladimir Barinov 379*95a7f10eSVladimir Barinov case DAVINCI_I2C_IVR_NACK: 380*95a7f10eSVladimir Barinov dev->cmd_err |= DAVINCI_I2C_STR_NACK; 381*95a7f10eSVladimir Barinov complete(&dev->cmd_complete); 382*95a7f10eSVladimir Barinov break; 383*95a7f10eSVladimir Barinov 384*95a7f10eSVladimir Barinov case DAVINCI_I2C_IVR_ARDY: 385*95a7f10eSVladimir Barinov w = davinci_i2c_read_reg(dev, DAVINCI_I2C_STR_REG); 386*95a7f10eSVladimir Barinov MOD_REG_BIT(w, DAVINCI_I2C_STR_ARDY, 1); 387*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_STR_REG, w); 388*95a7f10eSVladimir Barinov complete(&dev->cmd_complete); 389*95a7f10eSVladimir Barinov break; 390*95a7f10eSVladimir Barinov 391*95a7f10eSVladimir Barinov case DAVINCI_I2C_IVR_RDR: 392*95a7f10eSVladimir Barinov if (dev->buf_len) { 393*95a7f10eSVladimir Barinov *dev->buf++ = 394*95a7f10eSVladimir Barinov davinci_i2c_read_reg(dev, 395*95a7f10eSVladimir Barinov DAVINCI_I2C_DRR_REG); 396*95a7f10eSVladimir Barinov dev->buf_len--; 397*95a7f10eSVladimir Barinov if (dev->buf_len) 398*95a7f10eSVladimir Barinov continue; 399*95a7f10eSVladimir Barinov 400*95a7f10eSVladimir Barinov w = davinci_i2c_read_reg(dev, 401*95a7f10eSVladimir Barinov DAVINCI_I2C_STR_REG); 402*95a7f10eSVladimir Barinov MOD_REG_BIT(w, DAVINCI_I2C_IMR_RRDY, 0); 403*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, 404*95a7f10eSVladimir Barinov DAVINCI_I2C_STR_REG, 405*95a7f10eSVladimir Barinov w); 406*95a7f10eSVladimir Barinov } else 407*95a7f10eSVladimir Barinov dev_err(dev->dev, "RDR IRQ while no" 408*95a7f10eSVladimir Barinov "data requested\n"); 409*95a7f10eSVladimir Barinov break; 410*95a7f10eSVladimir Barinov 411*95a7f10eSVladimir Barinov case DAVINCI_I2C_IVR_XRDY: 412*95a7f10eSVladimir Barinov if (dev->buf_len) { 413*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_DXR_REG, 414*95a7f10eSVladimir Barinov *dev->buf++); 415*95a7f10eSVladimir Barinov dev->buf_len--; 416*95a7f10eSVladimir Barinov if (dev->buf_len) 417*95a7f10eSVladimir Barinov continue; 418*95a7f10eSVladimir Barinov 419*95a7f10eSVladimir Barinov w = davinci_i2c_read_reg(dev, 420*95a7f10eSVladimir Barinov DAVINCI_I2C_IMR_REG); 421*95a7f10eSVladimir Barinov MOD_REG_BIT(w, DAVINCI_I2C_IMR_XRDY, 0); 422*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, 423*95a7f10eSVladimir Barinov DAVINCI_I2C_IMR_REG, 424*95a7f10eSVladimir Barinov w); 425*95a7f10eSVladimir Barinov } else 426*95a7f10eSVladimir Barinov dev_err(dev->dev, "TDR IRQ while no data to" 427*95a7f10eSVladimir Barinov "send\n"); 428*95a7f10eSVladimir Barinov break; 429*95a7f10eSVladimir Barinov 430*95a7f10eSVladimir Barinov case DAVINCI_I2C_IVR_SCD: 431*95a7f10eSVladimir Barinov w = davinci_i2c_read_reg(dev, DAVINCI_I2C_STR_REG); 432*95a7f10eSVladimir Barinov MOD_REG_BIT(w, DAVINCI_I2C_STR_SCD, 1); 433*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_STR_REG, w); 434*95a7f10eSVladimir Barinov complete(&dev->cmd_complete); 435*95a7f10eSVladimir Barinov break; 436*95a7f10eSVladimir Barinov 437*95a7f10eSVladimir Barinov case DAVINCI_I2C_IVR_AAS: 438*95a7f10eSVladimir Barinov dev_warn(dev->dev, "Address as slave interrupt\n"); 439*95a7f10eSVladimir Barinov }/* switch */ 440*95a7f10eSVladimir Barinov }/* while */ 441*95a7f10eSVladimir Barinov 442*95a7f10eSVladimir Barinov return count ? IRQ_HANDLED : IRQ_NONE; 443*95a7f10eSVladimir Barinov } 444*95a7f10eSVladimir Barinov 445*95a7f10eSVladimir Barinov static struct i2c_algorithm i2c_davinci_algo = { 446*95a7f10eSVladimir Barinov .master_xfer = i2c_davinci_xfer, 447*95a7f10eSVladimir Barinov .functionality = i2c_davinci_func, 448*95a7f10eSVladimir Barinov }; 449*95a7f10eSVladimir Barinov 450*95a7f10eSVladimir Barinov static int davinci_i2c_probe(struct platform_device *pdev) 451*95a7f10eSVladimir Barinov { 452*95a7f10eSVladimir Barinov struct davinci_i2c_dev *dev; 453*95a7f10eSVladimir Barinov struct i2c_adapter *adap; 454*95a7f10eSVladimir Barinov struct resource *mem, *irq, *ioarea; 455*95a7f10eSVladimir Barinov int r; 456*95a7f10eSVladimir Barinov 457*95a7f10eSVladimir Barinov /* NOTE: driver uses the static register mapping */ 458*95a7f10eSVladimir Barinov mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 459*95a7f10eSVladimir Barinov if (!mem) { 460*95a7f10eSVladimir Barinov dev_err(&pdev->dev, "no mem resource?\n"); 461*95a7f10eSVladimir Barinov return -ENODEV; 462*95a7f10eSVladimir Barinov } 463*95a7f10eSVladimir Barinov 464*95a7f10eSVladimir Barinov irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 465*95a7f10eSVladimir Barinov if (!irq) { 466*95a7f10eSVladimir Barinov dev_err(&pdev->dev, "no irq resource?\n"); 467*95a7f10eSVladimir Barinov return -ENODEV; 468*95a7f10eSVladimir Barinov } 469*95a7f10eSVladimir Barinov 470*95a7f10eSVladimir Barinov ioarea = request_mem_region(mem->start, (mem->end - mem->start) + 1, 471*95a7f10eSVladimir Barinov pdev->name); 472*95a7f10eSVladimir Barinov if (!ioarea) { 473*95a7f10eSVladimir Barinov dev_err(&pdev->dev, "I2C region already claimed\n"); 474*95a7f10eSVladimir Barinov return -EBUSY; 475*95a7f10eSVladimir Barinov } 476*95a7f10eSVladimir Barinov 477*95a7f10eSVladimir Barinov dev = kzalloc(sizeof(struct davinci_i2c_dev), GFP_KERNEL); 478*95a7f10eSVladimir Barinov if (!dev) { 479*95a7f10eSVladimir Barinov r = -ENOMEM; 480*95a7f10eSVladimir Barinov goto err_release_region; 481*95a7f10eSVladimir Barinov } 482*95a7f10eSVladimir Barinov 483*95a7f10eSVladimir Barinov dev->dev = get_device(&pdev->dev); 484*95a7f10eSVladimir Barinov dev->irq = irq->start; 485*95a7f10eSVladimir Barinov platform_set_drvdata(pdev, dev); 486*95a7f10eSVladimir Barinov 487*95a7f10eSVladimir Barinov dev->clk = clk_get(&pdev->dev, "I2CCLK"); 488*95a7f10eSVladimir Barinov if (IS_ERR(dev->clk)) { 489*95a7f10eSVladimir Barinov r = -ENODEV; 490*95a7f10eSVladimir Barinov goto err_free_mem; 491*95a7f10eSVladimir Barinov } 492*95a7f10eSVladimir Barinov clk_enable(dev->clk); 493*95a7f10eSVladimir Barinov 494*95a7f10eSVladimir Barinov dev->base = (void __iomem *)IO_ADDRESS(mem->start); 495*95a7f10eSVladimir Barinov i2c_davinci_init(dev); 496*95a7f10eSVladimir Barinov 497*95a7f10eSVladimir Barinov r = request_irq(dev->irq, i2c_davinci_isr, 0, pdev->name, dev); 498*95a7f10eSVladimir Barinov if (r) { 499*95a7f10eSVladimir Barinov dev_err(&pdev->dev, "failure requesting irq %i\n", dev->irq); 500*95a7f10eSVladimir Barinov goto err_unuse_clocks; 501*95a7f10eSVladimir Barinov } 502*95a7f10eSVladimir Barinov 503*95a7f10eSVladimir Barinov adap = &dev->adapter; 504*95a7f10eSVladimir Barinov i2c_set_adapdata(adap, dev); 505*95a7f10eSVladimir Barinov adap->owner = THIS_MODULE; 506*95a7f10eSVladimir Barinov adap->class = I2C_CLASS_HWMON; 507*95a7f10eSVladimir Barinov strlcpy(adap->name, "DaVinci I2C adapter", sizeof(adap->name)); 508*95a7f10eSVladimir Barinov adap->algo = &i2c_davinci_algo; 509*95a7f10eSVladimir Barinov adap->dev.parent = &pdev->dev; 510*95a7f10eSVladimir Barinov 511*95a7f10eSVladimir Barinov /* FIXME */ 512*95a7f10eSVladimir Barinov adap->timeout = 1; 513*95a7f10eSVladimir Barinov adap->retries = 1; 514*95a7f10eSVladimir Barinov 515*95a7f10eSVladimir Barinov adap->nr = pdev->id; 516*95a7f10eSVladimir Barinov r = i2c_add_numbered_adapter(adap); 517*95a7f10eSVladimir Barinov if (r) { 518*95a7f10eSVladimir Barinov dev_err(&pdev->dev, "failure adding adapter\n"); 519*95a7f10eSVladimir Barinov goto err_free_irq; 520*95a7f10eSVladimir Barinov } 521*95a7f10eSVladimir Barinov 522*95a7f10eSVladimir Barinov return 0; 523*95a7f10eSVladimir Barinov 524*95a7f10eSVladimir Barinov err_free_irq: 525*95a7f10eSVladimir Barinov free_irq(dev->irq, dev); 526*95a7f10eSVladimir Barinov err_unuse_clocks: 527*95a7f10eSVladimir Barinov clk_disable(dev->clk); 528*95a7f10eSVladimir Barinov clk_put(dev->clk); 529*95a7f10eSVladimir Barinov dev->clk = NULL; 530*95a7f10eSVladimir Barinov err_free_mem: 531*95a7f10eSVladimir Barinov platform_set_drvdata(pdev, NULL); 532*95a7f10eSVladimir Barinov put_device(&pdev->dev); 533*95a7f10eSVladimir Barinov kfree(dev); 534*95a7f10eSVladimir Barinov err_release_region: 535*95a7f10eSVladimir Barinov release_mem_region(mem->start, (mem->end - mem->start) + 1); 536*95a7f10eSVladimir Barinov 537*95a7f10eSVladimir Barinov return r; 538*95a7f10eSVladimir Barinov } 539*95a7f10eSVladimir Barinov 540*95a7f10eSVladimir Barinov static int davinci_i2c_remove(struct platform_device *pdev) 541*95a7f10eSVladimir Barinov { 542*95a7f10eSVladimir Barinov struct davinci_i2c_dev *dev = platform_get_drvdata(pdev); 543*95a7f10eSVladimir Barinov struct resource *mem; 544*95a7f10eSVladimir Barinov 545*95a7f10eSVladimir Barinov platform_set_drvdata(pdev, NULL); 546*95a7f10eSVladimir Barinov i2c_del_adapter(&dev->adapter); 547*95a7f10eSVladimir Barinov put_device(&pdev->dev); 548*95a7f10eSVladimir Barinov 549*95a7f10eSVladimir Barinov clk_disable(dev->clk); 550*95a7f10eSVladimir Barinov clk_put(dev->clk); 551*95a7f10eSVladimir Barinov dev->clk = NULL; 552*95a7f10eSVladimir Barinov 553*95a7f10eSVladimir Barinov davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, 0); 554*95a7f10eSVladimir Barinov free_irq(IRQ_I2C, dev); 555*95a7f10eSVladimir Barinov kfree(dev); 556*95a7f10eSVladimir Barinov 557*95a7f10eSVladimir Barinov mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 558*95a7f10eSVladimir Barinov release_mem_region(mem->start, (mem->end - mem->start) + 1); 559*95a7f10eSVladimir Barinov return 0; 560*95a7f10eSVladimir Barinov } 561*95a7f10eSVladimir Barinov 562*95a7f10eSVladimir Barinov static struct platform_driver davinci_i2c_driver = { 563*95a7f10eSVladimir Barinov .probe = davinci_i2c_probe, 564*95a7f10eSVladimir Barinov .remove = davinci_i2c_remove, 565*95a7f10eSVladimir Barinov .driver = { 566*95a7f10eSVladimir Barinov .name = "i2c_davinci", 567*95a7f10eSVladimir Barinov .owner = THIS_MODULE, 568*95a7f10eSVladimir Barinov }, 569*95a7f10eSVladimir Barinov }; 570*95a7f10eSVladimir Barinov 571*95a7f10eSVladimir Barinov /* I2C may be needed to bring up other drivers */ 572*95a7f10eSVladimir Barinov static int __init davinci_i2c_init_driver(void) 573*95a7f10eSVladimir Barinov { 574*95a7f10eSVladimir Barinov return platform_driver_register(&davinci_i2c_driver); 575*95a7f10eSVladimir Barinov } 576*95a7f10eSVladimir Barinov subsys_initcall(davinci_i2c_init_driver); 577*95a7f10eSVladimir Barinov 578*95a7f10eSVladimir Barinov static void __exit davinci_i2c_exit_driver(void) 579*95a7f10eSVladimir Barinov { 580*95a7f10eSVladimir Barinov platform_driver_unregister(&davinci_i2c_driver); 581*95a7f10eSVladimir Barinov } 582*95a7f10eSVladimir Barinov module_exit(davinci_i2c_exit_driver); 583*95a7f10eSVladimir Barinov 584*95a7f10eSVladimir Barinov MODULE_AUTHOR("Texas Instruments India"); 585*95a7f10eSVladimir Barinov MODULE_DESCRIPTION("TI DaVinci I2C bus adapter"); 586*95a7f10eSVladimir Barinov MODULE_LICENSE("GPL"); 587