linux/drivers/i2c/busses/i2c-bcm-iproc.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2014 Broadcom Corporation
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public License as
   6 * published by the Free Software Foundation version 2.
   7 *
   8 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
   9 * kind, whether express or implied; without even the implied warranty
  10 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 * GNU General Public License for more details.
  12 */
  13
  14#include <linux/delay.h>
  15#include <linux/i2c.h>
  16#include <linux/interrupt.h>
  17#include <linux/io.h>
  18#include <linux/kernel.h>
  19#include <linux/module.h>
  20#include <linux/of_device.h>
  21#include <linux/platform_device.h>
  22#include <linux/slab.h>
  23
  24#define IDM_CTRL_DIRECT_OFFSET       0x00
  25#define CFG_OFFSET                   0x00
  26#define CFG_RESET_SHIFT              31
  27#define CFG_EN_SHIFT                 30
  28#define CFG_SLAVE_ADDR_0_SHIFT       28
  29#define CFG_M_RETRY_CNT_SHIFT        16
  30#define CFG_M_RETRY_CNT_MASK         0x0f
  31
  32#define TIM_CFG_OFFSET               0x04
  33#define TIM_CFG_MODE_400_SHIFT       31
  34#define TIM_RAND_SLAVE_STRETCH_SHIFT      24
  35#define TIM_RAND_SLAVE_STRETCH_MASK       0x7f
  36#define TIM_PERIODIC_SLAVE_STRETCH_SHIFT  16
  37#define TIM_PERIODIC_SLAVE_STRETCH_MASK   0x7f
  38
  39#define S_CFG_SMBUS_ADDR_OFFSET           0x08
  40#define S_CFG_EN_NIC_SMB_ADDR3_SHIFT      31
  41#define S_CFG_NIC_SMB_ADDR3_SHIFT         24
  42#define S_CFG_NIC_SMB_ADDR3_MASK          0x7f
  43#define S_CFG_EN_NIC_SMB_ADDR2_SHIFT      23
  44#define S_CFG_NIC_SMB_ADDR2_SHIFT         16
  45#define S_CFG_NIC_SMB_ADDR2_MASK          0x7f
  46#define S_CFG_EN_NIC_SMB_ADDR1_SHIFT      15
  47#define S_CFG_NIC_SMB_ADDR1_SHIFT         8
  48#define S_CFG_NIC_SMB_ADDR1_MASK          0x7f
  49#define S_CFG_EN_NIC_SMB_ADDR0_SHIFT      7
  50#define S_CFG_NIC_SMB_ADDR0_SHIFT         0
  51#define S_CFG_NIC_SMB_ADDR0_MASK          0x7f
  52
  53#define M_FIFO_CTRL_OFFSET           0x0c
  54#define M_FIFO_RX_FLUSH_SHIFT        31
  55#define M_FIFO_TX_FLUSH_SHIFT        30
  56#define M_FIFO_RX_CNT_SHIFT          16
  57#define M_FIFO_RX_CNT_MASK           0x7f
  58#define M_FIFO_RX_THLD_SHIFT         8
  59#define M_FIFO_RX_THLD_MASK          0x3f
  60
  61#define S_FIFO_CTRL_OFFSET           0x10
  62#define S_FIFO_RX_FLUSH_SHIFT        31
  63#define S_FIFO_TX_FLUSH_SHIFT        30
  64#define S_FIFO_RX_CNT_SHIFT          16
  65#define S_FIFO_RX_CNT_MASK           0x7f
  66#define S_FIFO_RX_THLD_SHIFT         8
  67#define S_FIFO_RX_THLD_MASK          0x3f
  68
  69#define M_CMD_OFFSET                 0x30
  70#define M_CMD_START_BUSY_SHIFT       31
  71#define M_CMD_STATUS_SHIFT           25
  72#define M_CMD_STATUS_MASK            0x07
  73#define M_CMD_STATUS_SUCCESS         0x0
  74#define M_CMD_STATUS_LOST_ARB        0x1
  75#define M_CMD_STATUS_NACK_ADDR       0x2
  76#define M_CMD_STATUS_NACK_DATA       0x3
  77#define M_CMD_STATUS_TIMEOUT         0x4
  78#define M_CMD_STATUS_FIFO_UNDERRUN   0x5
  79#define M_CMD_STATUS_RX_FIFO_FULL    0x6
  80#define M_CMD_PROTOCOL_SHIFT         9
  81#define M_CMD_PROTOCOL_MASK          0xf
  82#define M_CMD_PROTOCOL_QUICK         0x0
  83#define M_CMD_PROTOCOL_BLK_WR        0x7
  84#define M_CMD_PROTOCOL_BLK_RD        0x8
  85#define M_CMD_PROTOCOL_PROCESS       0xa
  86#define M_CMD_PEC_SHIFT              8
  87#define M_CMD_RD_CNT_SHIFT           0
  88#define M_CMD_RD_CNT_MASK            0xff
  89
  90#define S_CMD_OFFSET                 0x34
  91#define S_CMD_START_BUSY_SHIFT       31
  92#define S_CMD_STATUS_SHIFT           23
  93#define S_CMD_STATUS_MASK            0x07
  94#define S_CMD_STATUS_SUCCESS         0x0
  95#define S_CMD_STATUS_TIMEOUT         0x5
  96
  97#define IE_OFFSET                    0x38
  98#define IE_M_RX_FIFO_FULL_SHIFT      31
  99#define IE_M_RX_THLD_SHIFT           30
 100#define IE_M_START_BUSY_SHIFT        28
 101#define IE_M_TX_UNDERRUN_SHIFT       27
 102#define IE_S_RX_FIFO_FULL_SHIFT      26
 103#define IE_S_RX_THLD_SHIFT           25
 104#define IE_S_RX_EVENT_SHIFT          24
 105#define IE_S_START_BUSY_SHIFT        23
 106#define IE_S_TX_UNDERRUN_SHIFT       22
 107#define IE_S_RD_EVENT_SHIFT          21
 108
 109#define IS_OFFSET                    0x3c
 110#define IS_M_RX_FIFO_FULL_SHIFT      31
 111#define IS_M_RX_THLD_SHIFT           30
 112#define IS_M_START_BUSY_SHIFT        28
 113#define IS_M_TX_UNDERRUN_SHIFT       27
 114#define IS_S_RX_FIFO_FULL_SHIFT      26
 115#define IS_S_RX_THLD_SHIFT           25
 116#define IS_S_RX_EVENT_SHIFT          24
 117#define IS_S_START_BUSY_SHIFT        23
 118#define IS_S_TX_UNDERRUN_SHIFT       22
 119#define IS_S_RD_EVENT_SHIFT          21
 120
 121#define M_TX_OFFSET                  0x40
 122#define M_TX_WR_STATUS_SHIFT         31
 123#define M_TX_DATA_SHIFT              0
 124#define M_TX_DATA_MASK               0xff
 125
 126#define M_RX_OFFSET                  0x44
 127#define M_RX_STATUS_SHIFT            30
 128#define M_RX_STATUS_MASK             0x03
 129#define M_RX_PEC_ERR_SHIFT           29
 130#define M_RX_DATA_SHIFT              0
 131#define M_RX_DATA_MASK               0xff
 132
 133#define S_TX_OFFSET                  0x48
 134#define S_TX_WR_STATUS_SHIFT         31
 135#define S_TX_DATA_SHIFT              0
 136#define S_TX_DATA_MASK               0xff
 137
 138#define S_RX_OFFSET                  0x4c
 139#define S_RX_STATUS_SHIFT            30
 140#define S_RX_STATUS_MASK             0x03
 141#define S_RX_PEC_ERR_SHIFT           29
 142#define S_RX_DATA_SHIFT              0
 143#define S_RX_DATA_MASK               0xff
 144
 145#define I2C_TIMEOUT_MSEC             50000
 146#define M_TX_RX_FIFO_SIZE            64
 147#define M_RX_FIFO_MAX_THLD_VALUE     (M_TX_RX_FIFO_SIZE - 1)
 148
 149#define M_RX_MAX_READ_LEN            255
 150#define M_RX_FIFO_THLD_VALUE         50
 151
 152#define IE_M_ALL_INTERRUPT_SHIFT     27
 153#define IE_M_ALL_INTERRUPT_MASK      0x1e
 154
 155#define SLAVE_READ_WRITE_BIT_MASK    0x1
 156#define SLAVE_READ_WRITE_BIT_SHIFT   0x1
 157#define SLAVE_MAX_SIZE_TRANSACTION   64
 158#define SLAVE_CLOCK_STRETCH_TIME     25
 159
 160#define IE_S_ALL_INTERRUPT_SHIFT     21
 161#define IE_S_ALL_INTERRUPT_MASK      0x3f
 162
 163enum i2c_slave_read_status {
 164        I2C_SLAVE_RX_FIFO_EMPTY = 0,
 165        I2C_SLAVE_RX_START,
 166        I2C_SLAVE_RX_DATA,
 167        I2C_SLAVE_RX_END,
 168};
 169
 170enum bus_speed_index {
 171        I2C_SPD_100K = 0,
 172        I2C_SPD_400K,
 173};
 174
 175enum bcm_iproc_i2c_type {
 176        IPROC_I2C,
 177        IPROC_I2C_NIC
 178};
 179
 180struct bcm_iproc_i2c_dev {
 181        struct device *device;
 182        enum bcm_iproc_i2c_type type;
 183        int irq;
 184
 185        void __iomem *base;
 186        void __iomem *idm_base;
 187
 188        u32 ape_addr_mask;
 189
 190        /* lock for indirect access through IDM */
 191        spinlock_t idm_lock;
 192
 193        struct i2c_adapter adapter;
 194        unsigned int bus_speed;
 195
 196        struct completion done;
 197        int xfer_is_done;
 198
 199        struct i2c_msg *msg;
 200
 201        struct i2c_client *slave;
 202
 203        /* bytes that have been transferred */
 204        unsigned int tx_bytes;
 205        /* bytes that have been read */
 206        unsigned int rx_bytes;
 207        unsigned int thld_bytes;
 208};
 209
 210/*
 211 * Can be expanded in the future if more interrupt status bits are utilized
 212 */
 213#define ISR_MASK (BIT(IS_M_START_BUSY_SHIFT) | BIT(IS_M_TX_UNDERRUN_SHIFT)\
 214                | BIT(IS_M_RX_THLD_SHIFT))
 215
 216#define ISR_MASK_SLAVE (BIT(IS_S_START_BUSY_SHIFT)\
 217                | BIT(IS_S_RX_EVENT_SHIFT) | BIT(IS_S_RD_EVENT_SHIFT)\
 218                | BIT(IS_S_TX_UNDERRUN_SHIFT))
 219
 220static int bcm_iproc_i2c_reg_slave(struct i2c_client *slave);
 221static int bcm_iproc_i2c_unreg_slave(struct i2c_client *slave);
 222static void bcm_iproc_i2c_enable_disable(struct bcm_iproc_i2c_dev *iproc_i2c,
 223                                         bool enable);
 224
 225static inline u32 iproc_i2c_rd_reg(struct bcm_iproc_i2c_dev *iproc_i2c,
 226                                   u32 offset)
 227{
 228        u32 val;
 229
 230        if (iproc_i2c->idm_base) {
 231                spin_lock(&iproc_i2c->idm_lock);
 232                writel(iproc_i2c->ape_addr_mask,
 233                       iproc_i2c->idm_base + IDM_CTRL_DIRECT_OFFSET);
 234                val = readl(iproc_i2c->base + offset);
 235                spin_unlock(&iproc_i2c->idm_lock);
 236        } else {
 237                val = readl(iproc_i2c->base + offset);
 238        }
 239
 240        return val;
 241}
 242
 243static inline void iproc_i2c_wr_reg(struct bcm_iproc_i2c_dev *iproc_i2c,
 244                                    u32 offset, u32 val)
 245{
 246        if (iproc_i2c->idm_base) {
 247                spin_lock(&iproc_i2c->idm_lock);
 248                writel(iproc_i2c->ape_addr_mask,
 249                       iproc_i2c->idm_base + IDM_CTRL_DIRECT_OFFSET);
 250                writel(val, iproc_i2c->base + offset);
 251                spin_unlock(&iproc_i2c->idm_lock);
 252        } else {
 253                writel(val, iproc_i2c->base + offset);
 254        }
 255}
 256
 257static void bcm_iproc_i2c_slave_init(
 258        struct bcm_iproc_i2c_dev *iproc_i2c, bool need_reset)
 259{
 260        u32 val;
 261
 262        if (need_reset) {
 263                /* put controller in reset */
 264                val = iproc_i2c_rd_reg(iproc_i2c, CFG_OFFSET);
 265                val |= BIT(CFG_RESET_SHIFT);
 266                iproc_i2c_wr_reg(iproc_i2c, CFG_OFFSET, val);
 267
 268                /* wait 100 usec per spec */
 269                udelay(100);
 270
 271                /* bring controller out of reset */
 272                val &= ~(BIT(CFG_RESET_SHIFT));
 273                iproc_i2c_wr_reg(iproc_i2c, CFG_OFFSET, val);
 274        }
 275
 276        /* flush TX/RX FIFOs */
 277        val = (BIT(S_FIFO_RX_FLUSH_SHIFT) | BIT(S_FIFO_TX_FLUSH_SHIFT));
 278        iproc_i2c_wr_reg(iproc_i2c, S_FIFO_CTRL_OFFSET, val);
 279
 280        /* Maximum slave stretch time */
 281        val = iproc_i2c_rd_reg(iproc_i2c, TIM_CFG_OFFSET);
 282        val &= ~(TIM_RAND_SLAVE_STRETCH_MASK << TIM_RAND_SLAVE_STRETCH_SHIFT);
 283        val |= (SLAVE_CLOCK_STRETCH_TIME << TIM_RAND_SLAVE_STRETCH_SHIFT);
 284        iproc_i2c_wr_reg(iproc_i2c, TIM_CFG_OFFSET, val);
 285
 286        /* Configure the slave address */
 287        val = iproc_i2c_rd_reg(iproc_i2c, S_CFG_SMBUS_ADDR_OFFSET);
 288        val |= BIT(S_CFG_EN_NIC_SMB_ADDR3_SHIFT);
 289        val &= ~(S_CFG_NIC_SMB_ADDR3_MASK << S_CFG_NIC_SMB_ADDR3_SHIFT);
 290        val |= (iproc_i2c->slave->addr << S_CFG_NIC_SMB_ADDR3_SHIFT);
 291        iproc_i2c_wr_reg(iproc_i2c, S_CFG_SMBUS_ADDR_OFFSET, val);
 292
 293        /* clear all pending slave interrupts */
 294        iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, ISR_MASK_SLAVE);
 295
 296        /* Enable interrupt register to indicate a valid byte in receive fifo */
 297        val = BIT(IE_S_RX_EVENT_SHIFT);
 298        /* Enable interrupt register for the Slave BUSY command */
 299        val |= BIT(IE_S_START_BUSY_SHIFT);
 300        iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val);
 301}
 302
 303static void bcm_iproc_i2c_check_slave_status(
 304        struct bcm_iproc_i2c_dev *iproc_i2c)
 305{
 306        u32 val;
 307
 308        val = iproc_i2c_rd_reg(iproc_i2c, S_CMD_OFFSET);
 309        /* status is valid only when START_BUSY is cleared after it was set */
 310        if (val & BIT(S_CMD_START_BUSY_SHIFT))
 311                return;
 312
 313        val = (val >> S_CMD_STATUS_SHIFT) & S_CMD_STATUS_MASK;
 314        if (val == S_CMD_STATUS_TIMEOUT) {
 315                dev_err(iproc_i2c->device, "slave random stretch time timeout\n");
 316
 317                /* re-initialize i2c for recovery */
 318                bcm_iproc_i2c_enable_disable(iproc_i2c, false);
 319                bcm_iproc_i2c_slave_init(iproc_i2c, true);
 320                bcm_iproc_i2c_enable_disable(iproc_i2c, true);
 321        }
 322}
 323
 324static bool bcm_iproc_i2c_slave_isr(struct bcm_iproc_i2c_dev *iproc_i2c,
 325                                    u32 status)
 326{
 327        u32 val;
 328        u8 value, rx_status;
 329
 330        /* Slave RX byte receive */
 331        if (status & BIT(IS_S_RX_EVENT_SHIFT)) {
 332                val = iproc_i2c_rd_reg(iproc_i2c, S_RX_OFFSET);
 333                rx_status = (val >> S_RX_STATUS_SHIFT) & S_RX_STATUS_MASK;
 334                if (rx_status == I2C_SLAVE_RX_START) {
 335                        /* Start of SMBUS for Master write */
 336                        i2c_slave_event(iproc_i2c->slave,
 337                                        I2C_SLAVE_WRITE_REQUESTED, &value);
 338
 339                        val = iproc_i2c_rd_reg(iproc_i2c, S_RX_OFFSET);
 340                        value = (u8)((val >> S_RX_DATA_SHIFT) & S_RX_DATA_MASK);
 341                        i2c_slave_event(iproc_i2c->slave,
 342                                        I2C_SLAVE_WRITE_RECEIVED, &value);
 343                } else if (status & BIT(IS_S_RD_EVENT_SHIFT)) {
 344                        /* Start of SMBUS for Master Read */
 345                        i2c_slave_event(iproc_i2c->slave,
 346                                        I2C_SLAVE_READ_REQUESTED, &value);
 347                        iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, value);
 348
 349                        val = BIT(S_CMD_START_BUSY_SHIFT);
 350                        iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val);
 351
 352                        /*
 353                         * Enable interrupt for TX FIFO becomes empty and
 354                         * less than PKT_LENGTH bytes were output on the SMBUS
 355                         */
 356                        val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET);
 357                        val |= BIT(IE_S_TX_UNDERRUN_SHIFT);
 358                        iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val);
 359                } else {
 360                        /* Master write other than start */
 361                        value = (u8)((val >> S_RX_DATA_SHIFT) & S_RX_DATA_MASK);
 362                        i2c_slave_event(iproc_i2c->slave,
 363                                        I2C_SLAVE_WRITE_RECEIVED, &value);
 364                        if (rx_status == I2C_SLAVE_RX_END)
 365                                i2c_slave_event(iproc_i2c->slave,
 366                                                I2C_SLAVE_STOP, &value);
 367                }
 368        } else if (status & BIT(IS_S_TX_UNDERRUN_SHIFT)) {
 369                /* Master read other than start */
 370                i2c_slave_event(iproc_i2c->slave,
 371                                I2C_SLAVE_READ_PROCESSED, &value);
 372
 373                iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, value);
 374                val = BIT(S_CMD_START_BUSY_SHIFT);
 375                iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val);
 376        }
 377
 378        /* Stop */
 379        if (status & BIT(IS_S_START_BUSY_SHIFT)) {
 380                i2c_slave_event(iproc_i2c->slave, I2C_SLAVE_STOP, &value);
 381                /*
 382                 * Enable interrupt for TX FIFO becomes empty and
 383                 * less than PKT_LENGTH bytes were output on the SMBUS
 384                 */
 385                val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET);
 386                val &= ~BIT(IE_S_TX_UNDERRUN_SHIFT);
 387                iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val);
 388        }
 389
 390        /* clear interrupt status */
 391        iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, status);
 392
 393        bcm_iproc_i2c_check_slave_status(iproc_i2c);
 394        return true;
 395}
 396
 397static void bcm_iproc_i2c_read_valid_bytes(struct bcm_iproc_i2c_dev *iproc_i2c)
 398{
 399        struct i2c_msg *msg = iproc_i2c->msg;
 400        uint32_t val;
 401
 402        /* Read valid data from RX FIFO */
 403        while (iproc_i2c->rx_bytes < msg->len) {
 404                val = iproc_i2c_rd_reg(iproc_i2c, M_RX_OFFSET);
 405
 406                /* rx fifo empty */
 407                if (!((val >> M_RX_STATUS_SHIFT) & M_RX_STATUS_MASK))
 408                        break;
 409
 410                msg->buf[iproc_i2c->rx_bytes] =
 411                        (val >> M_RX_DATA_SHIFT) & M_RX_DATA_MASK;
 412                iproc_i2c->rx_bytes++;
 413        }
 414}
 415
 416static void bcm_iproc_i2c_send(struct bcm_iproc_i2c_dev *iproc_i2c)
 417{
 418        struct i2c_msg *msg = iproc_i2c->msg;
 419        unsigned int tx_bytes = msg->len - iproc_i2c->tx_bytes;
 420        unsigned int i;
 421        u32 val;
 422
 423        /* can only fill up to the FIFO size */
 424        tx_bytes = min_t(unsigned int, tx_bytes, M_TX_RX_FIFO_SIZE);
 425        for (i = 0; i < tx_bytes; i++) {
 426                /* start from where we left over */
 427                unsigned int idx = iproc_i2c->tx_bytes + i;
 428
 429                val = msg->buf[idx];
 430
 431                /* mark the last byte */
 432                if (idx == msg->len - 1) {
 433                        val |= BIT(M_TX_WR_STATUS_SHIFT);
 434
 435                        if (iproc_i2c->irq) {
 436                                u32 tmp;
 437
 438                                /*
 439                                 * Since this is the last byte, we should now
 440                                 * disable TX FIFO underrun interrupt
 441                                 */
 442                                tmp = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET);
 443                                tmp &= ~BIT(IE_M_TX_UNDERRUN_SHIFT);
 444                                iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET,
 445                                                 tmp);
 446                        }
 447                }
 448
 449                /* load data into TX FIFO */
 450                iproc_i2c_wr_reg(iproc_i2c, M_TX_OFFSET, val);
 451        }
 452
 453        /* update number of transferred bytes */
 454        iproc_i2c->tx_bytes += tx_bytes;
 455}
 456
 457static void bcm_iproc_i2c_read(struct bcm_iproc_i2c_dev *iproc_i2c)
 458{
 459        struct i2c_msg *msg = iproc_i2c->msg;
 460        u32 bytes_left, val;
 461
 462        bcm_iproc_i2c_read_valid_bytes(iproc_i2c);
 463        bytes_left = msg->len - iproc_i2c->rx_bytes;
 464        if (bytes_left == 0) {
 465                if (iproc_i2c->irq) {
 466                        /* finished reading all data, disable rx thld event */
 467                        val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET);
 468                        val &= ~BIT(IS_M_RX_THLD_SHIFT);
 469                        iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val);
 470                }
 471        } else if (bytes_left < iproc_i2c->thld_bytes) {
 472                /* set bytes left as threshold */
 473                val = iproc_i2c_rd_reg(iproc_i2c, M_FIFO_CTRL_OFFSET);
 474                val &= ~(M_FIFO_RX_THLD_MASK << M_FIFO_RX_THLD_SHIFT);
 475                val |= (bytes_left << M_FIFO_RX_THLD_SHIFT);
 476                iproc_i2c_wr_reg(iproc_i2c, M_FIFO_CTRL_OFFSET, val);
 477                iproc_i2c->thld_bytes = bytes_left;
 478        }
 479        /*
 480         * bytes_left >= iproc_i2c->thld_bytes,
 481         * hence no need to change the THRESHOLD SET.
 482         * It will remain as iproc_i2c->thld_bytes itself
 483         */
 484}
 485
 486static void bcm_iproc_i2c_process_m_event(struct bcm_iproc_i2c_dev *iproc_i2c,
 487                                          u32 status)
 488{
 489        /* TX FIFO is empty and we have more data to send */
 490        if (status & BIT(IS_M_TX_UNDERRUN_SHIFT))
 491                bcm_iproc_i2c_send(iproc_i2c);
 492
 493        /* RX FIFO threshold is reached and data needs to be read out */
 494        if (status & BIT(IS_M_RX_THLD_SHIFT))
 495                bcm_iproc_i2c_read(iproc_i2c);
 496
 497        /* transfer is done */
 498        if (status & BIT(IS_M_START_BUSY_SHIFT)) {
 499                iproc_i2c->xfer_is_done = 1;
 500                if (iproc_i2c->irq)
 501                        complete(&iproc_i2c->done);
 502        }
 503}
 504
 505static irqreturn_t bcm_iproc_i2c_isr(int irq, void *data)
 506{
 507        struct bcm_iproc_i2c_dev *iproc_i2c = data;
 508        u32 status = iproc_i2c_rd_reg(iproc_i2c, IS_OFFSET);
 509        bool ret;
 510        u32 sl_status = status & ISR_MASK_SLAVE;
 511
 512        if (sl_status) {
 513                ret = bcm_iproc_i2c_slave_isr(iproc_i2c, sl_status);
 514                if (ret)
 515                        return IRQ_HANDLED;
 516                else
 517                        return IRQ_NONE;
 518        }
 519
 520        status &= ISR_MASK;
 521        if (!status)
 522                return IRQ_NONE;
 523
 524        /* process all master based events */
 525        bcm_iproc_i2c_process_m_event(iproc_i2c, status);
 526        iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, status);
 527
 528        return IRQ_HANDLED;
 529}
 530
 531static int bcm_iproc_i2c_init(struct bcm_iproc_i2c_dev *iproc_i2c)
 532{
 533        u32 val;
 534
 535        /* put controller in reset */
 536        val = iproc_i2c_rd_reg(iproc_i2c, CFG_OFFSET);
 537        val |= BIT(CFG_RESET_SHIFT);
 538        val &= ~(BIT(CFG_EN_SHIFT));
 539        iproc_i2c_wr_reg(iproc_i2c, CFG_OFFSET, val);
 540
 541        /* wait 100 usec per spec */
 542        udelay(100);
 543
 544        /* bring controller out of reset */
 545        val &= ~(BIT(CFG_RESET_SHIFT));
 546        iproc_i2c_wr_reg(iproc_i2c, CFG_OFFSET, val);
 547
 548        /* flush TX/RX FIFOs and set RX FIFO threshold to zero */
 549        val = (BIT(M_FIFO_RX_FLUSH_SHIFT) | BIT(M_FIFO_TX_FLUSH_SHIFT));
 550        iproc_i2c_wr_reg(iproc_i2c, M_FIFO_CTRL_OFFSET, val);
 551        /* disable all interrupts */
 552        val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET);
 553        val &= ~(IE_M_ALL_INTERRUPT_MASK <<
 554                        IE_M_ALL_INTERRUPT_SHIFT);
 555        iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val);
 556
 557        /* clear all pending interrupts */
 558        iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, 0xffffffff);
 559
 560        return 0;
 561}
 562
 563static void bcm_iproc_i2c_enable_disable(struct bcm_iproc_i2c_dev *iproc_i2c,
 564                                         bool enable)
 565{
 566        u32 val;
 567
 568        val = iproc_i2c_rd_reg(iproc_i2c, CFG_OFFSET);
 569        if (enable)
 570                val |= BIT(CFG_EN_SHIFT);
 571        else
 572                val &= ~BIT(CFG_EN_SHIFT);
 573        iproc_i2c_wr_reg(iproc_i2c, CFG_OFFSET, val);
 574}
 575
 576static int bcm_iproc_i2c_check_status(struct bcm_iproc_i2c_dev *iproc_i2c,
 577                                      struct i2c_msg *msg)
 578{
 579        u32 val;
 580
 581        val = iproc_i2c_rd_reg(iproc_i2c, M_CMD_OFFSET);
 582        val = (val >> M_CMD_STATUS_SHIFT) & M_CMD_STATUS_MASK;
 583
 584        switch (val) {
 585        case M_CMD_STATUS_SUCCESS:
 586                return 0;
 587
 588        case M_CMD_STATUS_LOST_ARB:
 589                dev_dbg(iproc_i2c->device, "lost bus arbitration\n");
 590                return -EAGAIN;
 591
 592        case M_CMD_STATUS_NACK_ADDR:
 593                dev_dbg(iproc_i2c->device, "NAK addr:0x%02x\n", msg->addr);
 594                return -ENXIO;
 595
 596        case M_CMD_STATUS_NACK_DATA:
 597                dev_dbg(iproc_i2c->device, "NAK data\n");
 598                return -ENXIO;
 599
 600        case M_CMD_STATUS_TIMEOUT:
 601                dev_dbg(iproc_i2c->device, "bus timeout\n");
 602                return -ETIMEDOUT;
 603
 604        case M_CMD_STATUS_FIFO_UNDERRUN:
 605                dev_dbg(iproc_i2c->device, "FIFO under-run\n");
 606                return -ENXIO;
 607
 608        case M_CMD_STATUS_RX_FIFO_FULL:
 609                dev_dbg(iproc_i2c->device, "RX FIFO full\n");
 610                return -ETIMEDOUT;
 611
 612        default:
 613                dev_dbg(iproc_i2c->device, "unknown error code=%d\n", val);
 614
 615                /* re-initialize i2c for recovery */
 616                bcm_iproc_i2c_enable_disable(iproc_i2c, false);
 617                bcm_iproc_i2c_init(iproc_i2c);
 618                bcm_iproc_i2c_enable_disable(iproc_i2c, true);
 619
 620                return -EIO;
 621        }
 622}
 623
 624static int bcm_iproc_i2c_xfer_wait(struct bcm_iproc_i2c_dev *iproc_i2c,
 625                                   struct i2c_msg *msg,
 626                                   u32 cmd)
 627{
 628        unsigned long time_left = msecs_to_jiffies(I2C_TIMEOUT_MSEC);
 629        u32 val, status;
 630        int ret;
 631
 632        iproc_i2c_wr_reg(iproc_i2c, M_CMD_OFFSET, cmd);
 633
 634        if (iproc_i2c->irq) {
 635                time_left = wait_for_completion_timeout(&iproc_i2c->done,
 636                                                        time_left);
 637                /* disable all interrupts */
 638                iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, 0);
 639                /* read it back to flush the write */
 640                iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET);
 641                /* make sure the interrupt handler isn't running */
 642                synchronize_irq(iproc_i2c->irq);
 643
 644        } else { /* polling mode */
 645                unsigned long timeout = jiffies + time_left;
 646
 647                do {
 648                        status = iproc_i2c_rd_reg(iproc_i2c,
 649                                                  IS_OFFSET) & ISR_MASK;
 650                        bcm_iproc_i2c_process_m_event(iproc_i2c, status);
 651                        iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, status);
 652
 653                        if (time_after(jiffies, timeout)) {
 654                                time_left = 0;
 655                                break;
 656                        }
 657
 658                        cpu_relax();
 659                        cond_resched();
 660                } while (!iproc_i2c->xfer_is_done);
 661        }
 662
 663        if (!time_left && !iproc_i2c->xfer_is_done) {
 664                dev_err(iproc_i2c->device, "transaction timed out\n");
 665
 666                /* flush both TX/RX FIFOs */
 667                val = BIT(M_FIFO_RX_FLUSH_SHIFT) | BIT(M_FIFO_TX_FLUSH_SHIFT);
 668                iproc_i2c_wr_reg(iproc_i2c, M_FIFO_CTRL_OFFSET, val);
 669                return -ETIMEDOUT;
 670        }
 671
 672        ret = bcm_iproc_i2c_check_status(iproc_i2c, msg);
 673        if (ret) {
 674                /* flush both TX/RX FIFOs */
 675                val = BIT(M_FIFO_RX_FLUSH_SHIFT) | BIT(M_FIFO_TX_FLUSH_SHIFT);
 676                iproc_i2c_wr_reg(iproc_i2c, M_FIFO_CTRL_OFFSET, val);
 677                return ret;
 678        }
 679
 680        return 0;
 681}
 682
 683/*
 684 * If 'process_call' is true, then this is a multi-msg transfer that requires
 685 * a repeated start between the messages.
 686 * More specifically, it must be a write (reg) followed by a read (data).
 687 * The i2c quirks are set to enforce this rule.
 688 */
 689static int bcm_iproc_i2c_xfer_internal(struct bcm_iproc_i2c_dev *iproc_i2c,
 690                                        struct i2c_msg *msgs, bool process_call)
 691{
 692        int i;
 693        u8 addr;
 694        u32 val, tmp, val_intr_en;
 695        unsigned int tx_bytes;
 696        struct i2c_msg *msg = &msgs[0];
 697
 698        /* check if bus is busy */
 699        if (!!(iproc_i2c_rd_reg(iproc_i2c,
 700                                M_CMD_OFFSET) & BIT(M_CMD_START_BUSY_SHIFT))) {
 701                dev_warn(iproc_i2c->device, "bus is busy\n");
 702                return -EBUSY;
 703        }
 704
 705        iproc_i2c->msg = msg;
 706
 707        /* format and load slave address into the TX FIFO */
 708        addr = i2c_8bit_addr_from_msg(msg);
 709        iproc_i2c_wr_reg(iproc_i2c, M_TX_OFFSET, addr);
 710
 711        /*
 712         * For a write transaction, load data into the TX FIFO. Only allow
 713         * loading up to TX FIFO size - 1 bytes of data since the first byte
 714         * has been used up by the slave address
 715         */
 716        tx_bytes = min_t(unsigned int, msg->len, M_TX_RX_FIFO_SIZE - 1);
 717        if (!(msg->flags & I2C_M_RD)) {
 718                for (i = 0; i < tx_bytes; i++) {
 719                        val = msg->buf[i];
 720
 721                        /* mark the last byte */
 722                        if (!process_call && (i == msg->len - 1))
 723                                val |= BIT(M_TX_WR_STATUS_SHIFT);
 724
 725                        iproc_i2c_wr_reg(iproc_i2c, M_TX_OFFSET, val);
 726                }
 727                iproc_i2c->tx_bytes = tx_bytes;
 728        }
 729
 730        /* Process the read message if this is process call */
 731        if (process_call) {
 732                msg++;
 733                iproc_i2c->msg = msg;  /* point to second msg */
 734
 735                /*
 736                 * The last byte to be sent out should be a slave
 737                 * address with read operation
 738                 */
 739                addr = i2c_8bit_addr_from_msg(msg);
 740                /* mark it the last byte out */
 741                val = addr | BIT(M_TX_WR_STATUS_SHIFT);
 742                iproc_i2c_wr_reg(iproc_i2c, M_TX_OFFSET, val);
 743        }
 744
 745        /* mark as incomplete before starting the transaction */
 746        if (iproc_i2c->irq)
 747                reinit_completion(&iproc_i2c->done);
 748
 749        iproc_i2c->xfer_is_done = 0;
 750
 751        /*
 752         * Enable the "start busy" interrupt, which will be triggered after the
 753         * transaction is done, i.e., the internal start_busy bit, transitions
 754         * from 1 to 0.
 755         */
 756        val_intr_en = BIT(IE_M_START_BUSY_SHIFT);
 757
 758        /*
 759         * If TX data size is larger than the TX FIFO, need to enable TX
 760         * underrun interrupt, which will be triggerred when the TX FIFO is
 761         * empty. When that happens we can then pump more data into the FIFO
 762         */
 763        if (!process_call && !(msg->flags & I2C_M_RD) &&
 764            msg->len > iproc_i2c->tx_bytes)
 765                val_intr_en |= BIT(IE_M_TX_UNDERRUN_SHIFT);
 766
 767        /*
 768         * Now we can activate the transfer. For a read operation, specify the
 769         * number of bytes to read
 770         */
 771        val = BIT(M_CMD_START_BUSY_SHIFT);
 772
 773        if (msg->len == 0) {
 774                /* SMBUS QUICK Command (Read/Write) */
 775                val |= (M_CMD_PROTOCOL_QUICK << M_CMD_PROTOCOL_SHIFT);
 776        } else if (msg->flags & I2C_M_RD) {
 777                u32 protocol;
 778
 779                iproc_i2c->rx_bytes = 0;
 780                if (msg->len > M_RX_FIFO_MAX_THLD_VALUE)
 781                        iproc_i2c->thld_bytes = M_RX_FIFO_THLD_VALUE;
 782                else
 783                        iproc_i2c->thld_bytes = msg->len;
 784
 785                /* set threshold value */
 786                tmp = iproc_i2c_rd_reg(iproc_i2c, M_FIFO_CTRL_OFFSET);
 787                tmp &= ~(M_FIFO_RX_THLD_MASK << M_FIFO_RX_THLD_SHIFT);
 788                tmp |= iproc_i2c->thld_bytes << M_FIFO_RX_THLD_SHIFT;
 789                iproc_i2c_wr_reg(iproc_i2c, M_FIFO_CTRL_OFFSET, tmp);
 790
 791                /* enable the RX threshold interrupt */
 792                val_intr_en |= BIT(IE_M_RX_THLD_SHIFT);
 793
 794                protocol = process_call ?
 795                                M_CMD_PROTOCOL_PROCESS : M_CMD_PROTOCOL_BLK_RD;
 796
 797                val |= (protocol << M_CMD_PROTOCOL_SHIFT) |
 798                       (msg->len << M_CMD_RD_CNT_SHIFT);
 799        } else {
 800                val |= (M_CMD_PROTOCOL_BLK_WR << M_CMD_PROTOCOL_SHIFT);
 801        }
 802
 803        if (iproc_i2c->irq)
 804                iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val_intr_en);
 805
 806        return bcm_iproc_i2c_xfer_wait(iproc_i2c, msg, val);
 807}
 808
 809static int bcm_iproc_i2c_xfer(struct i2c_adapter *adapter,
 810                              struct i2c_msg msgs[], int num)
 811{
 812        struct bcm_iproc_i2c_dev *iproc_i2c = i2c_get_adapdata(adapter);
 813        bool process_call = false;
 814        int ret;
 815
 816        if (num == 2) {
 817                /* Repeated start, use process call */
 818                process_call = true;
 819                if (msgs[1].flags & I2C_M_NOSTART) {
 820                        dev_err(iproc_i2c->device, "Invalid repeated start\n");
 821                        return -EOPNOTSUPP;
 822                }
 823        }
 824
 825        ret = bcm_iproc_i2c_xfer_internal(iproc_i2c, msgs, process_call);
 826        if (ret) {
 827                dev_dbg(iproc_i2c->device, "xfer failed\n");
 828                return ret;
 829        }
 830
 831        return num;
 832}
 833
 834static uint32_t bcm_iproc_i2c_functionality(struct i2c_adapter *adap)
 835{
 836        u32 val;
 837
 838        val = I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
 839
 840        if (adap->algo->reg_slave)
 841                val |= I2C_FUNC_SLAVE;
 842
 843        return val;
 844}
 845
 846static struct i2c_algorithm bcm_iproc_algo = {
 847        .master_xfer = bcm_iproc_i2c_xfer,
 848        .functionality = bcm_iproc_i2c_functionality,
 849        .reg_slave = bcm_iproc_i2c_reg_slave,
 850        .unreg_slave = bcm_iproc_i2c_unreg_slave,
 851};
 852
 853static const struct i2c_adapter_quirks bcm_iproc_i2c_quirks = {
 854        .flags = I2C_AQ_COMB_WRITE_THEN_READ,
 855        .max_comb_1st_msg_len = M_TX_RX_FIFO_SIZE,
 856        .max_read_len = M_RX_MAX_READ_LEN,
 857};
 858
 859static int bcm_iproc_i2c_cfg_speed(struct bcm_iproc_i2c_dev *iproc_i2c)
 860{
 861        unsigned int bus_speed;
 862        u32 val;
 863        int ret = of_property_read_u32(iproc_i2c->device->of_node,
 864                                       "clock-frequency", &bus_speed);
 865        if (ret < 0) {
 866                dev_info(iproc_i2c->device,
 867                        "unable to interpret clock-frequency DT property\n");
 868                bus_speed = I2C_MAX_STANDARD_MODE_FREQ;
 869        }
 870
 871        if (bus_speed < I2C_MAX_STANDARD_MODE_FREQ) {
 872                dev_err(iproc_i2c->device, "%d Hz bus speed not supported\n",
 873                        bus_speed);
 874                dev_err(iproc_i2c->device,
 875                        "valid speeds are 100khz and 400khz\n");
 876                return -EINVAL;
 877        } else if (bus_speed < I2C_MAX_FAST_MODE_FREQ) {
 878                bus_speed = I2C_MAX_STANDARD_MODE_FREQ;
 879        } else {
 880                bus_speed = I2C_MAX_FAST_MODE_FREQ;
 881        }
 882
 883        iproc_i2c->bus_speed = bus_speed;
 884        val = iproc_i2c_rd_reg(iproc_i2c, TIM_CFG_OFFSET);
 885        val &= ~BIT(TIM_CFG_MODE_400_SHIFT);
 886        val |= (bus_speed == I2C_MAX_FAST_MODE_FREQ) << TIM_CFG_MODE_400_SHIFT;
 887        iproc_i2c_wr_reg(iproc_i2c, TIM_CFG_OFFSET, val);
 888
 889        dev_info(iproc_i2c->device, "bus set to %u Hz\n", bus_speed);
 890
 891        return 0;
 892}
 893
 894static int bcm_iproc_i2c_probe(struct platform_device *pdev)
 895{
 896        int irq, ret = 0;
 897        struct bcm_iproc_i2c_dev *iproc_i2c;
 898        struct i2c_adapter *adap;
 899        struct resource *res;
 900
 901        iproc_i2c = devm_kzalloc(&pdev->dev, sizeof(*iproc_i2c),
 902                                 GFP_KERNEL);
 903        if (!iproc_i2c)
 904                return -ENOMEM;
 905
 906        platform_set_drvdata(pdev, iproc_i2c);
 907        iproc_i2c->device = &pdev->dev;
 908        iproc_i2c->type =
 909                (enum bcm_iproc_i2c_type)of_device_get_match_data(&pdev->dev);
 910        init_completion(&iproc_i2c->done);
 911
 912        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 913        iproc_i2c->base = devm_ioremap_resource(iproc_i2c->device, res);
 914        if (IS_ERR(iproc_i2c->base))
 915                return PTR_ERR(iproc_i2c->base);
 916
 917        if (iproc_i2c->type == IPROC_I2C_NIC) {
 918                res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
 919                iproc_i2c->idm_base = devm_ioremap_resource(iproc_i2c->device,
 920                                                            res);
 921                if (IS_ERR(iproc_i2c->idm_base))
 922                        return PTR_ERR(iproc_i2c->idm_base);
 923
 924                ret = of_property_read_u32(iproc_i2c->device->of_node,
 925                                           "brcm,ape-hsls-addr-mask",
 926                                           &iproc_i2c->ape_addr_mask);
 927                if (ret < 0) {
 928                        dev_err(iproc_i2c->device,
 929                                "'brcm,ape-hsls-addr-mask' missing\n");
 930                        return -EINVAL;
 931                }
 932
 933                spin_lock_init(&iproc_i2c->idm_lock);
 934
 935                /* no slave support */
 936                bcm_iproc_algo.reg_slave = NULL;
 937                bcm_iproc_algo.unreg_slave = NULL;
 938        }
 939
 940        ret = bcm_iproc_i2c_init(iproc_i2c);
 941        if (ret)
 942                return ret;
 943
 944        ret = bcm_iproc_i2c_cfg_speed(iproc_i2c);
 945        if (ret)
 946                return ret;
 947
 948        irq = platform_get_irq(pdev, 0);
 949        if (irq > 0) {
 950                ret = devm_request_irq(iproc_i2c->device, irq,
 951                                       bcm_iproc_i2c_isr, 0, pdev->name,
 952                                       iproc_i2c);
 953                if (ret < 0) {
 954                        dev_err(iproc_i2c->device,
 955                                "unable to request irq %i\n", irq);
 956                        return ret;
 957                }
 958
 959                iproc_i2c->irq = irq;
 960        } else {
 961                dev_warn(iproc_i2c->device,
 962                         "no irq resource, falling back to poll mode\n");
 963        }
 964
 965        bcm_iproc_i2c_enable_disable(iproc_i2c, true);
 966
 967        adap = &iproc_i2c->adapter;
 968        i2c_set_adapdata(adap, iproc_i2c);
 969        snprintf(adap->name, sizeof(adap->name),
 970                "Broadcom iProc (%s)",
 971                of_node_full_name(iproc_i2c->device->of_node));
 972        adap->algo = &bcm_iproc_algo;
 973        adap->quirks = &bcm_iproc_i2c_quirks;
 974        adap->dev.parent = &pdev->dev;
 975        adap->dev.of_node = pdev->dev.of_node;
 976
 977        return i2c_add_adapter(adap);
 978}
 979
 980static int bcm_iproc_i2c_remove(struct platform_device *pdev)
 981{
 982        struct bcm_iproc_i2c_dev *iproc_i2c = platform_get_drvdata(pdev);
 983
 984        if (iproc_i2c->irq) {
 985                /*
 986                 * Make sure there's no pending interrupt when we remove the
 987                 * adapter
 988                 */
 989                iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, 0);
 990                iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET);
 991                synchronize_irq(iproc_i2c->irq);
 992        }
 993
 994        i2c_del_adapter(&iproc_i2c->adapter);
 995        bcm_iproc_i2c_enable_disable(iproc_i2c, false);
 996
 997        return 0;
 998}
 999
1000#ifdef CONFIG_PM_SLEEP
1001
1002static int bcm_iproc_i2c_suspend(struct device *dev)
1003{
1004        struct bcm_iproc_i2c_dev *iproc_i2c = dev_get_drvdata(dev);
1005
1006        if (iproc_i2c->irq) {
1007                /*
1008                 * Make sure there's no pending interrupt when we go into
1009                 * suspend
1010                 */
1011                iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, 0);
1012                iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET);
1013                synchronize_irq(iproc_i2c->irq);
1014        }
1015
1016        /* now disable the controller */
1017        bcm_iproc_i2c_enable_disable(iproc_i2c, false);
1018
1019        return 0;
1020}
1021
1022static int bcm_iproc_i2c_resume(struct device *dev)
1023{
1024        struct bcm_iproc_i2c_dev *iproc_i2c = dev_get_drvdata(dev);
1025        int ret;
1026        u32 val;
1027
1028        /*
1029         * Power domain could have been shut off completely in system deep
1030         * sleep, so re-initialize the block here
1031         */
1032        ret = bcm_iproc_i2c_init(iproc_i2c);
1033        if (ret)
1034                return ret;
1035
1036        /* configure to the desired bus speed */
1037        val = iproc_i2c_rd_reg(iproc_i2c, TIM_CFG_OFFSET);
1038        val &= ~BIT(TIM_CFG_MODE_400_SHIFT);
1039        val |= (iproc_i2c->bus_speed == I2C_MAX_FAST_MODE_FREQ) << TIM_CFG_MODE_400_SHIFT;
1040        iproc_i2c_wr_reg(iproc_i2c, TIM_CFG_OFFSET, val);
1041
1042        bcm_iproc_i2c_enable_disable(iproc_i2c, true);
1043
1044        return 0;
1045}
1046
1047static const struct dev_pm_ops bcm_iproc_i2c_pm_ops = {
1048        .suspend_late = &bcm_iproc_i2c_suspend,
1049        .resume_early = &bcm_iproc_i2c_resume
1050};
1051
1052#define BCM_IPROC_I2C_PM_OPS (&bcm_iproc_i2c_pm_ops)
1053#else
1054#define BCM_IPROC_I2C_PM_OPS NULL
1055#endif /* CONFIG_PM_SLEEP */
1056
1057
1058static int bcm_iproc_i2c_reg_slave(struct i2c_client *slave)
1059{
1060        struct bcm_iproc_i2c_dev *iproc_i2c = i2c_get_adapdata(slave->adapter);
1061
1062        if (iproc_i2c->slave)
1063                return -EBUSY;
1064
1065        if (slave->flags & I2C_CLIENT_TEN)
1066                return -EAFNOSUPPORT;
1067
1068        iproc_i2c->slave = slave;
1069        bcm_iproc_i2c_slave_init(iproc_i2c, false);
1070        return 0;
1071}
1072
1073static int bcm_iproc_i2c_unreg_slave(struct i2c_client *slave)
1074{
1075        u32 tmp;
1076        struct bcm_iproc_i2c_dev *iproc_i2c = i2c_get_adapdata(slave->adapter);
1077
1078        if (!iproc_i2c->slave)
1079                return -EINVAL;
1080
1081        disable_irq(iproc_i2c->irq);
1082
1083        /* disable all slave interrupts */
1084        tmp = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET);
1085        tmp &= ~(IE_S_ALL_INTERRUPT_MASK <<
1086                        IE_S_ALL_INTERRUPT_SHIFT);
1087        iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, tmp);
1088
1089        /* Erase the slave address programmed */
1090        tmp = iproc_i2c_rd_reg(iproc_i2c, S_CFG_SMBUS_ADDR_OFFSET);
1091        tmp &= ~BIT(S_CFG_EN_NIC_SMB_ADDR3_SHIFT);
1092        iproc_i2c_wr_reg(iproc_i2c, S_CFG_SMBUS_ADDR_OFFSET, tmp);
1093
1094        /* flush TX/RX FIFOs */
1095        tmp = (BIT(S_FIFO_RX_FLUSH_SHIFT) | BIT(S_FIFO_TX_FLUSH_SHIFT));
1096        iproc_i2c_wr_reg(iproc_i2c, S_FIFO_CTRL_OFFSET, tmp);
1097
1098        /* clear all pending slave interrupts */
1099        iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, ISR_MASK_SLAVE);
1100
1101        iproc_i2c->slave = NULL;
1102
1103        enable_irq(iproc_i2c->irq);
1104
1105        return 0;
1106}
1107
1108static const struct of_device_id bcm_iproc_i2c_of_match[] = {
1109        {
1110                .compatible = "brcm,iproc-i2c",
1111                .data = (int *)IPROC_I2C,
1112        }, {
1113                .compatible = "brcm,iproc-nic-i2c",
1114                .data = (int *)IPROC_I2C_NIC,
1115        },
1116        { /* sentinel */ }
1117};
1118MODULE_DEVICE_TABLE(of, bcm_iproc_i2c_of_match);
1119
1120static struct platform_driver bcm_iproc_i2c_driver = {
1121        .driver = {
1122                .name = "bcm-iproc-i2c",
1123                .of_match_table = bcm_iproc_i2c_of_match,
1124                .pm = BCM_IPROC_I2C_PM_OPS,
1125        },
1126        .probe = bcm_iproc_i2c_probe,
1127        .remove = bcm_iproc_i2c_remove,
1128};
1129module_platform_driver(bcm_iproc_i2c_driver);
1130
1131MODULE_AUTHOR("Ray Jui <rjui@broadcom.com>");
1132MODULE_DESCRIPTION("Broadcom iProc I2C Driver");
1133MODULE_LICENSE("GPL v2");
1134