root/drivers/net/ethernet/mellanox/mlxsw/i2c.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mlxsw_i2c_convert_mbox
  2. mlxsw_i2c_get_reg_size
  3. mlxsw_i2c_set_slave_addr
  4. mlxsw_i2c_wait_go_bit
  5. mlxsw_i2c_write_cmd
  6. mlxsw_i2c_write_init_cmd
  7. mlxsw_i2c_get_mbox
  8. mlxsw_i2c_write
  9. mlxsw_i2c_cmd
  10. mlxsw_i2c_cmd_exec
  11. mlxsw_i2c_skb_transmit_busy
  12. mlxsw_i2c_skb_transmit
  13. mlxsw_i2c_init
  14. mlxsw_i2c_fini
  15. mlxsw_i2c_probe
  16. mlxsw_i2c_remove
  17. mlxsw_i2c_driver_register
  18. mlxsw_i2c_driver_unregister

   1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
   2 /* Copyright (c) 2016-2018 Mellanox Technologies. All rights reserved */
   3 
   4 #include <linux/err.h>
   5 #include <linux/i2c.h>
   6 #include <linux/init.h>
   7 #include <linux/jiffies.h>
   8 #include <linux/kernel.h>
   9 #include <linux/mutex.h>
  10 #include <linux/module.h>
  11 #include <linux/mod_devicetable.h>
  12 #include <linux/slab.h>
  13 
  14 #include "cmd.h"
  15 #include "core.h"
  16 #include "i2c.h"
  17 #include "resources.h"
  18 
  19 #define MLXSW_I2C_CIR2_BASE             0x72000
  20 #define MLXSW_I2C_CIR_STATUS_OFF        0x18
  21 #define MLXSW_I2C_CIR2_OFF_STATUS       (MLXSW_I2C_CIR2_BASE + \
  22                                          MLXSW_I2C_CIR_STATUS_OFF)
  23 #define MLXSW_I2C_OPMOD_SHIFT           12
  24 #define MLXSW_I2C_EVENT_BIT_SHIFT       22
  25 #define MLXSW_I2C_GO_BIT_SHIFT          23
  26 #define MLXSW_I2C_CIR_CTRL_STATUS_SHIFT 24
  27 #define MLXSW_I2C_EVENT_BIT             BIT(MLXSW_I2C_EVENT_BIT_SHIFT)
  28 #define MLXSW_I2C_GO_BIT                BIT(MLXSW_I2C_GO_BIT_SHIFT)
  29 #define MLXSW_I2C_GO_OPMODE             BIT(MLXSW_I2C_OPMOD_SHIFT)
  30 #define MLXSW_I2C_SET_IMM_CMD           (MLXSW_I2C_GO_OPMODE | \
  31                                          MLXSW_CMD_OPCODE_QUERY_FW)
  32 #define MLXSW_I2C_PUSH_IMM_CMD          (MLXSW_I2C_GO_BIT | \
  33                                          MLXSW_I2C_SET_IMM_CMD)
  34 #define MLXSW_I2C_SET_CMD               (MLXSW_CMD_OPCODE_ACCESS_REG)
  35 #define MLXSW_I2C_PUSH_CMD              (MLXSW_I2C_GO_BIT | MLXSW_I2C_SET_CMD)
  36 #define MLXSW_I2C_TLV_HDR_SIZE          0x10
  37 #define MLXSW_I2C_ADDR_WIDTH            4
  38 #define MLXSW_I2C_PUSH_CMD_SIZE         (MLXSW_I2C_ADDR_WIDTH + 4)
  39 #define MLXSW_I2C_SET_EVENT_CMD         (MLXSW_I2C_EVENT_BIT)
  40 #define MLXSW_I2C_PUSH_EVENT_CMD        (MLXSW_I2C_GO_BIT | \
  41                                          MLXSW_I2C_SET_EVENT_CMD)
  42 #define MLXSW_I2C_READ_SEMA_SIZE        4
  43 #define MLXSW_I2C_PREP_SIZE             (MLXSW_I2C_ADDR_WIDTH + 28)
  44 #define MLXSW_I2C_MBOX_SIZE             20
  45 #define MLXSW_I2C_MBOX_OUT_PARAM_OFF    12
  46 #define MLXSW_I2C_MBOX_OFFSET_BITS      20
  47 #define MLXSW_I2C_MBOX_SIZE_BITS        12
  48 #define MLXSW_I2C_ADDR_BUF_SIZE         4
  49 #define MLXSW_I2C_BLK_DEF               32
  50 #define MLXSW_I2C_RETRY                 5
  51 #define MLXSW_I2C_TIMEOUT_MSECS         5000
  52 #define MLXSW_I2C_MAX_DATA_SIZE         256
  53 
  54 /**
  55  * struct mlxsw_i2c - device private data:
  56  * @cmd.mb_size_in: input mailbox size;
  57  * @cmd.mb_off_in: input mailbox offset in register space;
  58  * @cmd.mb_size_out: output mailbox size;
  59  * @cmd.mb_off_out: output mailbox offset in register space;
  60  * @cmd.lock: command execution lock;
  61  * @dev: I2C device;
  62  * @core: switch core pointer;
  63  * @bus_info: bus info block;
  64  * @block_size: maximum block size allowed to pass to under layer;
  65  */
  66 struct mlxsw_i2c {
  67         struct {
  68                 u32 mb_size_in;
  69                 u32 mb_off_in;
  70                 u32 mb_size_out;
  71                 u32 mb_off_out;
  72                 struct mutex lock;
  73         } cmd;
  74         struct device *dev;
  75         struct mlxsw_core *core;
  76         struct mlxsw_bus_info bus_info;
  77         u16 block_size;
  78 };
  79 
  80 #define MLXSW_I2C_READ_MSG(_client, _addr_buf, _buf, _len) {    \
  81         { .addr = (_client)->addr,                              \
  82           .buf = (_addr_buf),                                   \
  83           .len = MLXSW_I2C_ADDR_BUF_SIZE,                       \
  84           .flags = 0 },                                         \
  85         { .addr = (_client)->addr,                              \
  86           .buf = (_buf),                                        \
  87           .len = (_len),                                        \
  88           .flags = I2C_M_RD } }
  89 
  90 #define MLXSW_I2C_WRITE_MSG(_client, _buf, _len)                \
  91         { .addr = (_client)->addr,                              \
  92           .buf = (u8 *)(_buf),                                  \
  93           .len = (_len),                                        \
  94           .flags = 0 }
  95 
  96 /* Routine converts in and out mail boxes offset and size. */
  97 static inline void
  98 mlxsw_i2c_convert_mbox(struct mlxsw_i2c *mlxsw_i2c, u8 *buf)
  99 {
 100         u32 tmp;
 101 
 102         /* Local in/out mailboxes: 20 bits for offset, 12 for size */
 103         tmp = be32_to_cpup((__be32 *) buf);
 104         mlxsw_i2c->cmd.mb_off_in = tmp &
 105                                    GENMASK(MLXSW_I2C_MBOX_OFFSET_BITS - 1, 0);
 106         mlxsw_i2c->cmd.mb_size_in = (tmp & GENMASK(31,
 107                                         MLXSW_I2C_MBOX_OFFSET_BITS)) >>
 108                                         MLXSW_I2C_MBOX_OFFSET_BITS;
 109 
 110         tmp = be32_to_cpup((__be32 *) (buf + MLXSW_I2C_ADDR_WIDTH));
 111         mlxsw_i2c->cmd.mb_off_out = tmp &
 112                                     GENMASK(MLXSW_I2C_MBOX_OFFSET_BITS - 1, 0);
 113         mlxsw_i2c->cmd.mb_size_out = (tmp & GENMASK(31,
 114                                         MLXSW_I2C_MBOX_OFFSET_BITS)) >>
 115                                         MLXSW_I2C_MBOX_OFFSET_BITS;
 116 }
 117 
 118 /* Routine obtains register size from mail box buffer. */
 119 static inline int mlxsw_i2c_get_reg_size(u8 *in_mbox)
 120 {
 121         u16  tmp = be16_to_cpup((__be16 *) (in_mbox + MLXSW_I2C_TLV_HDR_SIZE));
 122 
 123         return (tmp & 0x7ff) * 4 + MLXSW_I2C_TLV_HDR_SIZE;
 124 }
 125 
 126 /* Routine sets I2C device internal offset in the transaction buffer. */
 127 static inline void mlxsw_i2c_set_slave_addr(u8 *buf, u32 off)
 128 {
 129         __be32 *val = (__be32 *) buf;
 130 
 131         *val = htonl(off);
 132 }
 133 
 134 /* Routine waits until go bit is cleared. */
 135 static int mlxsw_i2c_wait_go_bit(struct i2c_client *client,
 136                                  struct mlxsw_i2c *mlxsw_i2c, u8 *p_status)
 137 {
 138         u8 addr_buf[MLXSW_I2C_ADDR_BUF_SIZE];
 139         u8 buf[MLXSW_I2C_READ_SEMA_SIZE];
 140         int len = MLXSW_I2C_READ_SEMA_SIZE;
 141         struct i2c_msg read_sema[] =
 142                 MLXSW_I2C_READ_MSG(client, addr_buf, buf, len);
 143         bool wait_done = false;
 144         unsigned long end;
 145         int i = 0, err;
 146 
 147         mlxsw_i2c_set_slave_addr(addr_buf, MLXSW_I2C_CIR2_OFF_STATUS);
 148 
 149         end = jiffies + msecs_to_jiffies(MLXSW_I2C_TIMEOUT_MSECS);
 150         do {
 151                 u32 ctrl;
 152 
 153                 err = i2c_transfer(client->adapter, read_sema,
 154                                    ARRAY_SIZE(read_sema));
 155 
 156                 ctrl = be32_to_cpu(*(__be32 *) buf);
 157                 if (err == ARRAY_SIZE(read_sema)) {
 158                         if (!(ctrl & MLXSW_I2C_GO_BIT)) {
 159                                 wait_done = true;
 160                                 *p_status = ctrl >>
 161                                             MLXSW_I2C_CIR_CTRL_STATUS_SHIFT;
 162                                 break;
 163                         }
 164                 }
 165                 cond_resched();
 166         } while ((time_before(jiffies, end)) || (i++ < MLXSW_I2C_RETRY));
 167 
 168         if (wait_done) {
 169                 if (*p_status)
 170                         err = -EIO;
 171         } else {
 172                 return -ETIMEDOUT;
 173         }
 174 
 175         return err > 0 ? 0 : err;
 176 }
 177 
 178 /* Routine posts a command to ASIC through mail box. */
 179 static int mlxsw_i2c_write_cmd(struct i2c_client *client,
 180                                struct mlxsw_i2c *mlxsw_i2c,
 181                                int immediate)
 182 {
 183         __be32 push_cmd_buf[MLXSW_I2C_PUSH_CMD_SIZE / 4] = {
 184                 0, cpu_to_be32(MLXSW_I2C_PUSH_IMM_CMD)
 185         };
 186         __be32 prep_cmd_buf[MLXSW_I2C_PREP_SIZE / 4] = {
 187                 0, 0, 0, 0, 0, 0,
 188                 cpu_to_be32(client->adapter->nr & 0xffff),
 189                 cpu_to_be32(MLXSW_I2C_SET_IMM_CMD)
 190         };
 191         struct i2c_msg push_cmd =
 192                 MLXSW_I2C_WRITE_MSG(client, push_cmd_buf,
 193                                     MLXSW_I2C_PUSH_CMD_SIZE);
 194         struct i2c_msg prep_cmd =
 195                 MLXSW_I2C_WRITE_MSG(client, prep_cmd_buf, MLXSW_I2C_PREP_SIZE);
 196         int err;
 197 
 198         if (!immediate) {
 199                 push_cmd_buf[1] = cpu_to_be32(MLXSW_I2C_PUSH_CMD);
 200                 prep_cmd_buf[7] = cpu_to_be32(MLXSW_I2C_SET_CMD);
 201         }
 202         mlxsw_i2c_set_slave_addr((u8 *)prep_cmd_buf,
 203                                  MLXSW_I2C_CIR2_BASE);
 204         mlxsw_i2c_set_slave_addr((u8 *)push_cmd_buf,
 205                                  MLXSW_I2C_CIR2_OFF_STATUS);
 206 
 207         /* Prepare Command Interface Register for transaction */
 208         err = i2c_transfer(client->adapter, &prep_cmd, 1);
 209         if (err < 0)
 210                 return err;
 211         else if (err != 1)
 212                 return -EIO;
 213 
 214         /* Write out Command Interface Register GO bit to push transaction */
 215         err = i2c_transfer(client->adapter, &push_cmd, 1);
 216         if (err < 0)
 217                 return err;
 218         else if (err != 1)
 219                 return -EIO;
 220 
 221         return 0;
 222 }
 223 
 224 /* Routine posts initialization command to ASIC through mail box. */
 225 static int
 226 mlxsw_i2c_write_init_cmd(struct i2c_client *client,
 227                          struct mlxsw_i2c *mlxsw_i2c, u16 opcode, u32 in_mod)
 228 {
 229         __be32 push_cmd_buf[MLXSW_I2C_PUSH_CMD_SIZE / 4] = {
 230                 0, cpu_to_be32(MLXSW_I2C_PUSH_EVENT_CMD)
 231         };
 232         __be32 prep_cmd_buf[MLXSW_I2C_PREP_SIZE / 4] = {
 233                 0, 0, 0, 0, 0, 0,
 234                 cpu_to_be32(client->adapter->nr & 0xffff),
 235                 cpu_to_be32(MLXSW_I2C_SET_EVENT_CMD)
 236         };
 237         struct i2c_msg push_cmd =
 238                 MLXSW_I2C_WRITE_MSG(client, push_cmd_buf,
 239                                     MLXSW_I2C_PUSH_CMD_SIZE);
 240         struct i2c_msg prep_cmd =
 241                 MLXSW_I2C_WRITE_MSG(client, prep_cmd_buf, MLXSW_I2C_PREP_SIZE);
 242         u8 status;
 243         int err;
 244 
 245         push_cmd_buf[1] = cpu_to_be32(MLXSW_I2C_PUSH_EVENT_CMD | opcode);
 246         prep_cmd_buf[3] = cpu_to_be32(in_mod);
 247         prep_cmd_buf[7] = cpu_to_be32(MLXSW_I2C_GO_BIT | opcode);
 248         mlxsw_i2c_set_slave_addr((u8 *)prep_cmd_buf,
 249                                  MLXSW_I2C_CIR2_BASE);
 250         mlxsw_i2c_set_slave_addr((u8 *)push_cmd_buf,
 251                                  MLXSW_I2C_CIR2_OFF_STATUS);
 252 
 253         /* Prepare Command Interface Register for transaction */
 254         err = i2c_transfer(client->adapter, &prep_cmd, 1);
 255         if (err < 0)
 256                 return err;
 257         else if (err != 1)
 258                 return -EIO;
 259 
 260         /* Write out Command Interface Register GO bit to push transaction */
 261         err = i2c_transfer(client->adapter, &push_cmd, 1);
 262         if (err < 0)
 263                 return err;
 264         else if (err != 1)
 265                 return -EIO;
 266 
 267         /* Wait until go bit is cleared. */
 268         err = mlxsw_i2c_wait_go_bit(client, mlxsw_i2c, &status);
 269         if (err) {
 270                 dev_err(&client->dev, "HW semaphore is not released");
 271                 return err;
 272         }
 273 
 274         /* Validate transaction completion status. */
 275         if (status) {
 276                 dev_err(&client->dev, "Bad transaction completion status %x\n",
 277                         status);
 278                 return -EIO;
 279         }
 280 
 281         return 0;
 282 }
 283 
 284 /* Routine obtains mail box offsets from ASIC register space. */
 285 static int mlxsw_i2c_get_mbox(struct i2c_client *client,
 286                               struct mlxsw_i2c *mlxsw_i2c)
 287 {
 288         u8 addr_buf[MLXSW_I2C_ADDR_BUF_SIZE];
 289         u8 buf[MLXSW_I2C_MBOX_SIZE];
 290         struct i2c_msg mbox_cmd[] =
 291                 MLXSW_I2C_READ_MSG(client, addr_buf, buf, MLXSW_I2C_MBOX_SIZE);
 292         int err;
 293 
 294         /* Read mail boxes offsets. */
 295         mlxsw_i2c_set_slave_addr(addr_buf, MLXSW_I2C_CIR2_BASE);
 296         err = i2c_transfer(client->adapter, mbox_cmd, 2);
 297         if (err != 2) {
 298                 dev_err(&client->dev, "Could not obtain mail boxes\n");
 299                 if (!err)
 300                         return -EIO;
 301                 else
 302                         return err;
 303         }
 304 
 305         /* Convert mail boxes. */
 306         mlxsw_i2c_convert_mbox(mlxsw_i2c, &buf[MLXSW_I2C_MBOX_OUT_PARAM_OFF]);
 307 
 308         return err;
 309 }
 310 
 311 /* Routine sends I2C write transaction to ASIC device. */
 312 static int
 313 mlxsw_i2c_write(struct device *dev, size_t in_mbox_size, u8 *in_mbox, int num,
 314                 u8 *p_status)
 315 {
 316         struct i2c_client *client = to_i2c_client(dev);
 317         struct mlxsw_i2c *mlxsw_i2c = i2c_get_clientdata(client);
 318         unsigned long timeout = msecs_to_jiffies(MLXSW_I2C_TIMEOUT_MSECS);
 319         int off = mlxsw_i2c->cmd.mb_off_in, chunk_size, i, j;
 320         unsigned long end;
 321         u8 *tran_buf;
 322         struct i2c_msg write_tran =
 323                 MLXSW_I2C_WRITE_MSG(client, NULL, MLXSW_I2C_PUSH_CMD_SIZE);
 324         int err;
 325 
 326         tran_buf = kmalloc(mlxsw_i2c->block_size + MLXSW_I2C_ADDR_BUF_SIZE,
 327                            GFP_KERNEL);
 328         if (!tran_buf)
 329                 return -ENOMEM;
 330 
 331         write_tran.buf = tran_buf;
 332         for (i = 0; i < num; i++) {
 333                 chunk_size = (in_mbox_size > mlxsw_i2c->block_size) ?
 334                              mlxsw_i2c->block_size : in_mbox_size;
 335                 write_tran.len = MLXSW_I2C_ADDR_WIDTH + chunk_size;
 336                 mlxsw_i2c_set_slave_addr(tran_buf, off);
 337                 memcpy(&tran_buf[MLXSW_I2C_ADDR_BUF_SIZE], in_mbox +
 338                        mlxsw_i2c->block_size * i, chunk_size);
 339 
 340                 j = 0;
 341                 end = jiffies + timeout;
 342                 do {
 343                         err = i2c_transfer(client->adapter, &write_tran, 1);
 344                         if (err == 1)
 345                                 break;
 346 
 347                         cond_resched();
 348                 } while ((time_before(jiffies, end)) ||
 349                          (j++ < MLXSW_I2C_RETRY));
 350 
 351                 if (err != 1) {
 352                         if (!err) {
 353                                 err = -EIO;
 354                                 goto mlxsw_i2c_write_exit;
 355                         }
 356                 }
 357 
 358                 off += chunk_size;
 359                 in_mbox_size -= chunk_size;
 360         }
 361 
 362         /* Prepare and write out Command Interface Register for transaction. */
 363         err = mlxsw_i2c_write_cmd(client, mlxsw_i2c, 0);
 364         if (err) {
 365                 dev_err(&client->dev, "Could not start transaction");
 366                 err = -EIO;
 367                 goto mlxsw_i2c_write_exit;
 368         }
 369 
 370         /* Wait until go bit is cleared. */
 371         err = mlxsw_i2c_wait_go_bit(client, mlxsw_i2c, p_status);
 372         if (err) {
 373                 dev_err(&client->dev, "HW semaphore is not released");
 374                 goto mlxsw_i2c_write_exit;
 375         }
 376 
 377         /* Validate transaction completion status. */
 378         if (*p_status) {
 379                 dev_err(&client->dev, "Bad transaction completion status %x\n",
 380                         *p_status);
 381                 err = -EIO;
 382         }
 383 
 384 mlxsw_i2c_write_exit:
 385         kfree(tran_buf);
 386         return err;
 387 }
 388 
 389 /* Routine executes I2C command. */
 390 static int
 391 mlxsw_i2c_cmd(struct device *dev, u16 opcode, u32 in_mod, size_t in_mbox_size,
 392               u8 *in_mbox, size_t out_mbox_size, u8 *out_mbox, u8 *status)
 393 {
 394         struct i2c_client *client = to_i2c_client(dev);
 395         struct mlxsw_i2c *mlxsw_i2c = i2c_get_clientdata(client);
 396         unsigned long timeout = msecs_to_jiffies(MLXSW_I2C_TIMEOUT_MSECS);
 397         u8 tran_buf[MLXSW_I2C_ADDR_BUF_SIZE];
 398         int num, chunk_size, reg_size, i, j;
 399         int off = mlxsw_i2c->cmd.mb_off_out;
 400         unsigned long end;
 401         struct i2c_msg read_tran[] =
 402                 MLXSW_I2C_READ_MSG(client, tran_buf, NULL, 0);
 403         int err;
 404 
 405         WARN_ON(in_mbox_size % sizeof(u32) || out_mbox_size % sizeof(u32));
 406 
 407         if (in_mbox) {
 408                 reg_size = mlxsw_i2c_get_reg_size(in_mbox);
 409                 num = reg_size / mlxsw_i2c->block_size;
 410                 if (reg_size % mlxsw_i2c->block_size)
 411                         num++;
 412 
 413                 if (mutex_lock_interruptible(&mlxsw_i2c->cmd.lock) < 0) {
 414                         dev_err(&client->dev, "Could not acquire lock");
 415                         return -EINVAL;
 416                 }
 417 
 418                 err = mlxsw_i2c_write(dev, reg_size, in_mbox, num, status);
 419                 if (err)
 420                         goto cmd_fail;
 421 
 422                 /* No out mailbox is case of write transaction. */
 423                 if (!out_mbox) {
 424                         mutex_unlock(&mlxsw_i2c->cmd.lock);
 425                         return 0;
 426                 }
 427         } else {
 428                 /* No input mailbox is case of initialization query command. */
 429                 reg_size = MLXSW_I2C_MAX_DATA_SIZE;
 430                 num = reg_size / mlxsw_i2c->block_size;
 431 
 432                 if (mutex_lock_interruptible(&mlxsw_i2c->cmd.lock) < 0) {
 433                         dev_err(&client->dev, "Could not acquire lock");
 434                         return -EINVAL;
 435                 }
 436 
 437                 err = mlxsw_i2c_write_init_cmd(client, mlxsw_i2c, opcode,
 438                                                in_mod);
 439                 if (err)
 440                         goto cmd_fail;
 441         }
 442 
 443         /* Send read transaction to get output mailbox content. */
 444         read_tran[1].buf = out_mbox;
 445         for (i = 0; i < num; i++) {
 446                 chunk_size = (reg_size > mlxsw_i2c->block_size) ?
 447                              mlxsw_i2c->block_size : reg_size;
 448                 read_tran[1].len = chunk_size;
 449                 mlxsw_i2c_set_slave_addr(tran_buf, off);
 450 
 451                 j = 0;
 452                 end = jiffies + timeout;
 453                 do {
 454                         err = i2c_transfer(client->adapter, read_tran,
 455                                            ARRAY_SIZE(read_tran));
 456                         if (err == ARRAY_SIZE(read_tran))
 457                                 break;
 458 
 459                         cond_resched();
 460                 } while ((time_before(jiffies, end)) ||
 461                          (j++ < MLXSW_I2C_RETRY));
 462 
 463                 if (err != ARRAY_SIZE(read_tran)) {
 464                         if (!err)
 465                                 err = -EIO;
 466 
 467                         goto cmd_fail;
 468                 }
 469 
 470                 off += chunk_size;
 471                 reg_size -= chunk_size;
 472                 read_tran[1].buf += chunk_size;
 473         }
 474 
 475         mutex_unlock(&mlxsw_i2c->cmd.lock);
 476 
 477         return 0;
 478 
 479 cmd_fail:
 480         mutex_unlock(&mlxsw_i2c->cmd.lock);
 481         return err;
 482 }
 483 
 484 static int mlxsw_i2c_cmd_exec(void *bus_priv, u16 opcode, u8 opcode_mod,
 485                               u32 in_mod, bool out_mbox_direct,
 486                               char *in_mbox, size_t in_mbox_size,
 487                               char *out_mbox, size_t out_mbox_size,
 488                               u8 *status)
 489 {
 490         struct mlxsw_i2c *mlxsw_i2c = bus_priv;
 491 
 492         return mlxsw_i2c_cmd(mlxsw_i2c->dev, opcode, in_mod, in_mbox_size,
 493                              in_mbox, out_mbox_size, out_mbox, status);
 494 }
 495 
 496 static bool mlxsw_i2c_skb_transmit_busy(void *bus_priv,
 497                                         const struct mlxsw_tx_info *tx_info)
 498 {
 499         return false;
 500 }
 501 
 502 static int mlxsw_i2c_skb_transmit(void *bus_priv, struct sk_buff *skb,
 503                                   const struct mlxsw_tx_info *tx_info)
 504 {
 505         return 0;
 506 }
 507 
 508 static int
 509 mlxsw_i2c_init(void *bus_priv, struct mlxsw_core *mlxsw_core,
 510                const struct mlxsw_config_profile *profile,
 511                struct mlxsw_res *res)
 512 {
 513         struct mlxsw_i2c *mlxsw_i2c = bus_priv;
 514         char *mbox;
 515         int err;
 516 
 517         mlxsw_i2c->core = mlxsw_core;
 518 
 519         mbox = mlxsw_cmd_mbox_alloc();
 520         if (!mbox)
 521                 return -ENOMEM;
 522 
 523         err = mlxsw_cmd_query_fw(mlxsw_core, mbox);
 524         if (err)
 525                 goto mbox_put;
 526 
 527         mlxsw_i2c->bus_info.fw_rev.major =
 528                 mlxsw_cmd_mbox_query_fw_fw_rev_major_get(mbox);
 529         mlxsw_i2c->bus_info.fw_rev.minor =
 530                 mlxsw_cmd_mbox_query_fw_fw_rev_minor_get(mbox);
 531         mlxsw_i2c->bus_info.fw_rev.subminor =
 532                 mlxsw_cmd_mbox_query_fw_fw_rev_subminor_get(mbox);
 533 
 534         err = mlxsw_core_resources_query(mlxsw_core, mbox, res);
 535 
 536 mbox_put:
 537         mlxsw_cmd_mbox_free(mbox);
 538         return err;
 539 }
 540 
 541 static void mlxsw_i2c_fini(void *bus_priv)
 542 {
 543         struct mlxsw_i2c *mlxsw_i2c = bus_priv;
 544 
 545         mlxsw_i2c->core = NULL;
 546 }
 547 
 548 static const struct mlxsw_bus mlxsw_i2c_bus = {
 549         .kind                   = "i2c",
 550         .init                   = mlxsw_i2c_init,
 551         .fini                   = mlxsw_i2c_fini,
 552         .skb_transmit_busy      = mlxsw_i2c_skb_transmit_busy,
 553         .skb_transmit           = mlxsw_i2c_skb_transmit,
 554         .cmd_exec               = mlxsw_i2c_cmd_exec,
 555 };
 556 
 557 static int mlxsw_i2c_probe(struct i2c_client *client,
 558                            const struct i2c_device_id *id)
 559 {
 560         const struct i2c_adapter_quirks *quirks = client->adapter->quirks;
 561         struct mlxsw_i2c *mlxsw_i2c;
 562         u8 status;
 563         int err;
 564 
 565         mlxsw_i2c = devm_kzalloc(&client->dev, sizeof(*mlxsw_i2c), GFP_KERNEL);
 566         if (!mlxsw_i2c)
 567                 return -ENOMEM;
 568 
 569         if (quirks) {
 570                 if ((quirks->max_read_len &&
 571                      quirks->max_read_len < MLXSW_I2C_BLK_DEF) ||
 572                     (quirks->max_write_len &&
 573                      quirks->max_write_len < MLXSW_I2C_BLK_DEF)) {
 574                         dev_err(&client->dev, "Insufficient transaction buffer length\n");
 575                         return -EOPNOTSUPP;
 576                 }
 577 
 578                 mlxsw_i2c->block_size = max_t(u16, MLXSW_I2C_BLK_DEF,
 579                                               min_t(u16, quirks->max_read_len,
 580                                                     quirks->max_write_len));
 581         } else {
 582                 mlxsw_i2c->block_size = MLXSW_I2C_BLK_DEF;
 583         }
 584 
 585         i2c_set_clientdata(client, mlxsw_i2c);
 586         mutex_init(&mlxsw_i2c->cmd.lock);
 587 
 588         /* In order to use mailboxes through the i2c, special area is reserved
 589          * on the i2c address space that can be used for input and output
 590          * mailboxes. Such mailboxes are called local mailboxes. When using a
 591          * local mailbox, software should specify 0 as the Input/Output
 592          * parameters. The location of the Local Mailbox addresses on the i2c
 593          * space can be retrieved through the QUERY_FW command.
 594          * For this purpose QUERY_FW is to be issued with opcode modifier equal
 595          * 0x01. For such command the output parameter is an immediate value.
 596          * Here QUERY_FW command is invoked for ASIC probing and for getting
 597          * local mailboxes addresses from immedate output parameters.
 598          */
 599 
 600         /* Prepare and write out Command Interface Register for transaction */
 601         err = mlxsw_i2c_write_cmd(client, mlxsw_i2c, 1);
 602         if (err) {
 603                 dev_err(&client->dev, "Could not start transaction");
 604                 goto errout;
 605         }
 606 
 607         /* Wait until go bit is cleared. */
 608         err = mlxsw_i2c_wait_go_bit(client, mlxsw_i2c, &status);
 609         if (err) {
 610                 dev_err(&client->dev, "HW semaphore is not released");
 611                 goto errout;
 612         }
 613 
 614         /* Validate transaction completion status. */
 615         if (status) {
 616                 dev_err(&client->dev, "Bad transaction completion status %x\n",
 617                         status);
 618                 err = -EIO;
 619                 goto errout;
 620         }
 621 
 622         /* Get mailbox offsets. */
 623         err = mlxsw_i2c_get_mbox(client, mlxsw_i2c);
 624         if (err < 0) {
 625                 dev_err(&client->dev, "Fail to get mailboxes\n");
 626                 goto errout;
 627         }
 628 
 629         dev_info(&client->dev, "%s mb size=%x off=0x%08x out mb size=%x off=0x%08x\n",
 630                  id->name, mlxsw_i2c->cmd.mb_size_in,
 631                  mlxsw_i2c->cmd.mb_off_in, mlxsw_i2c->cmd.mb_size_out,
 632                  mlxsw_i2c->cmd.mb_off_out);
 633 
 634         /* Register device bus. */
 635         mlxsw_i2c->bus_info.device_kind = id->name;
 636         mlxsw_i2c->bus_info.device_name = client->name;
 637         mlxsw_i2c->bus_info.dev = &client->dev;
 638         mlxsw_i2c->bus_info.low_frequency = true;
 639         mlxsw_i2c->dev = &client->dev;
 640 
 641         err = mlxsw_core_bus_device_register(&mlxsw_i2c->bus_info,
 642                                              &mlxsw_i2c_bus, mlxsw_i2c, false,
 643                                              NULL);
 644         if (err) {
 645                 dev_err(&client->dev, "Fail to register core bus\n");
 646                 return err;
 647         }
 648 
 649         return 0;
 650 
 651 errout:
 652         i2c_set_clientdata(client, NULL);
 653 
 654         return err;
 655 }
 656 
 657 static int mlxsw_i2c_remove(struct i2c_client *client)
 658 {
 659         struct mlxsw_i2c *mlxsw_i2c = i2c_get_clientdata(client);
 660 
 661         mlxsw_core_bus_device_unregister(mlxsw_i2c->core, false);
 662         mutex_destroy(&mlxsw_i2c->cmd.lock);
 663 
 664         return 0;
 665 }
 666 
 667 int mlxsw_i2c_driver_register(struct i2c_driver *i2c_driver)
 668 {
 669         i2c_driver->probe = mlxsw_i2c_probe;
 670         i2c_driver->remove = mlxsw_i2c_remove;
 671         return i2c_add_driver(i2c_driver);
 672 }
 673 EXPORT_SYMBOL(mlxsw_i2c_driver_register);
 674 
 675 void mlxsw_i2c_driver_unregister(struct i2c_driver *i2c_driver)
 676 {
 677         i2c_del_driver(i2c_driver);
 678 }
 679 EXPORT_SYMBOL(mlxsw_i2c_driver_unregister);
 680 
 681 MODULE_AUTHOR("Vadim Pasternak <vadimp@mellanox.com>");
 682 MODULE_DESCRIPTION("Mellanox switch I2C interface driver");
 683 MODULE_LICENSE("Dual BSD/GPL");

/* [<][>][^][v][top][bottom][index][help] */