Path: blob/master/drivers/i2c/busses/i2c-intel-mid.c
15111 views
/*1* Support for Moorestown/Medfield I2C chip2*3* Copyright (c) 2009 Intel Corporation.4* Copyright (c) 2009 Synopsys. Inc.5*6* This program is free software; you can redistribute it and/or modify it7* under the terms and conditions of the GNU General Public License, version8* 2, as published by the Free Software Foundation.9*10* This program is distributed in the hope it will be useful, but WITHOUT ANY11* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS12* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more13* details.14*15* You should have received a copy of the GNU General Public License along16* with this program; if not, write to the Free Software Foundation, Inc., 5117* Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.18*19*/2021#include <linux/module.h>22#include <linux/kernel.h>23#include <linux/err.h>24#include <linux/slab.h>25#include <linux/stat.h>26#include <linux/delay.h>27#include <linux/i2c.h>28#include <linux/init.h>29#include <linux/pci.h>30#include <linux/interrupt.h>31#include <linux/pm_runtime.h>32#include <linux/io.h>3334#define DRIVER_NAME "i2c-intel-mid"35#define VERSION "Version 0.5ac2"36#define PLATFORM "Moorestown/Medfield"3738/* Tables use: 0 Moorestown, 1 Medfield */39#define NUM_PLATFORMS 240enum platform_enum {41MOORESTOWN = 0,42MEDFIELD = 1,43};4445enum mid_i2c_status {46STATUS_IDLE = 0,47STATUS_READ_START,48STATUS_READ_IN_PROGRESS,49STATUS_READ_SUCCESS,50STATUS_WRITE_START,51STATUS_WRITE_SUCCESS,52STATUS_XFER_ABORT,53STATUS_STANDBY54};5556/**57* struct intel_mid_i2c_private - per device I²C context58* @adap: core i2c layer adapter information59* @dev: device reference for power management60* @base: register base61* @speed: speed mode for this port62* @complete: completion object for transaction wait63* @abort: reason for last abort64* @rx_buf: pointer into working receive buffer65* @rx_buf_len: receive buffer length66* @status: adapter state machine67* @msg: the message we are currently processing68* @platform: the MID device type we are part of69* @lock: transaction serialization70*71* We allocate one of these per device we discover, it holds the core72* i2c layer objects and the data we need to track privately.73*/74struct intel_mid_i2c_private {75struct i2c_adapter adap;76struct device *dev;77void __iomem *base;78int speed;79struct completion complete;80int abort;81u8 *rx_buf;82int rx_buf_len;83enum mid_i2c_status status;84struct i2c_msg *msg;85enum platform_enum platform;86struct mutex lock;87};8889#define NUM_SPEEDS 39091#define ACTIVE 092#define STANDBY 1939495/* Control register */96#define IC_CON 0x0097#define SLV_DIS (1 << 6) /* Disable slave mode */98#define RESTART (1 << 5) /* Send a Restart condition */99#define ADDR_10BIT (1 << 4) /* 10-bit addressing */100#define STANDARD_MODE (1 << 1) /* standard mode */101#define FAST_MODE (2 << 1) /* fast mode */102#define HIGH_MODE (3 << 1) /* high speed mode */103#define MASTER_EN (1 << 0) /* Master mode */104105/* Target address register */106#define IC_TAR 0x04107#define IC_TAR_10BIT_ADDR (1 << 12) /* 10-bit addressing */108#define IC_TAR_SPECIAL (1 << 11) /* Perform special I2C cmd */109#define IC_TAR_GC_OR_START (1 << 10) /* 0: Gerneral Call Address */110/* 1: START BYTE */111/* Slave Address Register */112#define IC_SAR 0x08 /* Not used in Master mode */113114/* High Speed Master Mode Code Address Register */115#define IC_HS_MADDR 0x0c116117/* Rx/Tx Data Buffer and Command Register */118#define IC_DATA_CMD 0x10119#define IC_RD (1 << 8) /* 1: Read 0: Write */120121/* Standard Speed Clock SCL High Count Register */122#define IC_SS_SCL_HCNT 0x14123124/* Standard Speed Clock SCL Low Count Register */125#define IC_SS_SCL_LCNT 0x18126127/* Fast Speed Clock SCL High Count Register */128#define IC_FS_SCL_HCNT 0x1c129130/* Fast Spedd Clock SCL Low Count Register */131#define IC_FS_SCL_LCNT 0x20132133/* High Speed Clock SCL High Count Register */134#define IC_HS_SCL_HCNT 0x24135136/* High Speed Clock SCL Low Count Register */137#define IC_HS_SCL_LCNT 0x28138139/* Interrupt Status Register */140#define IC_INTR_STAT 0x2c /* Read only */141#define R_GEN_CALL (1 << 11)142#define R_START_DET (1 << 10)143#define R_STOP_DET (1 << 9)144#define R_ACTIVITY (1 << 8)145#define R_RX_DONE (1 << 7)146#define R_TX_ABRT (1 << 6)147#define R_RD_REQ (1 << 5)148#define R_TX_EMPTY (1 << 4)149#define R_TX_OVER (1 << 3)150#define R_RX_FULL (1 << 2)151#define R_RX_OVER (1 << 1)152#define R_RX_UNDER (1 << 0)153154/* Interrupt Mask Register */155#define IC_INTR_MASK 0x30 /* Read and Write */156#define M_GEN_CALL (1 << 11)157#define M_START_DET (1 << 10)158#define M_STOP_DET (1 << 9)159#define M_ACTIVITY (1 << 8)160#define M_RX_DONE (1 << 7)161#define M_TX_ABRT (1 << 6)162#define M_RD_REQ (1 << 5)163#define M_TX_EMPTY (1 << 4)164#define M_TX_OVER (1 << 3)165#define M_RX_FULL (1 << 2)166#define M_RX_OVER (1 << 1)167#define M_RX_UNDER (1 << 0)168169/* Raw Interrupt Status Register */170#define IC_RAW_INTR_STAT 0x34 /* Read Only */171#define GEN_CALL (1 << 11) /* General call */172#define START_DET (1 << 10) /* (RE)START occurred */173#define STOP_DET (1 << 9) /* STOP occurred */174#define ACTIVITY (1 << 8) /* Bus busy */175#define RX_DONE (1 << 7) /* Not used in Master mode */176#define TX_ABRT (1 << 6) /* Transmit Abort */177#define RD_REQ (1 << 5) /* Not used in Master mode */178#define TX_EMPTY (1 << 4) /* TX FIFO <= threshold */179#define TX_OVER (1 << 3) /* TX FIFO overflow */180#define RX_FULL (1 << 2) /* RX FIFO >= threshold */181#define RX_OVER (1 << 1) /* RX FIFO overflow */182#define RX_UNDER (1 << 0) /* RX FIFO empty */183184/* Receive FIFO Threshold Register */185#define IC_RX_TL 0x38186187/* Transmit FIFO Treshold Register */188#define IC_TX_TL 0x3c189190/* Clear Combined and Individual Interrupt Register */191#define IC_CLR_INTR 0x40192#define CLR_INTR (1 << 0)193194/* Clear RX_UNDER Interrupt Register */195#define IC_CLR_RX_UNDER 0x44196#define CLR_RX_UNDER (1 << 0)197198/* Clear RX_OVER Interrupt Register */199#define IC_CLR_RX_OVER 0x48200#define CLR_RX_OVER (1 << 0)201202/* Clear TX_OVER Interrupt Register */203#define IC_CLR_TX_OVER 0x4c204#define CLR_TX_OVER (1 << 0)205206#define IC_CLR_RD_REQ 0x50207208/* Clear TX_ABRT Interrupt Register */209#define IC_CLR_TX_ABRT 0x54210#define CLR_TX_ABRT (1 << 0)211#define IC_CLR_RX_DONE 0x58212213/* Clear ACTIVITY Interrupt Register */214#define IC_CLR_ACTIVITY 0x5c215#define CLR_ACTIVITY (1 << 0)216217/* Clear STOP_DET Interrupt Register */218#define IC_CLR_STOP_DET 0x60219#define CLR_STOP_DET (1 << 0)220221/* Clear START_DET Interrupt Register */222#define IC_CLR_START_DET 0x64223#define CLR_START_DET (1 << 0)224225/* Clear GEN_CALL Interrupt Register */226#define IC_CLR_GEN_CALL 0x68227#define CLR_GEN_CALL (1 << 0)228229/* Enable Register */230#define IC_ENABLE 0x6c231#define ENABLE (1 << 0)232233/* Status Register */234#define IC_STATUS 0x70 /* Read Only */235#define STAT_SLV_ACTIVITY (1 << 6) /* Slave not in idle */236#define STAT_MST_ACTIVITY (1 << 5) /* Master not in idle */237#define STAT_RFF (1 << 4) /* RX FIFO Full */238#define STAT_RFNE (1 << 3) /* RX FIFO Not Empty */239#define STAT_TFE (1 << 2) /* TX FIFO Empty */240#define STAT_TFNF (1 << 1) /* TX FIFO Not Full */241#define STAT_ACTIVITY (1 << 0) /* Activity Status */242243/* Transmit FIFO Level Register */244#define IC_TXFLR 0x74 /* Read Only */245#define TXFLR (1 << 0) /* TX FIFO level */246247/* Receive FIFO Level Register */248#define IC_RXFLR 0x78 /* Read Only */249#define RXFLR (1 << 0) /* RX FIFO level */250251/* Transmit Abort Source Register */252#define IC_TX_ABRT_SOURCE 0x80253#define ABRT_SLVRD_INTX (1 << 15)254#define ABRT_SLV_ARBLOST (1 << 14)255#define ABRT_SLVFLUSH_TXFIFO (1 << 13)256#define ARB_LOST (1 << 12)257#define ABRT_MASTER_DIS (1 << 11)258#define ABRT_10B_RD_NORSTRT (1 << 10)259#define ABRT_SBYTE_NORSTRT (1 << 9)260#define ABRT_HS_NORSTRT (1 << 8)261#define ABRT_SBYTE_ACKDET (1 << 7)262#define ABRT_HS_ACKDET (1 << 6)263#define ABRT_GCALL_READ (1 << 5)264#define ABRT_GCALL_NOACK (1 << 4)265#define ABRT_TXDATA_NOACK (1 << 3)266#define ABRT_10ADDR2_NOACK (1 << 2)267#define ABRT_10ADDR1_NOACK (1 << 1)268#define ABRT_7B_ADDR_NOACK (1 << 0)269270/* Enable Status Register */271#define IC_ENABLE_STATUS 0x9c272#define IC_EN (1 << 0) /* I2C in an enabled state */273274/* Component Parameter Register 1*/275#define IC_COMP_PARAM_1 0xf4276#define APB_DATA_WIDTH (0x3 << 0)277278/* added by xiaolin --begin */279#define SS_MIN_SCL_HIGH 4000280#define SS_MIN_SCL_LOW 4700281#define FS_MIN_SCL_HIGH 600282#define FS_MIN_SCL_LOW 1300283#define HS_MIN_SCL_HIGH_100PF 60284#define HS_MIN_SCL_LOW_100PF 120285286#define STANDARD 0287#define FAST 1288#define HIGH 2289290#define NUM_SPEEDS 3291292static int speed_mode[6] = {293FAST,294FAST,295FAST,296STANDARD,297FAST,298FAST299};300301static int ctl_num = 6;302module_param_array(speed_mode, int, &ctl_num, S_IRUGO);303MODULE_PARM_DESC(speed_mode, "Set the speed of the i2c interface (0-2)");304305/**306* intel_mid_i2c_disable - Disable I2C controller307* @adap: struct pointer to i2c_adapter308*309* Return Value:310* 0 success311* -EBUSY if device is busy312* -ETIMEDOUT if i2c cannot be disabled within the given time313*314* I2C bus state should be checked prior to disabling the hardware. If bus is315* not in idle state, an errno is returned. Write "0" to IC_ENABLE to disable316* I2C controller.317*/318static int intel_mid_i2c_disable(struct i2c_adapter *adap)319{320struct intel_mid_i2c_private *i2c = i2c_get_adapdata(adap);321int err = 0;322int count = 0;323int ret1, ret2;324static const u16 delay[NUM_SPEEDS] = {100, 25, 3};325326/* Set IC_ENABLE to 0 */327writel(0, i2c->base + IC_ENABLE);328329/* Check if device is busy */330dev_dbg(&adap->dev, "mrst i2c disable\n");331while ((ret1 = readl(i2c->base + IC_ENABLE_STATUS) & 0x1)332|| (ret2 = readl(i2c->base + IC_STATUS) & 0x1)) {333udelay(delay[i2c->speed]);334writel(0, i2c->base + IC_ENABLE);335dev_dbg(&adap->dev, "i2c is busy, count is %d speed %d\n",336count, i2c->speed);337if (count++ > 10) {338err = -ETIMEDOUT;339break;340}341}342343/* Clear all interrupts */344readl(i2c->base + IC_CLR_INTR);345readl(i2c->base + IC_CLR_STOP_DET);346readl(i2c->base + IC_CLR_START_DET);347readl(i2c->base + IC_CLR_ACTIVITY);348readl(i2c->base + IC_CLR_TX_ABRT);349readl(i2c->base + IC_CLR_RX_OVER);350readl(i2c->base + IC_CLR_RX_UNDER);351readl(i2c->base + IC_CLR_TX_OVER);352readl(i2c->base + IC_CLR_RX_DONE);353readl(i2c->base + IC_CLR_GEN_CALL);354355/* Disable all interupts */356writel(0x0000, i2c->base + IC_INTR_MASK);357358return err;359}360361/**362* intel_mid_i2c_hwinit - Initialize the I2C hardware registers363* @dev: pci device struct pointer364*365* This function will be called in intel_mid_i2c_probe() before device366* registration.367*368* Return Values:369* 0 success370* -EBUSY i2c cannot be disabled371* -ETIMEDOUT i2c cannot be disabled372* -EFAULT If APB data width is not 32-bit wide373*374* I2C should be disabled prior to other register operation. If failed, an375* errno is returned. Mask and Clear all interrpts, this should be done at376* first. Set common registers which will not be modified during normal377* transfers, including: control register, FIFO threshold and clock freq.378* Check APB data width at last.379*/380static int intel_mid_i2c_hwinit(struct intel_mid_i2c_private *i2c)381{382int err;383384static const u16 hcnt[NUM_PLATFORMS][NUM_SPEEDS] = {385{ 0x75, 0x15, 0x07 },386{ 0x04c, 0x10, 0x06 }387};388static const u16 lcnt[NUM_PLATFORMS][NUM_SPEEDS] = {389{ 0x7C, 0x21, 0x0E },390{ 0x053, 0x19, 0x0F }391};392393/* Disable i2c first */394err = intel_mid_i2c_disable(&i2c->adap);395if (err)396return err;397398/*399* Setup clock frequency and speed mode400* Enable restart condition,401* enable master FSM, disable slave FSM,402* use target address when initiating transfer403*/404405writel((i2c->speed + 1) << 1 | SLV_DIS | RESTART | MASTER_EN,406i2c->base + IC_CON);407writel(hcnt[i2c->platform][i2c->speed],408i2c->base + (IC_SS_SCL_HCNT + (i2c->speed << 3)));409writel(lcnt[i2c->platform][i2c->speed],410i2c->base + (IC_SS_SCL_LCNT + (i2c->speed << 3)));411412/* Set tranmit & receive FIFO threshold to zero */413writel(0x0, i2c->base + IC_RX_TL);414writel(0x0, i2c->base + IC_TX_TL);415416return 0;417}418419/**420* intel_mid_i2c_func - Return the supported three I2C operations.421* @adapter: i2c_adapter struct pointer422*/423static u32 intel_mid_i2c_func(struct i2c_adapter *adapter)424{425return I2C_FUNC_I2C | I2C_FUNC_10BIT_ADDR | I2C_FUNC_SMBUS_EMUL;426}427428/**429* intel_mid_i2c_address_neq - To check if the addresses for different i2c messages430* are equal.431* @p1: first i2c_msg432* @p2: second i2c_msg433*434* Return Values:435* 0 if addresses are equal436* 1 if not equal437*438* Within a single transfer, the I2C client may need to send its address more439* than once. So a check if the addresses match is needed.440*/441static inline bool intel_mid_i2c_address_neq(const struct i2c_msg *p1,442const struct i2c_msg *p2)443{444if (p1->addr != p2->addr)445return 1;446if ((p1->flags ^ p2->flags) & I2C_M_TEN)447return 1;448return 0;449}450451/**452* intel_mid_i2c_abort - To handle transfer abortions and print error messages.453* @adap: i2c_adapter struct pointer454*455* By reading register IC_TX_ABRT_SOURCE, various transfer errors can be456* distingushed. At present, no circumstances have been found out that457* multiple errors would be occurred simutaneously, so we simply use the458* register value directly.459*460* At last the error bits are cleared. (Note clear ABRT_SBYTE_NORSTRT bit need461* a few extra steps)462*/463static void intel_mid_i2c_abort(struct intel_mid_i2c_private *i2c)464{465/* Read about source register */466int abort = i2c->abort;467struct i2c_adapter *adap = &i2c->adap;468469/* Single transfer error check:470* According to databook, TX/RX FIFOs would be flushed when471* the abort interrupt occurred.472*/473if (abort & ABRT_MASTER_DIS)474dev_err(&adap->dev,475"initiate master operation with master mode disabled.\n");476if (abort & ABRT_10B_RD_NORSTRT)477dev_err(&adap->dev,478"RESTART disabled and master sent READ cmd in 10-bit addressing.\n");479480if (abort & ABRT_SBYTE_NORSTRT) {481dev_err(&adap->dev,482"RESTART disabled and user is trying to send START byte.\n");483writel(~ABRT_SBYTE_NORSTRT, i2c->base + IC_TX_ABRT_SOURCE);484writel(RESTART, i2c->base + IC_CON);485writel(~IC_TAR_SPECIAL, i2c->base + IC_TAR);486}487488if (abort & ABRT_SBYTE_ACKDET)489dev_err(&adap->dev,490"START byte was not acknowledged.\n");491if (abort & ABRT_TXDATA_NOACK)492dev_dbg(&adap->dev,493"No acknowledgement received from slave.\n");494if (abort & ABRT_10ADDR2_NOACK)495dev_dbg(&adap->dev,496"The 2nd address byte of the 10-bit address was not acknowledged.\n");497if (abort & ABRT_10ADDR1_NOACK)498dev_dbg(&adap->dev,499"The 1st address byte of 10-bit address was not acknowledged.\n");500if (abort & ABRT_7B_ADDR_NOACK)501dev_dbg(&adap->dev,502"I2C slave device not acknowledged.\n");503504/* Clear TX_ABRT bit */505readl(i2c->base + IC_CLR_TX_ABRT);506i2c->status = STATUS_XFER_ABORT;507}508509/**510* xfer_read - Internal function to implement master read transfer.511* @adap: i2c_adapter struct pointer512* @buf: buffer in i2c_msg513* @length: number of bytes to be read514*515* Return Values:516* 0 if the read transfer succeeds517* -ETIMEDOUT if cannot read the "raw" interrupt register518* -EINVAL if a transfer abort occurred519*520* For every byte, a "READ" command will be loaded into IC_DATA_CMD prior to521* data transfer. The actual "read" operation will be performed if an RX_FULL522* interrupt occurred.523*524* Note there may be two interrupt signals captured, one should read525* IC_RAW_INTR_STAT to separate between errors and actual data.526*/527static int xfer_read(struct i2c_adapter *adap, unsigned char *buf, int length)528{529struct intel_mid_i2c_private *i2c = i2c_get_adapdata(adap);530int i = length;531int err;532533if (length >= 256) {534dev_err(&adap->dev,535"I2C FIFO cannot support larger than 256 bytes\n");536return -EMSGSIZE;537}538539INIT_COMPLETION(i2c->complete);540541readl(i2c->base + IC_CLR_INTR);542writel(0x0044, i2c->base + IC_INTR_MASK);543544i2c->status = STATUS_READ_START;545546while (i--)547writel(IC_RD, i2c->base + IC_DATA_CMD);548549i2c->status = STATUS_READ_START;550err = wait_for_completion_interruptible_timeout(&i2c->complete, HZ);551if (!err) {552dev_err(&adap->dev, "Timeout for ACK from I2C slave device\n");553intel_mid_i2c_hwinit(i2c);554return -ETIMEDOUT;555}556if (i2c->status == STATUS_READ_SUCCESS)557return 0;558else559return -EIO;560}561562/**563* xfer_write - Internal function to implement master write transfer.564* @adap: i2c_adapter struct pointer565* @buf: buffer in i2c_msg566* @length: number of bytes to be read567*568* Return Values:569* 0 if the read transfer succeeds570* -ETIMEDOUT if we cannot read the "raw" interrupt register571* -EINVAL if a transfer abort occurred572*573* For every byte, a "WRITE" command will be loaded into IC_DATA_CMD prior to574* data transfer. The actual "write" operation will be performed when the575* RX_FULL interrupt signal occurs.576*577* Note there may be two interrupt signals captured, one should read578* IC_RAW_INTR_STAT to separate between errors and actual data.579*/580static int xfer_write(struct i2c_adapter *adap,581unsigned char *buf, int length)582{583struct intel_mid_i2c_private *i2c = i2c_get_adapdata(adap);584int i, err;585586if (length >= 256) {587dev_err(&adap->dev,588"I2C FIFO cannot support larger than 256 bytes\n");589return -EMSGSIZE;590}591592INIT_COMPLETION(i2c->complete);593594readl(i2c->base + IC_CLR_INTR);595writel(0x0050, i2c->base + IC_INTR_MASK);596597i2c->status = STATUS_WRITE_START;598for (i = 0; i < length; i++)599writel((u16)(*(buf + i)), i2c->base + IC_DATA_CMD);600601i2c->status = STATUS_WRITE_START;602err = wait_for_completion_interruptible_timeout(&i2c->complete, HZ);603if (!err) {604dev_err(&adap->dev, "Timeout for ACK from I2C slave device\n");605intel_mid_i2c_hwinit(i2c);606return -ETIMEDOUT;607} else {608if (i2c->status == STATUS_WRITE_SUCCESS)609return 0;610else611return -EIO;612}613}614615static int intel_mid_i2c_setup(struct i2c_adapter *adap, struct i2c_msg *pmsg)616{617struct intel_mid_i2c_private *i2c = i2c_get_adapdata(adap);618int err;619u32 reg;620u32 bit_mask;621u32 mode;622623/* Disable device first */624err = intel_mid_i2c_disable(adap);625if (err) {626dev_err(&adap->dev,627"Cannot disable i2c controller, timeout\n");628return err;629}630631mode = (1 + i2c->speed) << 1;632/* set the speed mode */633reg = readl(i2c->base + IC_CON);634if ((reg & 0x06) != mode) {635dev_dbg(&adap->dev, "set mode %d\n", i2c->speed);636writel((reg & ~0x6) | mode, i2c->base + IC_CON);637}638639reg = readl(i2c->base + IC_CON);640/* use 7-bit addressing */641if (pmsg->flags & I2C_M_TEN) {642if ((reg & ADDR_10BIT) != ADDR_10BIT) {643dev_dbg(&adap->dev, "set i2c 10 bit address mode\n");644writel(reg | ADDR_10BIT, i2c->base + IC_CON);645}646} else {647if ((reg & ADDR_10BIT) != 0x0) {648dev_dbg(&adap->dev, "set i2c 7 bit address mode\n");649writel(reg & ~ADDR_10BIT, i2c->base + IC_CON);650}651}652/* enable restart conditions */653reg = readl(i2c->base + IC_CON);654if ((reg & RESTART) != RESTART) {655dev_dbg(&adap->dev, "enable restart conditions\n");656writel(reg | RESTART, i2c->base + IC_CON);657}658659/* enable master FSM */660reg = readl(i2c->base + IC_CON);661dev_dbg(&adap->dev, "ic_con reg is 0x%x\n", reg);662writel(reg | MASTER_EN, i2c->base + IC_CON);663if ((reg & SLV_DIS) != SLV_DIS) {664dev_dbg(&adap->dev, "enable master FSM\n");665writel(reg | SLV_DIS, i2c->base + IC_CON);666dev_dbg(&adap->dev, "ic_con reg is 0x%x\n", reg);667}668669/* use target address when initiating transfer */670reg = readl(i2c->base + IC_TAR);671bit_mask = IC_TAR_SPECIAL | IC_TAR_GC_OR_START;672673if ((reg & bit_mask) != 0x0) {674dev_dbg(&adap->dev,675"WR: use target address when intiating transfer, i2c_tx_target\n");676writel(reg & ~bit_mask, i2c->base + IC_TAR);677}678679/* set target address to the I2C slave address */680dev_dbg(&adap->dev,681"set target address to the I2C slave address, addr is %x\n",682pmsg->addr);683writel(pmsg->addr | (pmsg->flags & I2C_M_TEN ? IC_TAR_10BIT_ADDR : 0),684i2c->base + IC_TAR);685686/* Enable I2C controller */687writel(ENABLE, i2c->base + IC_ENABLE);688689return 0;690}691692/**693* intel_mid_i2c_xfer - Main master transfer routine.694* @adap: i2c_adapter struct pointer695* @pmsg: i2c_msg struct pointer696* @num: number of i2c_msg697*698* Return Values:699* + number of messages transferred700* -ETIMEDOUT If cannot disable I2C controller or read IC_STATUS701* -EINVAL If the address in i2c_msg is invalid702*703* This function will be registered in i2c-core and exposed to external704* I2C clients.705* 1. Disable I2C controller706* 2. Unmask three interrupts: RX_FULL, TX_EMPTY, TX_ABRT707* 3. Check if address in i2c_msg is valid708* 4. Enable I2C controller709* 5. Perform real transfer (call xfer_read or xfer_write)710* 6. Wait until the current transfer is finished (check bus state)711* 7. Mask and clear all interrupts712*/713static int intel_mid_i2c_xfer(struct i2c_adapter *adap,714struct i2c_msg *pmsg,715int num)716{717struct intel_mid_i2c_private *i2c = i2c_get_adapdata(adap);718int i, err = 0;719720/* if number of messages equal 0*/721if (num == 0)722return 0;723724pm_runtime_get(i2c->dev);725726mutex_lock(&i2c->lock);727dev_dbg(&adap->dev, "intel_mid_i2c_xfer, process %d msg(s)\n", num);728dev_dbg(&adap->dev, "slave address is %x\n", pmsg->addr);729730731if (i2c->status != STATUS_IDLE) {732dev_err(&adap->dev, "Adapter %d in transfer/standby\n",733adap->nr);734mutex_unlock(&i2c->lock);735pm_runtime_put(i2c->dev);736return -1;737}738739740for (i = 1; i < num; i++) {741/* Message address equal? */742if (unlikely(intel_mid_i2c_address_neq(&pmsg[0], &pmsg[i]))) {743dev_err(&adap->dev, "Invalid address in msg[%d]\n", i);744mutex_unlock(&i2c->lock);745pm_runtime_put(i2c->dev);746return -EINVAL;747}748}749750if (intel_mid_i2c_setup(adap, pmsg)) {751mutex_unlock(&i2c->lock);752pm_runtime_put(i2c->dev);753return -EINVAL;754}755756for (i = 0; i < num; i++) {757i2c->msg = pmsg;758i2c->status = STATUS_IDLE;759/* Read or Write */760if (pmsg->flags & I2C_M_RD) {761dev_dbg(&adap->dev, "I2C_M_RD\n");762err = xfer_read(adap, pmsg->buf, pmsg->len);763} else {764dev_dbg(&adap->dev, "I2C_M_WR\n");765err = xfer_write(adap, pmsg->buf, pmsg->len);766}767if (err < 0)768break;769dev_dbg(&adap->dev, "msg[%d] transfer complete\n", i);770pmsg++; /* next message */771}772773/* Mask interrupts */774writel(0x0000, i2c->base + IC_INTR_MASK);775/* Clear all interrupts */776readl(i2c->base + IC_CLR_INTR);777778i2c->status = STATUS_IDLE;779mutex_unlock(&i2c->lock);780pm_runtime_put(i2c->dev);781782return err;783}784785static int intel_mid_i2c_runtime_suspend(struct device *dev)786{787struct pci_dev *pdev = to_pci_dev(dev);788struct intel_mid_i2c_private *i2c = pci_get_drvdata(pdev);789struct i2c_adapter *adap = to_i2c_adapter(dev);790int err;791792if (i2c->status != STATUS_IDLE)793return -1;794795intel_mid_i2c_disable(adap);796797err = pci_save_state(pdev);798if (err) {799dev_err(dev, "pci_save_state failed\n");800return err;801}802803err = pci_set_power_state(pdev, PCI_D3hot);804if (err) {805dev_err(dev, "pci_set_power_state failed\n");806return err;807}808i2c->status = STATUS_STANDBY;809810return 0;811}812813static int intel_mid_i2c_runtime_resume(struct device *dev)814{815struct pci_dev *pdev = to_pci_dev(dev);816struct intel_mid_i2c_private *i2c = pci_get_drvdata(pdev);817int err;818819if (i2c->status != STATUS_STANDBY)820return 0;821822pci_set_power_state(pdev, PCI_D0);823pci_restore_state(pdev);824err = pci_enable_device(pdev);825if (err) {826dev_err(dev, "pci_enable_device failed\n");827return err;828}829830i2c->status = STATUS_IDLE;831832intel_mid_i2c_hwinit(i2c);833return err;834}835836static void i2c_isr_read(struct intel_mid_i2c_private *i2c)837{838struct i2c_msg *msg = i2c->msg;839int rx_num;840u32 len;841u8 *buf;842843if (!(msg->flags & I2C_M_RD))844return;845846if (i2c->status != STATUS_READ_IN_PROGRESS) {847len = msg->len;848buf = msg->buf;849} else {850len = i2c->rx_buf_len;851buf = i2c->rx_buf;852}853854rx_num = readl(i2c->base + IC_RXFLR);855856for (; len > 0 && rx_num > 0; len--, rx_num--)857*buf++ = readl(i2c->base + IC_DATA_CMD);858859if (len > 0) {860i2c->status = STATUS_READ_IN_PROGRESS;861i2c->rx_buf_len = len;862i2c->rx_buf = buf;863} else864i2c->status = STATUS_READ_SUCCESS;865866return;867}868869static irqreturn_t intel_mid_i2c_isr(int this_irq, void *dev)870{871struct intel_mid_i2c_private *i2c = dev;872u32 stat = readl(i2c->base + IC_INTR_STAT);873874if (!stat)875return IRQ_NONE;876877dev_dbg(&i2c->adap.dev, "%s, stat = 0x%x\n", __func__, stat);878stat &= 0x54;879880if (i2c->status != STATUS_WRITE_START &&881i2c->status != STATUS_READ_START &&882i2c->status != STATUS_READ_IN_PROGRESS)883goto err;884885if (stat & TX_ABRT)886i2c->abort = readl(i2c->base + IC_TX_ABRT_SOURCE);887888readl(i2c->base + IC_CLR_INTR);889890if (stat & TX_ABRT) {891intel_mid_i2c_abort(i2c);892goto exit;893}894895if (stat & RX_FULL) {896i2c_isr_read(i2c);897goto exit;898}899900if (stat & TX_EMPTY) {901if (readl(i2c->base + IC_STATUS) & 0x4)902i2c->status = STATUS_WRITE_SUCCESS;903}904905exit:906if (i2c->status == STATUS_READ_SUCCESS ||907i2c->status == STATUS_WRITE_SUCCESS ||908i2c->status == STATUS_XFER_ABORT) {909/* Clear all interrupts */910readl(i2c->base + IC_CLR_INTR);911/* Mask interrupts */912writel(0, i2c->base + IC_INTR_MASK);913complete(&i2c->complete);914}915err:916return IRQ_HANDLED;917}918919static struct i2c_algorithm intel_mid_i2c_algorithm = {920.master_xfer = intel_mid_i2c_xfer,921.functionality = intel_mid_i2c_func,922};923924925static const struct dev_pm_ops intel_mid_i2c_pm_ops = {926.runtime_suspend = intel_mid_i2c_runtime_suspend,927.runtime_resume = intel_mid_i2c_runtime_resume,928};929930/**931* intel_mid_i2c_probe - I2C controller initialization routine932* @dev: pci device933* @id: device id934*935* Return Values:936* 0 success937* -ENODEV If cannot allocate pci resource938* -ENOMEM If the register base remapping failed, or939* if kzalloc failed940*941* Initialization steps:942* 1. Request for PCI resource943* 2. Remap the start address of PCI resource to register base944* 3. Request for device memory region945* 4. Fill in the struct members of intel_mid_i2c_private946* 5. Call intel_mid_i2c_hwinit() for hardware initialization947* 6. Register I2C adapter in i2c-core948*/949static int __devinit intel_mid_i2c_probe(struct pci_dev *dev,950const struct pci_device_id *id)951{952struct intel_mid_i2c_private *mrst;953unsigned long start, len;954int err, busnum;955void __iomem *base = NULL;956957dev_dbg(&dev->dev, "Get into probe function for I2C\n");958err = pci_enable_device(dev);959if (err) {960dev_err(&dev->dev, "Failed to enable I2C PCI device (%d)\n",961err);962goto exit;963}964965/* Determine the address of the I2C area */966start = pci_resource_start(dev, 0);967len = pci_resource_len(dev, 0);968if (!start || len == 0) {969dev_err(&dev->dev, "base address not set\n");970err = -ENODEV;971goto exit;972}973dev_dbg(&dev->dev, "%s i2c resource start 0x%lx, len=%ld\n",974PLATFORM, start, len);975976err = pci_request_region(dev, 0, DRIVER_NAME);977if (err) {978dev_err(&dev->dev, "failed to request I2C region "979"0x%lx-0x%lx\n", start,980(unsigned long)pci_resource_end(dev, 0));981goto exit;982}983984base = ioremap_nocache(start, len);985if (!base) {986dev_err(&dev->dev, "I/O memory remapping failed\n");987err = -ENOMEM;988goto fail0;989}990991/* Allocate the per-device data structure, intel_mid_i2c_private */992mrst = kzalloc(sizeof(struct intel_mid_i2c_private), GFP_KERNEL);993if (mrst == NULL) {994dev_err(&dev->dev, "can't allocate interface\n");995err = -ENOMEM;996goto fail1;997}998999/* Initialize struct members */1000snprintf(mrst->adap.name, sizeof(mrst->adap.name),1001"Intel MID I2C at %lx", start);1002mrst->adap.owner = THIS_MODULE;1003mrst->adap.algo = &intel_mid_i2c_algorithm;1004mrst->adap.dev.parent = &dev->dev;1005mrst->dev = &dev->dev;1006mrst->base = base;1007mrst->speed = STANDARD;1008mrst->abort = 0;1009mrst->rx_buf_len = 0;1010mrst->status = STATUS_IDLE;10111012pci_set_drvdata(dev, mrst);1013i2c_set_adapdata(&mrst->adap, mrst);10141015mrst->adap.nr = busnum = id->driver_data;1016if (dev->device <= 0x0804)1017mrst->platform = MOORESTOWN;1018else1019mrst->platform = MEDFIELD;10201021dev_dbg(&dev->dev, "I2C%d\n", busnum);10221023if (ctl_num > busnum) {1024if (speed_mode[busnum] < 0 || speed_mode[busnum] >= NUM_SPEEDS)1025dev_warn(&dev->dev, "invalid speed %d ignored.\n",1026speed_mode[busnum]);1027else1028mrst->speed = speed_mode[busnum];1029}10301031/* Initialize i2c controller */1032err = intel_mid_i2c_hwinit(mrst);1033if (err < 0) {1034dev_err(&dev->dev, "I2C interface initialization failed\n");1035goto fail2;1036}10371038mutex_init(&mrst->lock);1039init_completion(&mrst->complete);10401041/* Clear all interrupts */1042readl(mrst->base + IC_CLR_INTR);1043writel(0x0000, mrst->base + IC_INTR_MASK);10441045err = request_irq(dev->irq, intel_mid_i2c_isr, IRQF_SHARED,1046mrst->adap.name, mrst);1047if (err) {1048dev_err(&dev->dev, "Failed to request IRQ for I2C controller: "1049"%s", mrst->adap.name);1050goto fail2;1051}10521053/* Adapter registration */1054err = i2c_add_numbered_adapter(&mrst->adap);1055if (err) {1056dev_err(&dev->dev, "Adapter %s registration failed\n",1057mrst->adap.name);1058goto fail3;1059}10601061dev_dbg(&dev->dev, "%s I2C bus %d driver bind success.\n",1062(mrst->platform == MOORESTOWN) ? "Moorestown" : "Medfield",1063busnum);10641065pm_runtime_enable(&dev->dev);1066return 0;10671068fail3:1069free_irq(dev->irq, mrst);1070fail2:1071pci_set_drvdata(dev, NULL);1072kfree(mrst);1073fail1:1074iounmap(base);1075fail0:1076pci_release_region(dev, 0);1077exit:1078return err;1079}10801081static void __devexit intel_mid_i2c_remove(struct pci_dev *dev)1082{1083struct intel_mid_i2c_private *mrst = pci_get_drvdata(dev);1084intel_mid_i2c_disable(&mrst->adap);1085if (i2c_del_adapter(&mrst->adap))1086dev_err(&dev->dev, "Failed to delete i2c adapter");10871088free_irq(dev->irq, mrst);1089pci_set_drvdata(dev, NULL);1090iounmap(mrst->base);1091kfree(mrst);1092pci_release_region(dev, 0);1093}10941095static struct pci_device_id intel_mid_i2c_ids[] = {1096/* Moorestown */1097{ PCI_VDEVICE(INTEL, 0x0802), 0 },1098{ PCI_VDEVICE(INTEL, 0x0803), 1 },1099{ PCI_VDEVICE(INTEL, 0x0804), 2 },1100/* Medfield */1101{ PCI_VDEVICE(INTEL, 0x0817), 3,},1102{ PCI_VDEVICE(INTEL, 0x0818), 4 },1103{ PCI_VDEVICE(INTEL, 0x0819), 5 },1104{ PCI_VDEVICE(INTEL, 0x082C), 0 },1105{ PCI_VDEVICE(INTEL, 0x082D), 1 },1106{ PCI_VDEVICE(INTEL, 0x082E), 2 },1107{ 0,}1108};1109MODULE_DEVICE_TABLE(pci, intel_mid_i2c_ids);11101111static struct pci_driver intel_mid_i2c_driver = {1112.name = DRIVER_NAME,1113.id_table = intel_mid_i2c_ids,1114.probe = intel_mid_i2c_probe,1115.remove = __devexit_p(intel_mid_i2c_remove),1116};11171118static int __init intel_mid_i2c_init(void)1119{1120return pci_register_driver(&intel_mid_i2c_driver);1121}11221123static void __exit intel_mid_i2c_exit(void)1124{1125pci_unregister_driver(&intel_mid_i2c_driver);1126}11271128module_init(intel_mid_i2c_init);1129module_exit(intel_mid_i2c_exit);11301131MODULE_AUTHOR("Ba Zheng <[email protected]>");1132MODULE_DESCRIPTION("I2C driver for Moorestown Platform");1133MODULE_LICENSE("GPL");1134MODULE_VERSION(VERSION);113511361137