linux/drivers/i2c/busses/i2c-fsi.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * FSI-attached I2C master algorithm
   4 *
   5 * Copyright 2018 IBM Corporation
   6 *
   7 * This program is free software; you can redistribute it and/or
   8 * modify it under the terms of the GNU General Public License
   9 * as published by the Free Software Foundation; either version
  10 * 2 of the License, or (at your option) any later version.
  11 */
  12
  13#include <linux/bitfield.h>
  14#include <linux/bitops.h>
  15#include <linux/delay.h>
  16#include <linux/device.h>
  17#include <linux/errno.h>
  18#include <linux/fsi.h>
  19#include <linux/i2c.h>
  20#include <linux/jiffies.h>
  21#include <linux/kernel.h>
  22#include <linux/list.h>
  23#include <linux/module.h>
  24#include <linux/mutex.h>
  25#include <linux/of.h>
  26#include <linux/slab.h>
  27
  28#define FSI_ENGID_I2C           0x7
  29
  30#define I2C_DEFAULT_CLK_DIV     6
  31
  32/* i2c registers */
  33#define I2C_FSI_FIFO            0x00
  34#define I2C_FSI_CMD             0x04
  35#define I2C_FSI_MODE            0x08
  36#define I2C_FSI_WATER_MARK      0x0C
  37#define I2C_FSI_INT_MASK        0x10
  38#define I2C_FSI_INT_COND        0x14
  39#define I2C_FSI_OR_INT_MASK     0x14
  40#define I2C_FSI_INTS            0x18
  41#define I2C_FSI_AND_INT_MASK    0x18
  42#define I2C_FSI_STAT            0x1C
  43#define I2C_FSI_RESET_I2C       0x1C
  44#define I2C_FSI_ESTAT           0x20
  45#define I2C_FSI_RESET_ERR       0x20
  46#define I2C_FSI_RESID_LEN       0x24
  47#define I2C_FSI_SET_SCL         0x24
  48#define I2C_FSI_PORT_BUSY       0x28
  49#define I2C_FSI_RESET_SCL       0x2C
  50#define I2C_FSI_SET_SDA         0x30
  51#define I2C_FSI_RESET_SDA       0x34
  52
  53/* cmd register */
  54#define I2C_CMD_WITH_START      BIT(31)
  55#define I2C_CMD_WITH_ADDR       BIT(30)
  56#define I2C_CMD_RD_CONT         BIT(29)
  57#define I2C_CMD_WITH_STOP       BIT(28)
  58#define I2C_CMD_FORCELAUNCH     BIT(27)
  59#define I2C_CMD_ADDR            GENMASK(23, 17)
  60#define I2C_CMD_READ            BIT(16)
  61#define I2C_CMD_LEN             GENMASK(15, 0)
  62
  63/* mode register */
  64#define I2C_MODE_CLKDIV         GENMASK(31, 16)
  65#define I2C_MODE_PORT           GENMASK(15, 10)
  66#define I2C_MODE_ENHANCED       BIT(3)
  67#define I2C_MODE_DIAG           BIT(2)
  68#define I2C_MODE_PACE_ALLOW     BIT(1)
  69#define I2C_MODE_WRAP           BIT(0)
  70
  71/* watermark register */
  72#define I2C_WATERMARK_HI        GENMASK(15, 12)
  73#define I2C_WATERMARK_LO        GENMASK(7, 4)
  74
  75#define I2C_FIFO_HI_LVL         4
  76#define I2C_FIFO_LO_LVL         4
  77
  78/* interrupt register */
  79#define I2C_INT_INV_CMD         BIT(15)
  80#define I2C_INT_PARITY          BIT(14)
  81#define I2C_INT_BE_OVERRUN      BIT(13)
  82#define I2C_INT_BE_ACCESS       BIT(12)
  83#define I2C_INT_LOST_ARB        BIT(11)
  84#define I2C_INT_NACK            BIT(10)
  85#define I2C_INT_DAT_REQ         BIT(9)
  86#define I2C_INT_CMD_COMP        BIT(8)
  87#define I2C_INT_STOP_ERR        BIT(7)
  88#define I2C_INT_BUSY            BIT(6)
  89#define I2C_INT_IDLE            BIT(5)
  90
  91/* status register */
  92#define I2C_STAT_INV_CMD        BIT(31)
  93#define I2C_STAT_PARITY         BIT(30)
  94#define I2C_STAT_BE_OVERRUN     BIT(29)
  95#define I2C_STAT_BE_ACCESS      BIT(28)
  96#define I2C_STAT_LOST_ARB       BIT(27)
  97#define I2C_STAT_NACK           BIT(26)
  98#define I2C_STAT_DAT_REQ        BIT(25)
  99#define I2C_STAT_CMD_COMP       BIT(24)
 100#define I2C_STAT_STOP_ERR       BIT(23)
 101#define I2C_STAT_MAX_PORT       GENMASK(22, 16)
 102#define I2C_STAT_ANY_INT        BIT(15)
 103#define I2C_STAT_SCL_IN         BIT(11)
 104#define I2C_STAT_SDA_IN         BIT(10)
 105#define I2C_STAT_PORT_BUSY      BIT(9)
 106#define I2C_STAT_SELF_BUSY      BIT(8)
 107#define I2C_STAT_FIFO_COUNT     GENMASK(7, 0)
 108
 109#define I2C_STAT_ERR            (I2C_STAT_INV_CMD |                     \
 110                                 I2C_STAT_PARITY |                      \
 111                                 I2C_STAT_BE_OVERRUN |                  \
 112                                 I2C_STAT_BE_ACCESS |                   \
 113                                 I2C_STAT_LOST_ARB |                    \
 114                                 I2C_STAT_NACK |                        \
 115                                 I2C_STAT_STOP_ERR)
 116#define I2C_STAT_ANY_RESP       (I2C_STAT_ERR |                         \
 117                                 I2C_STAT_DAT_REQ |                     \
 118                                 I2C_STAT_CMD_COMP)
 119
 120/* extended status register */
 121#define I2C_ESTAT_FIFO_SZ       GENMASK(31, 24)
 122#define I2C_ESTAT_SCL_IN_SY     BIT(15)
 123#define I2C_ESTAT_SDA_IN_SY     BIT(14)
 124#define I2C_ESTAT_S_SCL         BIT(13)
 125#define I2C_ESTAT_S_SDA         BIT(12)
 126#define I2C_ESTAT_M_SCL         BIT(11)
 127#define I2C_ESTAT_M_SDA         BIT(10)
 128#define I2C_ESTAT_HI_WATER      BIT(9)
 129#define I2C_ESTAT_LO_WATER      BIT(8)
 130#define I2C_ESTAT_PORT_BUSY     BIT(7)
 131#define I2C_ESTAT_SELF_BUSY     BIT(6)
 132#define I2C_ESTAT_VERSION       GENMASK(4, 0)
 133
 134/* port busy register */
 135#define I2C_PORT_BUSY_RESET     BIT(31)
 136
 137/* wait for command complete or data request */
 138#define I2C_CMD_SLEEP_MAX_US    500
 139#define I2C_CMD_SLEEP_MIN_US    50
 140
 141/* wait after reset; choose time from legacy driver */
 142#define I2C_RESET_SLEEP_MAX_US  2000
 143#define I2C_RESET_SLEEP_MIN_US  1000
 144
 145/* choose timeout length from legacy driver; it's well tested */
 146#define I2C_ABORT_TIMEOUT       msecs_to_jiffies(100)
 147
 148struct fsi_i2c_master {
 149        struct fsi_device       *fsi;
 150        u8                      fifo_size;
 151        struct list_head        ports;
 152        struct mutex            lock;
 153};
 154
 155struct fsi_i2c_port {
 156        struct list_head        list;
 157        struct i2c_adapter      adapter;
 158        struct fsi_i2c_master   *master;
 159        u16                     port;
 160        u16                     xfrd;
 161};
 162
 163static int fsi_i2c_read_reg(struct fsi_device *fsi, unsigned int reg,
 164                            u32 *data)
 165{
 166        int rc;
 167        __be32 data_be;
 168
 169        rc = fsi_device_read(fsi, reg, &data_be, sizeof(data_be));
 170        if (rc)
 171                return rc;
 172
 173        *data = be32_to_cpu(data_be);
 174
 175        return 0;
 176}
 177
 178static int fsi_i2c_write_reg(struct fsi_device *fsi, unsigned int reg,
 179                             u32 *data)
 180{
 181        __be32 data_be = cpu_to_be32p(data);
 182
 183        return fsi_device_write(fsi, reg, &data_be, sizeof(data_be));
 184}
 185
 186static int fsi_i2c_dev_init(struct fsi_i2c_master *i2c)
 187{
 188        int rc;
 189        u32 mode = I2C_MODE_ENHANCED, extended_status, watermark;
 190        u32 interrupt = 0;
 191
 192        /* since we use polling, disable interrupts */
 193        rc = fsi_i2c_write_reg(i2c->fsi, I2C_FSI_INT_MASK, &interrupt);
 194        if (rc)
 195                return rc;
 196
 197        mode |= FIELD_PREP(I2C_MODE_CLKDIV, I2C_DEFAULT_CLK_DIV);
 198        rc = fsi_i2c_write_reg(i2c->fsi, I2C_FSI_MODE, &mode);
 199        if (rc)
 200                return rc;
 201
 202        rc = fsi_i2c_read_reg(i2c->fsi, I2C_FSI_ESTAT, &extended_status);
 203        if (rc)
 204                return rc;
 205
 206        i2c->fifo_size = FIELD_GET(I2C_ESTAT_FIFO_SZ, extended_status);
 207        watermark = FIELD_PREP(I2C_WATERMARK_HI,
 208                               i2c->fifo_size - I2C_FIFO_HI_LVL);
 209        watermark |= FIELD_PREP(I2C_WATERMARK_LO, I2C_FIFO_LO_LVL);
 210
 211        return fsi_i2c_write_reg(i2c->fsi, I2C_FSI_WATER_MARK, &watermark);
 212}
 213
 214static int fsi_i2c_set_port(struct fsi_i2c_port *port)
 215{
 216        int rc;
 217        struct fsi_device *fsi = port->master->fsi;
 218        u32 mode, dummy = 0;
 219
 220        rc = fsi_i2c_read_reg(fsi, I2C_FSI_MODE, &mode);
 221        if (rc)
 222                return rc;
 223
 224        if (FIELD_GET(I2C_MODE_PORT, mode) == port->port)
 225                return 0;
 226
 227        mode = (mode & ~I2C_MODE_PORT) | FIELD_PREP(I2C_MODE_PORT, port->port);
 228        rc = fsi_i2c_write_reg(fsi, I2C_FSI_MODE, &mode);
 229        if (rc)
 230                return rc;
 231
 232        /* reset engine when port is changed */
 233        return fsi_i2c_write_reg(fsi, I2C_FSI_RESET_ERR, &dummy);
 234}
 235
 236static int fsi_i2c_start(struct fsi_i2c_port *port, struct i2c_msg *msg,
 237                         bool stop)
 238{
 239        struct fsi_i2c_master *i2c = port->master;
 240        u32 cmd = I2C_CMD_WITH_START | I2C_CMD_WITH_ADDR;
 241
 242        port->xfrd = 0;
 243
 244        if (msg->flags & I2C_M_RD)
 245                cmd |= I2C_CMD_READ;
 246
 247        if (stop || msg->flags & I2C_M_STOP)
 248                cmd |= I2C_CMD_WITH_STOP;
 249
 250        cmd |= FIELD_PREP(I2C_CMD_ADDR, msg->addr);
 251        cmd |= FIELD_PREP(I2C_CMD_LEN, msg->len);
 252
 253        return fsi_i2c_write_reg(i2c->fsi, I2C_FSI_CMD, &cmd);
 254}
 255
 256static int fsi_i2c_get_op_bytes(int op_bytes)
 257{
 258        /* fsi is limited to max 4 byte aligned ops */
 259        if (op_bytes > 4)
 260                return 4;
 261        else if (op_bytes == 3)
 262                return 2;
 263        return op_bytes;
 264}
 265
 266static int fsi_i2c_write_fifo(struct fsi_i2c_port *port, struct i2c_msg *msg,
 267                              u8 fifo_count)
 268{
 269        int write;
 270        int rc;
 271        struct fsi_i2c_master *i2c = port->master;
 272        int bytes_to_write = i2c->fifo_size - fifo_count;
 273        int bytes_remaining = msg->len - port->xfrd;
 274
 275        bytes_to_write = min(bytes_to_write, bytes_remaining);
 276
 277        while (bytes_to_write) {
 278                write = fsi_i2c_get_op_bytes(bytes_to_write);
 279
 280                rc = fsi_device_write(i2c->fsi, I2C_FSI_FIFO,
 281                                      &msg->buf[port->xfrd], write);
 282                if (rc)
 283                        return rc;
 284
 285                port->xfrd += write;
 286                bytes_to_write -= write;
 287        }
 288
 289        return 0;
 290}
 291
 292static int fsi_i2c_read_fifo(struct fsi_i2c_port *port, struct i2c_msg *msg,
 293                             u8 fifo_count)
 294{
 295        int read;
 296        int rc;
 297        struct fsi_i2c_master *i2c = port->master;
 298        int bytes_to_read;
 299        int xfr_remaining = msg->len - port->xfrd;
 300        u32 dummy;
 301
 302        bytes_to_read = min_t(int, fifo_count, xfr_remaining);
 303
 304        while (bytes_to_read) {
 305                read = fsi_i2c_get_op_bytes(bytes_to_read);
 306
 307                if (xfr_remaining) {
 308                        rc = fsi_device_read(i2c->fsi, I2C_FSI_FIFO,
 309                                             &msg->buf[port->xfrd], read);
 310                        if (rc)
 311                                return rc;
 312
 313                        port->xfrd += read;
 314                        xfr_remaining -= read;
 315                } else {
 316                        /* no more buffer but data in fifo, need to clear it */
 317                        rc = fsi_device_read(i2c->fsi, I2C_FSI_FIFO, &dummy,
 318                                             read);
 319                        if (rc)
 320                                return rc;
 321                }
 322
 323                bytes_to_read -= read;
 324        }
 325
 326        return 0;
 327}
 328
 329static int fsi_i2c_get_scl(struct i2c_adapter *adap)
 330{
 331        u32 stat = 0;
 332        struct fsi_i2c_port *port = adap->algo_data;
 333        struct fsi_i2c_master *i2c = port->master;
 334
 335        fsi_i2c_read_reg(i2c->fsi, I2C_FSI_STAT, &stat);
 336
 337        return !!(stat & I2C_STAT_SCL_IN);
 338}
 339
 340static void fsi_i2c_set_scl(struct i2c_adapter *adap, int val)
 341{
 342        u32 dummy = 0;
 343        struct fsi_i2c_port *port = adap->algo_data;
 344        struct fsi_i2c_master *i2c = port->master;
 345
 346        if (val)
 347                fsi_i2c_write_reg(i2c->fsi, I2C_FSI_SET_SCL, &dummy);
 348        else
 349                fsi_i2c_write_reg(i2c->fsi, I2C_FSI_RESET_SCL, &dummy);
 350}
 351
 352static int fsi_i2c_get_sda(struct i2c_adapter *adap)
 353{
 354        u32 stat = 0;
 355        struct fsi_i2c_port *port = adap->algo_data;
 356        struct fsi_i2c_master *i2c = port->master;
 357
 358        fsi_i2c_read_reg(i2c->fsi, I2C_FSI_STAT, &stat);
 359
 360        return !!(stat & I2C_STAT_SDA_IN);
 361}
 362
 363static void fsi_i2c_set_sda(struct i2c_adapter *adap, int val)
 364{
 365        u32 dummy = 0;
 366        struct fsi_i2c_port *port = adap->algo_data;
 367        struct fsi_i2c_master *i2c = port->master;
 368
 369        if (val)
 370                fsi_i2c_write_reg(i2c->fsi, I2C_FSI_SET_SDA, &dummy);
 371        else
 372                fsi_i2c_write_reg(i2c->fsi, I2C_FSI_RESET_SDA, &dummy);
 373}
 374
 375static void fsi_i2c_prepare_recovery(struct i2c_adapter *adap)
 376{
 377        int rc;
 378        u32 mode;
 379        struct fsi_i2c_port *port = adap->algo_data;
 380        struct fsi_i2c_master *i2c = port->master;
 381
 382        rc = fsi_i2c_read_reg(i2c->fsi, I2C_FSI_MODE, &mode);
 383        if (rc)
 384                return;
 385
 386        mode |= I2C_MODE_DIAG;
 387        fsi_i2c_write_reg(i2c->fsi, I2C_FSI_MODE, &mode);
 388}
 389
 390static void fsi_i2c_unprepare_recovery(struct i2c_adapter *adap)
 391{
 392        int rc;
 393        u32 mode;
 394        struct fsi_i2c_port *port = adap->algo_data;
 395        struct fsi_i2c_master *i2c = port->master;
 396
 397        rc = fsi_i2c_read_reg(i2c->fsi, I2C_FSI_MODE, &mode);
 398        if (rc)
 399                return;
 400
 401        mode &= ~I2C_MODE_DIAG;
 402        fsi_i2c_write_reg(i2c->fsi, I2C_FSI_MODE, &mode);
 403}
 404
 405static int fsi_i2c_reset_bus(struct fsi_i2c_master *i2c,
 406                             struct fsi_i2c_port *port)
 407{
 408        int rc;
 409        u32 stat, dummy = 0;
 410
 411        /* force bus reset, ignore errors */
 412        i2c_recover_bus(&port->adapter);
 413
 414        /* reset errors */
 415        rc = fsi_i2c_write_reg(i2c->fsi, I2C_FSI_RESET_ERR, &dummy);
 416        if (rc)
 417                return rc;
 418
 419        /* wait for command complete */
 420        usleep_range(I2C_RESET_SLEEP_MIN_US, I2C_RESET_SLEEP_MAX_US);
 421
 422        rc = fsi_i2c_read_reg(i2c->fsi, I2C_FSI_STAT, &stat);
 423        if (rc)
 424                return rc;
 425
 426        if (stat & I2C_STAT_CMD_COMP)
 427                return 0;
 428
 429        /* failed to get command complete; reset engine again */
 430        rc = fsi_i2c_write_reg(i2c->fsi, I2C_FSI_RESET_I2C, &dummy);
 431        if (rc)
 432                return rc;
 433
 434        /* re-init engine again */
 435        return fsi_i2c_dev_init(i2c);
 436}
 437
 438static int fsi_i2c_reset_engine(struct fsi_i2c_master *i2c, u16 port)
 439{
 440        int rc;
 441        u32 mode, dummy = 0;
 442
 443        /* reset engine */
 444        rc = fsi_i2c_write_reg(i2c->fsi, I2C_FSI_RESET_I2C, &dummy);
 445        if (rc)
 446                return rc;
 447
 448        /* re-init engine */
 449        rc = fsi_i2c_dev_init(i2c);
 450        if (rc)
 451                return rc;
 452
 453        rc = fsi_i2c_read_reg(i2c->fsi, I2C_FSI_MODE, &mode);
 454        if (rc)
 455                return rc;
 456
 457        /* set port; default after reset is 0 */
 458        if (port) {
 459                mode &= ~I2C_MODE_PORT;
 460                mode |= FIELD_PREP(I2C_MODE_PORT, port);
 461                rc = fsi_i2c_write_reg(i2c->fsi, I2C_FSI_MODE, &mode);
 462                if (rc)
 463                        return rc;
 464        }
 465
 466        /* reset busy register; hw workaround */
 467        dummy = I2C_PORT_BUSY_RESET;
 468        rc = fsi_i2c_write_reg(i2c->fsi, I2C_FSI_PORT_BUSY, &dummy);
 469        if (rc)
 470                return rc;
 471
 472        return 0;
 473}
 474
 475static int fsi_i2c_abort(struct fsi_i2c_port *port, u32 status)
 476{
 477        int rc;
 478        unsigned long start;
 479        u32 cmd = I2C_CMD_WITH_STOP;
 480        u32 stat;
 481        struct fsi_i2c_master *i2c = port->master;
 482        struct fsi_device *fsi = i2c->fsi;
 483
 484        rc = fsi_i2c_reset_engine(i2c, port->port);
 485        if (rc)
 486                return rc;
 487
 488        rc = fsi_i2c_read_reg(fsi, I2C_FSI_STAT, &stat);
 489        if (rc)
 490                return rc;
 491
 492        /* if sda is low, peform full bus reset */
 493        if (!(stat & I2C_STAT_SDA_IN)) {
 494                rc = fsi_i2c_reset_bus(i2c, port);
 495                if (rc)
 496                        return rc;
 497        }
 498
 499        /* skip final stop command for these errors */
 500        if (status & (I2C_STAT_PARITY | I2C_STAT_LOST_ARB | I2C_STAT_STOP_ERR))
 501                return 0;
 502
 503        /* write stop command */
 504        rc = fsi_i2c_write_reg(fsi, I2C_FSI_CMD, &cmd);
 505        if (rc)
 506                return rc;
 507
 508        /* wait until we see command complete in the master */
 509        start = jiffies;
 510
 511        do {
 512                rc = fsi_i2c_read_reg(fsi, I2C_FSI_STAT, &status);
 513                if (rc)
 514                        return rc;
 515
 516                if (status & I2C_STAT_CMD_COMP)
 517                        return 0;
 518
 519                usleep_range(I2C_CMD_SLEEP_MIN_US, I2C_CMD_SLEEP_MAX_US);
 520        } while (time_after(start + I2C_ABORT_TIMEOUT, jiffies));
 521
 522        return -ETIMEDOUT;
 523}
 524
 525static int fsi_i2c_handle_status(struct fsi_i2c_port *port,
 526                                 struct i2c_msg *msg, u32 status)
 527{
 528        int rc;
 529        u8 fifo_count;
 530
 531        if (status & I2C_STAT_ERR) {
 532                rc = fsi_i2c_abort(port, status);
 533                if (rc)
 534                        return rc;
 535
 536                if (status & I2C_STAT_INV_CMD)
 537                        return -EINVAL;
 538
 539                if (status & (I2C_STAT_PARITY | I2C_STAT_BE_OVERRUN |
 540                    I2C_STAT_BE_ACCESS))
 541                        return -EPROTO;
 542
 543                if (status & I2C_STAT_NACK)
 544                        return -ENXIO;
 545
 546                if (status & I2C_STAT_LOST_ARB)
 547                        return -EAGAIN;
 548
 549                if (status & I2C_STAT_STOP_ERR)
 550                        return -EBADMSG;
 551
 552                return -EIO;
 553        }
 554
 555        if (status & I2C_STAT_DAT_REQ) {
 556                fifo_count = FIELD_GET(I2C_STAT_FIFO_COUNT, status);
 557
 558                if (msg->flags & I2C_M_RD)
 559                        return fsi_i2c_read_fifo(port, msg, fifo_count);
 560
 561                return fsi_i2c_write_fifo(port, msg, fifo_count);
 562        }
 563
 564        if (status & I2C_STAT_CMD_COMP) {
 565                if (port->xfrd < msg->len)
 566                        return -ENODATA;
 567
 568                return msg->len;
 569        }
 570
 571        return 0;
 572}
 573
 574static int fsi_i2c_wait(struct fsi_i2c_port *port, struct i2c_msg *msg,
 575                        unsigned long timeout)
 576{
 577        u32 status = 0;
 578        int rc;
 579        unsigned long start = jiffies;
 580
 581        do {
 582                rc = fsi_i2c_read_reg(port->master->fsi, I2C_FSI_STAT,
 583                                      &status);
 584                if (rc)
 585                        return rc;
 586
 587                if (status & I2C_STAT_ANY_RESP) {
 588                        rc = fsi_i2c_handle_status(port, msg, status);
 589                        if (rc < 0)
 590                                return rc;
 591
 592                        /* cmd complete and all data xfrd */
 593                        if (rc == msg->len)
 594                                return 0;
 595
 596                        /* need to xfr more data, but maybe don't need wait */
 597                        continue;
 598                }
 599
 600                usleep_range(I2C_CMD_SLEEP_MIN_US, I2C_CMD_SLEEP_MAX_US);
 601        } while (time_after(start + timeout, jiffies));
 602
 603        return -ETIMEDOUT;
 604}
 605
 606static int fsi_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
 607                        int num)
 608{
 609        int i, rc;
 610        unsigned long start_time;
 611        struct fsi_i2c_port *port = adap->algo_data;
 612        struct fsi_i2c_master *master = port->master;
 613        struct i2c_msg *msg;
 614
 615        mutex_lock(&master->lock);
 616
 617        rc = fsi_i2c_set_port(port);
 618        if (rc)
 619                goto unlock;
 620
 621        for (i = 0; i < num; i++) {
 622                msg = msgs + i;
 623                start_time = jiffies;
 624
 625                rc = fsi_i2c_start(port, msg, i == num - 1);
 626                if (rc)
 627                        goto unlock;
 628
 629                rc = fsi_i2c_wait(port, msg,
 630                                  adap->timeout - (jiffies - start_time));
 631                if (rc)
 632                        goto unlock;
 633        }
 634
 635unlock:
 636        mutex_unlock(&master->lock);
 637        return rc ? : num;
 638}
 639
 640static u32 fsi_i2c_functionality(struct i2c_adapter *adap)
 641{
 642        return I2C_FUNC_I2C | I2C_FUNC_PROTOCOL_MANGLING |
 643                I2C_FUNC_SMBUS_EMUL | I2C_FUNC_SMBUS_BLOCK_DATA;
 644}
 645
 646static struct i2c_bus_recovery_info fsi_i2c_bus_recovery_info = {
 647        .recover_bus = i2c_generic_scl_recovery,
 648        .get_scl = fsi_i2c_get_scl,
 649        .set_scl = fsi_i2c_set_scl,
 650        .get_sda = fsi_i2c_get_sda,
 651        .set_sda = fsi_i2c_set_sda,
 652        .prepare_recovery = fsi_i2c_prepare_recovery,
 653        .unprepare_recovery = fsi_i2c_unprepare_recovery,
 654};
 655
 656static const struct i2c_algorithm fsi_i2c_algorithm = {
 657        .master_xfer = fsi_i2c_xfer,
 658        .functionality = fsi_i2c_functionality,
 659};
 660
 661static struct device_node *fsi_i2c_find_port_of_node(struct device_node *fsi,
 662                                                     int port)
 663{
 664        struct device_node *np;
 665        u32 port_no;
 666        int rc;
 667
 668        for_each_child_of_node(fsi, np) {
 669                rc = of_property_read_u32(np, "reg", &port_no);
 670                if (!rc && port_no == port)
 671                        return np;
 672        }
 673
 674        return NULL;
 675}
 676
 677static int fsi_i2c_probe(struct device *dev)
 678{
 679        struct fsi_i2c_master *i2c;
 680        struct fsi_i2c_port *port;
 681        struct device_node *np;
 682        u32 port_no, ports, stat;
 683        int rc;
 684
 685        i2c = devm_kzalloc(dev, sizeof(*i2c), GFP_KERNEL);
 686        if (!i2c)
 687                return -ENOMEM;
 688
 689        mutex_init(&i2c->lock);
 690        i2c->fsi = to_fsi_dev(dev);
 691        INIT_LIST_HEAD(&i2c->ports);
 692
 693        rc = fsi_i2c_dev_init(i2c);
 694        if (rc)
 695                return rc;
 696
 697        rc = fsi_i2c_read_reg(i2c->fsi, I2C_FSI_STAT, &stat);
 698        if (rc)
 699                return rc;
 700
 701        ports = FIELD_GET(I2C_STAT_MAX_PORT, stat) + 1;
 702        dev_dbg(dev, "I2C master has %d ports\n", ports);
 703
 704        for (port_no = 0; port_no < ports; port_no++) {
 705                np = fsi_i2c_find_port_of_node(dev->of_node, port_no);
 706                if (!of_device_is_available(np))
 707                        continue;
 708
 709                port = kzalloc(sizeof(*port), GFP_KERNEL);
 710                if (!port) {
 711                        of_node_put(np);
 712                        break;
 713                }
 714
 715                port->master = i2c;
 716                port->port = port_no;
 717
 718                port->adapter.owner = THIS_MODULE;
 719                port->adapter.dev.of_node = np;
 720                port->adapter.dev.parent = dev;
 721                port->adapter.algo = &fsi_i2c_algorithm;
 722                port->adapter.bus_recovery_info = &fsi_i2c_bus_recovery_info;
 723                port->adapter.algo_data = port;
 724
 725                snprintf(port->adapter.name, sizeof(port->adapter.name),
 726                         "i2c_bus-%u", port_no);
 727
 728                rc = i2c_add_adapter(&port->adapter);
 729                if (rc < 0) {
 730                        dev_err(dev, "Failed to register adapter: %d\n", rc);
 731                        kfree(port);
 732                        continue;
 733                }
 734
 735                list_add(&port->list, &i2c->ports);
 736        }
 737
 738        dev_set_drvdata(dev, i2c);
 739
 740        return 0;
 741}
 742
 743static int fsi_i2c_remove(struct device *dev)
 744{
 745        struct fsi_i2c_master *i2c = dev_get_drvdata(dev);
 746        struct fsi_i2c_port *port, *tmp;
 747
 748        list_for_each_entry_safe(port, tmp, &i2c->ports, list) {
 749                list_del(&port->list);
 750                i2c_del_adapter(&port->adapter);
 751                kfree(port);
 752        }
 753
 754        return 0;
 755}
 756
 757static const struct fsi_device_id fsi_i2c_ids[] = {
 758        { FSI_ENGID_I2C, FSI_VERSION_ANY },
 759        { }
 760};
 761
 762static struct fsi_driver fsi_i2c_driver = {
 763        .id_table = fsi_i2c_ids,
 764        .drv = {
 765                .name = "i2c-fsi",
 766                .bus = &fsi_bus_type,
 767                .probe = fsi_i2c_probe,
 768                .remove = fsi_i2c_remove,
 769        },
 770};
 771
 772module_fsi_driver(fsi_i2c_driver);
 773
 774MODULE_AUTHOR("Eddie James <eajames@us.ibm.com>");
 775MODULE_DESCRIPTION("FSI attached I2C master");
 776MODULE_LICENSE("GPL");
 777