mlxsw_i2c
mlxsw_i2c_convert_mbox(struct mlxsw_i2c *mlxsw_i2c, u8 *buf)
mlxsw_i2c->cmd.mb_off_in = tmp &
mlxsw_i2c->cmd.mb_size_in = (tmp & GENMASK(31,
mlxsw_i2c->cmd.mb_off_out = tmp &
mlxsw_i2c->cmd.mb_size_out = (tmp & GENMASK(31,
struct mlxsw_i2c *mlxsw_i2c, u8 *p_status)
struct mlxsw_i2c *mlxsw_i2c,
struct mlxsw_i2c *mlxsw_i2c, u16 opcode, u32 in_mod)
err = mlxsw_i2c_wait_go_bit(client, mlxsw_i2c, &status);
struct mlxsw_i2c *mlxsw_i2c)
mlxsw_i2c_convert_mbox(mlxsw_i2c, &buf[MLXSW_I2C_MBOX_OUT_PARAM_OFF]);
struct mlxsw_i2c *mlxsw_i2c = i2c_get_clientdata(client);
int off = mlxsw_i2c->cmd.mb_off_in, chunk_size, i, j;
tran_buf = kmalloc(mlxsw_i2c->block_size + MLXSW_I2C_ADDR_BUF_SIZE,
chunk_size = (in_mbox_size > mlxsw_i2c->block_size) ?
mlxsw_i2c->block_size : in_mbox_size;
mlxsw_i2c->block_size * i, chunk_size);
err = mlxsw_i2c_write_cmd(client, mlxsw_i2c, 0);
err = mlxsw_i2c_wait_go_bit(client, mlxsw_i2c, p_status);
struct mlxsw_i2c *mlxsw_i2c = i2c_get_clientdata(client);
int off = mlxsw_i2c->cmd.mb_off_out;
num = DIV_ROUND_UP(reg_size, mlxsw_i2c->block_size);
if (mutex_lock_interruptible(&mlxsw_i2c->cmd.lock) < 0) {
mutex_unlock(&mlxsw_i2c->cmd.lock);
num = DIV_ROUND_UP(reg_size, mlxsw_i2c->block_size);
if (mutex_lock_interruptible(&mlxsw_i2c->cmd.lock) < 0) {
err = mlxsw_i2c_write_init_cmd(client, mlxsw_i2c, opcode,
chunk_size = (reg_size > mlxsw_i2c->block_size) ?
mlxsw_i2c->block_size : reg_size;
mutex_unlock(&mlxsw_i2c->cmd.lock);
mutex_unlock(&mlxsw_i2c->cmd.lock);
struct mlxsw_i2c *mlxsw_i2c = bus_priv;
return mlxsw_i2c_cmd(mlxsw_i2c->dev, opcode, in_mod, in_mbox_size,
struct mlxsw_i2c *mlxsw_i2c = bus_priv;
mlxsw_i2c->core = mlxsw_core;
mlxsw_i2c->bus_info.fw_rev.major =
mlxsw_i2c->bus_info.fw_rev.minor =
mlxsw_i2c->bus_info.fw_rev.subminor =
struct mlxsw_i2c *mlxsw_i2c = bus_priv;
mlxsw_i2c->core = NULL;
struct mlxsw_i2c *mlxsw_i2c;
mlxsw_i2c = container_of(work, struct mlxsw_i2c, irq_work);
mlxsw_core_irq_event_handlers_call(mlxsw_i2c->core);
struct mlxsw_i2c *mlxsw_i2c = dev;
mlxsw_core_schedule_work(&mlxsw_i2c->irq_work);
static int mlxsw_i2c_irq_init(struct mlxsw_i2c *mlxsw_i2c, u8 addr)
if (mlxsw_i2c->pdata && mlxsw_i2c->pdata->irq)
mlxsw_i2c->irq = mlxsw_i2c->pdata->irq;
mlxsw_i2c->irq = MLXSW_I2C_DEFAULT_IRQ;
if (!mlxsw_i2c->irq)
INIT_WORK(&mlxsw_i2c->irq_work, mlxsw_i2c_work_handler);
err = request_irq(mlxsw_i2c->irq, mlxsw_i2c_irq_handler,
mlxsw_i2c);
dev_err(mlxsw_i2c->bus_info.dev, "Failed to request irq: %d\n",
static void mlxsw_i2c_irq_fini(struct mlxsw_i2c *mlxsw_i2c)
if (!IS_REACHABLE(CONFIG_MLXREG_HOTPLUG) || !mlxsw_i2c->irq)
cancel_work_sync(&mlxsw_i2c->irq_work);
free_irq(mlxsw_i2c->irq, mlxsw_i2c);
struct mlxsw_i2c *mlxsw_i2c;
mlxsw_i2c = devm_kzalloc(&client->dev, sizeof(*mlxsw_i2c), GFP_KERNEL);
if (!mlxsw_i2c)
mlxsw_i2c->block_size = min_t(u16, MLXSW_I2C_BLK_MAX,
mlxsw_i2c->block_size = MLXSW_I2C_BLK_DEF;
i2c_set_clientdata(client, mlxsw_i2c);
mutex_init(&mlxsw_i2c->cmd.lock);
err = mlxsw_i2c_write_cmd(client, mlxsw_i2c, 1);
err = mlxsw_i2c_wait_go_bit(client, mlxsw_i2c, &status);
err = mlxsw_i2c_get_mbox(client, mlxsw_i2c);
id->name, mlxsw_i2c->cmd.mb_size_in,
mlxsw_i2c->cmd.mb_off_in, mlxsw_i2c->cmd.mb_size_out,
mlxsw_i2c->cmd.mb_off_out);
mlxsw_i2c->bus_info.device_kind = id->name;
mlxsw_i2c->bus_info.device_name = client->name;
mlxsw_i2c->bus_info.dev = &client->dev;
mlxsw_i2c->bus_info.low_frequency = true;
mlxsw_i2c->dev = &client->dev;
mlxsw_i2c->pdata = client->dev.platform_data;
err = mlxsw_i2c_irq_init(mlxsw_i2c, client->addr);
err = mlxsw_core_bus_device_register(&mlxsw_i2c->bus_info,
&mlxsw_i2c_bus, mlxsw_i2c, false,
mlxsw_i2c_irq_fini(mlxsw_i2c);
mutex_destroy(&mlxsw_i2c->cmd.lock);
struct mlxsw_i2c *mlxsw_i2c = i2c_get_clientdata(client);
mlxsw_core_bus_device_unregister(mlxsw_i2c->core, false);
mlxsw_i2c_irq_fini(mlxsw_i2c);
mutex_destroy(&mlxsw_i2c->cmd.lock);