1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /* Copyright (c) 2016-2018 Mellanox Technologies. All rights reserved */
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/platform_data/mlxreg.h>
13 #include <linux/slab.h>
18 #include "resources.h"
20 #define MLXSW_I2C_CIR2_BASE 0x72000
21 #define MLXSW_I2C_CIR_STATUS_OFF 0x18
22 #define MLXSW_I2C_CIR2_OFF_STATUS (MLXSW_I2C_CIR2_BASE + \
23 MLXSW_I2C_CIR_STATUS_OFF)
24 #define MLXSW_I2C_OPMOD_SHIFT 12
25 #define MLXSW_I2C_EVENT_BIT_SHIFT 22
26 #define MLXSW_I2C_GO_BIT_SHIFT 23
27 #define MLXSW_I2C_CIR_CTRL_STATUS_SHIFT 24
28 #define MLXSW_I2C_EVENT_BIT BIT(MLXSW_I2C_EVENT_BIT_SHIFT)
29 #define MLXSW_I2C_GO_BIT BIT(MLXSW_I2C_GO_BIT_SHIFT)
30 #define MLXSW_I2C_GO_OPMODE BIT(MLXSW_I2C_OPMOD_SHIFT)
31 #define MLXSW_I2C_SET_IMM_CMD (MLXSW_I2C_GO_OPMODE | \
32 MLXSW_CMD_OPCODE_QUERY_FW)
33 #define MLXSW_I2C_PUSH_IMM_CMD (MLXSW_I2C_GO_BIT | \
34 MLXSW_I2C_SET_IMM_CMD)
35 #define MLXSW_I2C_SET_CMD (MLXSW_CMD_OPCODE_ACCESS_REG)
36 #define MLXSW_I2C_PUSH_CMD (MLXSW_I2C_GO_BIT | MLXSW_I2C_SET_CMD)
37 #define MLXSW_I2C_TLV_HDR_SIZE 0x10
38 #define MLXSW_I2C_ADDR_WIDTH 4
39 #define MLXSW_I2C_PUSH_CMD_SIZE (MLXSW_I2C_ADDR_WIDTH + 4)
40 #define MLXSW_I2C_SET_EVENT_CMD (MLXSW_I2C_EVENT_BIT)
41 #define MLXSW_I2C_PUSH_EVENT_CMD (MLXSW_I2C_GO_BIT | \
42 MLXSW_I2C_SET_EVENT_CMD)
43 #define MLXSW_I2C_READ_SEMA_SIZE 4
44 #define MLXSW_I2C_PREP_SIZE (MLXSW_I2C_ADDR_WIDTH + 28)
45 #define MLXSW_I2C_MBOX_SIZE 20
46 #define MLXSW_I2C_MBOX_OUT_PARAM_OFF 12
47 #define MLXSW_I2C_MBOX_OFFSET_BITS 20
48 #define MLXSW_I2C_MBOX_SIZE_BITS 12
49 #define MLXSW_I2C_ADDR_BUF_SIZE 4
50 #define MLXSW_I2C_BLK_DEF 32
51 #define MLXSW_I2C_RETRY 5
52 #define MLXSW_I2C_TIMEOUT_MSECS 5000
53 #define MLXSW_I2C_MAX_DATA_SIZE 256
55 /* Driver can be initialized by kernel platform driver or from the user
56 * space. In the first case IRQ line number is passed through the platform
57 * data, otherwise default IRQ line is to be used. Default IRQ is relevant
58 * only for specific I2C slave address, allowing 3.4 MHz I2C path to the chip
59 * (special hardware feature for I2C acceleration).
61 #define MLXSW_I2C_DEFAULT_IRQ 17
62 #define MLXSW_FAST_I2C_SLAVE 0x37
65 * struct mlxsw_i2c - device private data:
66 * @cmd: command attributes;
67 * @cmd.mb_size_in: input mailbox size;
68 * @cmd.mb_off_in: input mailbox offset in register space;
69 * @cmd.mb_size_out: output mailbox size;
70 * @cmd.mb_off_out: output mailbox offset in register space;
71 * @cmd.lock: command execution lock;
73 * @core: switch core pointer;
74 * @bus_info: bus info block;
75 * @block_size: maximum block size allowed to pass to under layer;
76 * @pdata: device platform data;
77 * @irq_work: interrupts work item;
78 * @irq: IRQ line number;
89 struct mlxsw_core *core;
90 struct mlxsw_bus_info bus_info;
92 struct mlxreg_core_hotplug_platform_data *pdata;
93 struct work_struct irq_work;
97 #define MLXSW_I2C_READ_MSG(_client, _addr_buf, _buf, _len) { \
98 { .addr = (_client)->addr, \
100 .len = MLXSW_I2C_ADDR_BUF_SIZE, \
102 { .addr = (_client)->addr, \
105 .flags = I2C_M_RD } }
107 #define MLXSW_I2C_WRITE_MSG(_client, _buf, _len) \
108 { .addr = (_client)->addr, \
109 .buf = (u8 *)(_buf), \
113 /* Routine converts in and out mail boxes offset and size. */
115 mlxsw_i2c_convert_mbox(struct mlxsw_i2c *mlxsw_i2c, u8 *buf)
119 /* Local in/out mailboxes: 20 bits for offset, 12 for size */
120 tmp = be32_to_cpup((__be32 *) buf);
121 mlxsw_i2c->cmd.mb_off_in = tmp &
122 GENMASK(MLXSW_I2C_MBOX_OFFSET_BITS - 1, 0);
123 mlxsw_i2c->cmd.mb_size_in = (tmp & GENMASK(31,
124 MLXSW_I2C_MBOX_OFFSET_BITS)) >>
125 MLXSW_I2C_MBOX_OFFSET_BITS;
127 tmp = be32_to_cpup((__be32 *) (buf + MLXSW_I2C_ADDR_WIDTH));
128 mlxsw_i2c->cmd.mb_off_out = tmp &
129 GENMASK(MLXSW_I2C_MBOX_OFFSET_BITS - 1, 0);
130 mlxsw_i2c->cmd.mb_size_out = (tmp & GENMASK(31,
131 MLXSW_I2C_MBOX_OFFSET_BITS)) >>
132 MLXSW_I2C_MBOX_OFFSET_BITS;
135 /* Routine obtains register size from mail box buffer. */
136 static inline int mlxsw_i2c_get_reg_size(u8 *in_mbox)
138 u16 tmp = be16_to_cpup((__be16 *) (in_mbox + MLXSW_I2C_TLV_HDR_SIZE));
140 return (tmp & 0x7ff) * 4 + MLXSW_I2C_TLV_HDR_SIZE;
143 /* Routine sets I2C device internal offset in the transaction buffer. */
144 static inline void mlxsw_i2c_set_slave_addr(u8 *buf, u32 off)
146 __be32 *val = (__be32 *) buf;
151 /* Routine waits until go bit is cleared. */
152 static int mlxsw_i2c_wait_go_bit(struct i2c_client *client,
153 struct mlxsw_i2c *mlxsw_i2c, u8 *p_status)
155 u8 addr_buf[MLXSW_I2C_ADDR_BUF_SIZE];
156 u8 buf[MLXSW_I2C_READ_SEMA_SIZE];
157 int len = MLXSW_I2C_READ_SEMA_SIZE;
158 struct i2c_msg read_sema[] =
159 MLXSW_I2C_READ_MSG(client, addr_buf, buf, len);
160 bool wait_done = false;
164 mlxsw_i2c_set_slave_addr(addr_buf, MLXSW_I2C_CIR2_OFF_STATUS);
166 end = jiffies + msecs_to_jiffies(MLXSW_I2C_TIMEOUT_MSECS);
170 err = i2c_transfer(client->adapter, read_sema,
171 ARRAY_SIZE(read_sema));
173 ctrl = be32_to_cpu(*(__be32 *) buf);
174 if (err == ARRAY_SIZE(read_sema)) {
175 if (!(ctrl & MLXSW_I2C_GO_BIT)) {
178 MLXSW_I2C_CIR_CTRL_STATUS_SHIFT;
183 } while ((time_before(jiffies, end)) || (i++ < MLXSW_I2C_RETRY));
192 return err > 0 ? 0 : err;
195 /* Routine posts a command to ASIC through mail box. */
196 static int mlxsw_i2c_write_cmd(struct i2c_client *client,
197 struct mlxsw_i2c *mlxsw_i2c,
200 __be32 push_cmd_buf[MLXSW_I2C_PUSH_CMD_SIZE / 4] = {
201 0, cpu_to_be32(MLXSW_I2C_PUSH_IMM_CMD)
203 __be32 prep_cmd_buf[MLXSW_I2C_PREP_SIZE / 4] = {
205 cpu_to_be32(client->adapter->nr & 0xffff),
206 cpu_to_be32(MLXSW_I2C_SET_IMM_CMD)
208 struct i2c_msg push_cmd =
209 MLXSW_I2C_WRITE_MSG(client, push_cmd_buf,
210 MLXSW_I2C_PUSH_CMD_SIZE);
211 struct i2c_msg prep_cmd =
212 MLXSW_I2C_WRITE_MSG(client, prep_cmd_buf, MLXSW_I2C_PREP_SIZE);
216 push_cmd_buf[1] = cpu_to_be32(MLXSW_I2C_PUSH_CMD);
217 prep_cmd_buf[7] = cpu_to_be32(MLXSW_I2C_SET_CMD);
219 mlxsw_i2c_set_slave_addr((u8 *)prep_cmd_buf,
220 MLXSW_I2C_CIR2_BASE);
221 mlxsw_i2c_set_slave_addr((u8 *)push_cmd_buf,
222 MLXSW_I2C_CIR2_OFF_STATUS);
224 /* Prepare Command Interface Register for transaction */
225 err = i2c_transfer(client->adapter, &prep_cmd, 1);
231 /* Write out Command Interface Register GO bit to push transaction */
232 err = i2c_transfer(client->adapter, &push_cmd, 1);
241 /* Routine posts initialization command to ASIC through mail box. */
243 mlxsw_i2c_write_init_cmd(struct i2c_client *client,
244 struct mlxsw_i2c *mlxsw_i2c, u16 opcode, u32 in_mod)
246 __be32 push_cmd_buf[MLXSW_I2C_PUSH_CMD_SIZE / 4] = {
247 0, cpu_to_be32(MLXSW_I2C_PUSH_EVENT_CMD)
249 __be32 prep_cmd_buf[MLXSW_I2C_PREP_SIZE / 4] = {
251 cpu_to_be32(client->adapter->nr & 0xffff),
252 cpu_to_be32(MLXSW_I2C_SET_EVENT_CMD)
254 struct i2c_msg push_cmd =
255 MLXSW_I2C_WRITE_MSG(client, push_cmd_buf,
256 MLXSW_I2C_PUSH_CMD_SIZE);
257 struct i2c_msg prep_cmd =
258 MLXSW_I2C_WRITE_MSG(client, prep_cmd_buf, MLXSW_I2C_PREP_SIZE);
262 push_cmd_buf[1] = cpu_to_be32(MLXSW_I2C_PUSH_EVENT_CMD | opcode);
263 prep_cmd_buf[3] = cpu_to_be32(in_mod);
264 prep_cmd_buf[7] = cpu_to_be32(MLXSW_I2C_GO_BIT | opcode);
265 mlxsw_i2c_set_slave_addr((u8 *)prep_cmd_buf,
266 MLXSW_I2C_CIR2_BASE);
267 mlxsw_i2c_set_slave_addr((u8 *)push_cmd_buf,
268 MLXSW_I2C_CIR2_OFF_STATUS);
270 /* Prepare Command Interface Register for transaction */
271 err = i2c_transfer(client->adapter, &prep_cmd, 1);
277 /* Write out Command Interface Register GO bit to push transaction */
278 err = i2c_transfer(client->adapter, &push_cmd, 1);
284 /* Wait until go bit is cleared. */
285 err = mlxsw_i2c_wait_go_bit(client, mlxsw_i2c, &status);
287 dev_err(&client->dev, "HW semaphore is not released");
291 /* Validate transaction completion status. */
293 dev_err(&client->dev, "Bad transaction completion status %x\n",
301 /* Routine obtains mail box offsets from ASIC register space. */
302 static int mlxsw_i2c_get_mbox(struct i2c_client *client,
303 struct mlxsw_i2c *mlxsw_i2c)
305 u8 addr_buf[MLXSW_I2C_ADDR_BUF_SIZE];
306 u8 buf[MLXSW_I2C_MBOX_SIZE];
307 struct i2c_msg mbox_cmd[] =
308 MLXSW_I2C_READ_MSG(client, addr_buf, buf, MLXSW_I2C_MBOX_SIZE);
311 /* Read mail boxes offsets. */
312 mlxsw_i2c_set_slave_addr(addr_buf, MLXSW_I2C_CIR2_BASE);
313 err = i2c_transfer(client->adapter, mbox_cmd, 2);
315 dev_err(&client->dev, "Could not obtain mail boxes\n");
322 /* Convert mail boxes. */
323 mlxsw_i2c_convert_mbox(mlxsw_i2c, &buf[MLXSW_I2C_MBOX_OUT_PARAM_OFF]);
328 /* Routine sends I2C write transaction to ASIC device. */
330 mlxsw_i2c_write(struct device *dev, size_t in_mbox_size, u8 *in_mbox, int num,
333 struct i2c_client *client = to_i2c_client(dev);
334 struct mlxsw_i2c *mlxsw_i2c = i2c_get_clientdata(client);
335 unsigned long timeout = msecs_to_jiffies(MLXSW_I2C_TIMEOUT_MSECS);
336 int off = mlxsw_i2c->cmd.mb_off_in, chunk_size, i, j;
339 struct i2c_msg write_tran =
340 MLXSW_I2C_WRITE_MSG(client, NULL, MLXSW_I2C_PUSH_CMD_SIZE);
343 tran_buf = kmalloc(mlxsw_i2c->block_size + MLXSW_I2C_ADDR_BUF_SIZE,
348 write_tran.buf = tran_buf;
349 for (i = 0; i < num; i++) {
350 chunk_size = (in_mbox_size > mlxsw_i2c->block_size) ?
351 mlxsw_i2c->block_size : in_mbox_size;
352 write_tran.len = MLXSW_I2C_ADDR_WIDTH + chunk_size;
353 mlxsw_i2c_set_slave_addr(tran_buf, off);
354 memcpy(&tran_buf[MLXSW_I2C_ADDR_BUF_SIZE], in_mbox +
355 mlxsw_i2c->block_size * i, chunk_size);
358 end = jiffies + timeout;
360 err = i2c_transfer(client->adapter, &write_tran, 1);
365 } while ((time_before(jiffies, end)) ||
366 (j++ < MLXSW_I2C_RETRY));
371 goto mlxsw_i2c_write_exit;
376 in_mbox_size -= chunk_size;
379 /* Prepare and write out Command Interface Register for transaction. */
380 err = mlxsw_i2c_write_cmd(client, mlxsw_i2c, 0);
382 dev_err(&client->dev, "Could not start transaction");
384 goto mlxsw_i2c_write_exit;
387 /* Wait until go bit is cleared. */
388 err = mlxsw_i2c_wait_go_bit(client, mlxsw_i2c, p_status);
390 dev_err(&client->dev, "HW semaphore is not released");
391 goto mlxsw_i2c_write_exit;
394 /* Validate transaction completion status. */
396 dev_err(&client->dev, "Bad transaction completion status %x\n",
401 mlxsw_i2c_write_exit:
406 /* Routine executes I2C command. */
408 mlxsw_i2c_cmd(struct device *dev, u16 opcode, u32 in_mod, size_t in_mbox_size,
409 u8 *in_mbox, size_t out_mbox_size, u8 *out_mbox, u8 *status)
411 struct i2c_client *client = to_i2c_client(dev);
412 struct mlxsw_i2c *mlxsw_i2c = i2c_get_clientdata(client);
413 unsigned long timeout = msecs_to_jiffies(MLXSW_I2C_TIMEOUT_MSECS);
414 u8 tran_buf[MLXSW_I2C_ADDR_BUF_SIZE];
415 int num, chunk_size, reg_size, i, j;
416 int off = mlxsw_i2c->cmd.mb_off_out;
418 struct i2c_msg read_tran[] =
419 MLXSW_I2C_READ_MSG(client, tran_buf, NULL, 0);
422 WARN_ON(in_mbox_size % sizeof(u32) || out_mbox_size % sizeof(u32));
425 reg_size = mlxsw_i2c_get_reg_size(in_mbox);
426 num = reg_size / mlxsw_i2c->block_size;
427 if (reg_size % mlxsw_i2c->block_size)
430 if (mutex_lock_interruptible(&mlxsw_i2c->cmd.lock) < 0) {
431 dev_err(&client->dev, "Could not acquire lock");
435 err = mlxsw_i2c_write(dev, reg_size, in_mbox, num, status);
439 /* No out mailbox is case of write transaction. */
441 mutex_unlock(&mlxsw_i2c->cmd.lock);
445 /* No input mailbox is case of initialization query command. */
446 reg_size = MLXSW_I2C_MAX_DATA_SIZE;
447 num = reg_size / mlxsw_i2c->block_size;
449 if (mutex_lock_interruptible(&mlxsw_i2c->cmd.lock) < 0) {
450 dev_err(&client->dev, "Could not acquire lock");
454 err = mlxsw_i2c_write_init_cmd(client, mlxsw_i2c, opcode,
460 /* Send read transaction to get output mailbox content. */
461 read_tran[1].buf = out_mbox;
462 for (i = 0; i < num; i++) {
463 chunk_size = (reg_size > mlxsw_i2c->block_size) ?
464 mlxsw_i2c->block_size : reg_size;
465 read_tran[1].len = chunk_size;
466 mlxsw_i2c_set_slave_addr(tran_buf, off);
469 end = jiffies + timeout;
471 err = i2c_transfer(client->adapter, read_tran,
472 ARRAY_SIZE(read_tran));
473 if (err == ARRAY_SIZE(read_tran))
477 } while ((time_before(jiffies, end)) ||
478 (j++ < MLXSW_I2C_RETRY));
480 if (err != ARRAY_SIZE(read_tran)) {
488 reg_size -= chunk_size;
489 read_tran[1].buf += chunk_size;
492 mutex_unlock(&mlxsw_i2c->cmd.lock);
497 mutex_unlock(&mlxsw_i2c->cmd.lock);
501 static int mlxsw_i2c_cmd_exec(void *bus_priv, u16 opcode, u8 opcode_mod,
502 u32 in_mod, bool out_mbox_direct,
503 char *in_mbox, size_t in_mbox_size,
504 char *out_mbox, size_t out_mbox_size,
507 struct mlxsw_i2c *mlxsw_i2c = bus_priv;
509 return mlxsw_i2c_cmd(mlxsw_i2c->dev, opcode, in_mod, in_mbox_size,
510 in_mbox, out_mbox_size, out_mbox, status);
513 static bool mlxsw_i2c_skb_transmit_busy(void *bus_priv,
514 const struct mlxsw_tx_info *tx_info)
519 static int mlxsw_i2c_skb_transmit(void *bus_priv, struct sk_buff *skb,
520 const struct mlxsw_tx_info *tx_info)
526 mlxsw_i2c_init(void *bus_priv, struct mlxsw_core *mlxsw_core,
527 const struct mlxsw_config_profile *profile,
528 struct mlxsw_res *res)
530 struct mlxsw_i2c *mlxsw_i2c = bus_priv;
534 mlxsw_i2c->core = mlxsw_core;
536 mbox = mlxsw_cmd_mbox_alloc();
540 err = mlxsw_cmd_query_fw(mlxsw_core, mbox);
544 mlxsw_i2c->bus_info.fw_rev.major =
545 mlxsw_cmd_mbox_query_fw_fw_rev_major_get(mbox);
546 mlxsw_i2c->bus_info.fw_rev.minor =
547 mlxsw_cmd_mbox_query_fw_fw_rev_minor_get(mbox);
548 mlxsw_i2c->bus_info.fw_rev.subminor =
549 mlxsw_cmd_mbox_query_fw_fw_rev_subminor_get(mbox);
551 err = mlxsw_core_resources_query(mlxsw_core, mbox, res);
554 mlxsw_cmd_mbox_free(mbox);
558 static void mlxsw_i2c_fini(void *bus_priv)
560 struct mlxsw_i2c *mlxsw_i2c = bus_priv;
562 mlxsw_i2c->core = NULL;
565 static void mlxsw_i2c_work_handler(struct work_struct *work)
567 struct mlxsw_i2c *mlxsw_i2c;
569 mlxsw_i2c = container_of(work, struct mlxsw_i2c, irq_work);
570 mlxsw_core_irq_event_handlers_call(mlxsw_i2c->core);
573 static irqreturn_t mlxsw_i2c_irq_handler(int irq, void *dev)
575 struct mlxsw_i2c *mlxsw_i2c = dev;
577 mlxsw_core_schedule_work(&mlxsw_i2c->irq_work);
579 /* Interrupt handler shares IRQ line with 'main' interrupt handler.
580 * Return here IRQ_NONE, while main handler will return IRQ_HANDLED.
585 static int mlxsw_i2c_irq_init(struct mlxsw_i2c *mlxsw_i2c, u8 addr)
589 /* Initialize interrupt handler if system hotplug driver is reachable,
590 * otherwise interrupt line is not enabled and interrupts will not be
591 * raised to CPU. Also request_irq() call will be not valid.
593 if (!IS_REACHABLE(CONFIG_MLXREG_HOTPLUG))
596 /* Set default interrupt line. */
597 if (mlxsw_i2c->pdata && mlxsw_i2c->pdata->irq)
598 mlxsw_i2c->irq = mlxsw_i2c->pdata->irq;
599 else if (addr == MLXSW_FAST_I2C_SLAVE)
600 mlxsw_i2c->irq = MLXSW_I2C_DEFAULT_IRQ;
605 INIT_WORK(&mlxsw_i2c->irq_work, mlxsw_i2c_work_handler);
606 err = request_irq(mlxsw_i2c->irq, mlxsw_i2c_irq_handler,
607 IRQF_TRIGGER_FALLING | IRQF_SHARED, "mlxsw-i2c",
610 dev_err(mlxsw_i2c->bus_info.dev, "Failed to request irq: %d\n",
618 static void mlxsw_i2c_irq_fini(struct mlxsw_i2c *mlxsw_i2c)
620 if (!IS_REACHABLE(CONFIG_MLXREG_HOTPLUG) || !mlxsw_i2c->irq)
622 cancel_work_sync(&mlxsw_i2c->irq_work);
623 free_irq(mlxsw_i2c->irq, mlxsw_i2c);
626 static const struct mlxsw_bus mlxsw_i2c_bus = {
628 .init = mlxsw_i2c_init,
629 .fini = mlxsw_i2c_fini,
630 .skb_transmit_busy = mlxsw_i2c_skb_transmit_busy,
631 .skb_transmit = mlxsw_i2c_skb_transmit,
632 .cmd_exec = mlxsw_i2c_cmd_exec,
635 static int mlxsw_i2c_probe(struct i2c_client *client,
636 const struct i2c_device_id *id)
638 const struct i2c_adapter_quirks *quirks = client->adapter->quirks;
639 struct mlxsw_i2c *mlxsw_i2c;
643 mlxsw_i2c = devm_kzalloc(&client->dev, sizeof(*mlxsw_i2c), GFP_KERNEL);
648 if ((quirks->max_read_len &&
649 quirks->max_read_len < MLXSW_I2C_BLK_DEF) ||
650 (quirks->max_write_len &&
651 quirks->max_write_len < MLXSW_I2C_BLK_DEF)) {
652 dev_err(&client->dev, "Insufficient transaction buffer length\n");
656 mlxsw_i2c->block_size = max_t(u16, MLXSW_I2C_BLK_DEF,
657 min_t(u16, quirks->max_read_len,
658 quirks->max_write_len));
660 mlxsw_i2c->block_size = MLXSW_I2C_BLK_DEF;
663 i2c_set_clientdata(client, mlxsw_i2c);
664 mutex_init(&mlxsw_i2c->cmd.lock);
666 /* In order to use mailboxes through the i2c, special area is reserved
667 * on the i2c address space that can be used for input and output
668 * mailboxes. Such mailboxes are called local mailboxes. When using a
669 * local mailbox, software should specify 0 as the Input/Output
670 * parameters. The location of the Local Mailbox addresses on the i2c
671 * space can be retrieved through the QUERY_FW command.
672 * For this purpose QUERY_FW is to be issued with opcode modifier equal
673 * 0x01. For such command the output parameter is an immediate value.
674 * Here QUERY_FW command is invoked for ASIC probing and for getting
675 * local mailboxes addresses from immedate output parameters.
678 /* Prepare and write out Command Interface Register for transaction */
679 err = mlxsw_i2c_write_cmd(client, mlxsw_i2c, 1);
681 dev_err(&client->dev, "Could not start transaction");
685 /* Wait until go bit is cleared. */
686 err = mlxsw_i2c_wait_go_bit(client, mlxsw_i2c, &status);
688 dev_err(&client->dev, "HW semaphore is not released");
692 /* Validate transaction completion status. */
694 dev_err(&client->dev, "Bad transaction completion status %x\n",
700 /* Get mailbox offsets. */
701 err = mlxsw_i2c_get_mbox(client, mlxsw_i2c);
703 dev_err(&client->dev, "Fail to get mailboxes\n");
707 dev_info(&client->dev, "%s mb size=%x off=0x%08x out mb size=%x off=0x%08x\n",
708 id->name, mlxsw_i2c->cmd.mb_size_in,
709 mlxsw_i2c->cmd.mb_off_in, mlxsw_i2c->cmd.mb_size_out,
710 mlxsw_i2c->cmd.mb_off_out);
712 /* Register device bus. */
713 mlxsw_i2c->bus_info.device_kind = id->name;
714 mlxsw_i2c->bus_info.device_name = client->name;
715 mlxsw_i2c->bus_info.dev = &client->dev;
716 mlxsw_i2c->bus_info.low_frequency = true;
717 mlxsw_i2c->dev = &client->dev;
718 mlxsw_i2c->pdata = client->dev.platform_data;
720 err = mlxsw_i2c_irq_init(mlxsw_i2c, client->addr);
724 err = mlxsw_core_bus_device_register(&mlxsw_i2c->bus_info,
725 &mlxsw_i2c_bus, mlxsw_i2c, false,
728 dev_err(&client->dev, "Fail to register core bus\n");
729 goto err_bus_device_register;
734 err_bus_device_register:
735 mlxsw_i2c_irq_fini(mlxsw_i2c);
737 mutex_destroy(&mlxsw_i2c->cmd.lock);
738 i2c_set_clientdata(client, NULL);
743 static void mlxsw_i2c_remove(struct i2c_client *client)
745 struct mlxsw_i2c *mlxsw_i2c = i2c_get_clientdata(client);
747 mlxsw_core_bus_device_unregister(mlxsw_i2c->core, false);
748 mlxsw_i2c_irq_fini(mlxsw_i2c);
749 mutex_destroy(&mlxsw_i2c->cmd.lock);
752 int mlxsw_i2c_driver_register(struct i2c_driver *i2c_driver)
754 i2c_driver->probe = mlxsw_i2c_probe;
755 i2c_driver->remove = mlxsw_i2c_remove;
756 return i2c_add_driver(i2c_driver);
758 EXPORT_SYMBOL(mlxsw_i2c_driver_register);
760 void mlxsw_i2c_driver_unregister(struct i2c_driver *i2c_driver)
762 i2c_del_driver(i2c_driver);
764 EXPORT_SYMBOL(mlxsw_i2c_driver_unregister);
766 MODULE_AUTHOR("Vadim Pasternak <vadimp@mellanox.com>");
767 MODULE_DESCRIPTION("Mellanox switch I2C interface driver");
768 MODULE_LICENSE("Dual BSD/GPL");