Skip to content

Commit

Permalink
i2c: i2c-mux-gpio: update mux with gpiod_set_array_value_cansleep
Browse files Browse the repository at this point in the history
If the gpio controller supports it and the gpio lines are concentrated
to one gpio chip, the mux controller pins will get updated simultaneously.

Signed-off-by: Peter Rosin <peda@axentia.se>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
  • Loading branch information
Peter Rosin authored and Wolfram Sang committed Nov 29, 2016
1 parent bbf9d26 commit feff5c0
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions drivers/i2c/muxes/i2c-mux-gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,19 @@
struct gpiomux {
struct i2c_mux_gpio_platform_data data;
unsigned gpio_base;
struct gpio_desc **gpios;
int *values;
};

static void i2c_mux_gpio_set(const struct gpiomux *mux, unsigned val)
{
int i;

for (i = 0; i < mux->data.n_gpios; i++)
gpio_set_value_cansleep(mux->gpio_base + mux->data.gpios[i],
val & (1 << i));
mux->values[i] = (val >> i) & 1;

gpiod_set_array_value_cansleep(mux->data.n_gpios,
mux->gpios, mux->values);
}

static int i2c_mux_gpio_select(struct i2c_mux_core *muxc, u32 chan)
Expand Down Expand Up @@ -176,12 +180,16 @@ static int i2c_mux_gpio_probe(struct platform_device *pdev)
if (!parent)
return -EPROBE_DEFER;

muxc = i2c_mux_alloc(parent, &pdev->dev, mux->data.n_values, 0, 0,
muxc = i2c_mux_alloc(parent, &pdev->dev, mux->data.n_values,
mux->data.n_gpios * sizeof(*mux->gpios) +
mux->data.n_gpios * sizeof(*mux->values), 0,
i2c_mux_gpio_select, NULL);
if (!muxc) {
ret = -ENOMEM;
goto alloc_failed;
}
mux->gpios = muxc->priv;
mux->values = (int *)(mux->gpios + mux->data.n_gpios);
muxc->priv = mux;

platform_set_drvdata(pdev, muxc);
Expand Down Expand Up @@ -219,10 +227,12 @@ static int i2c_mux_gpio_probe(struct platform_device *pdev)
goto err_request_gpio;
}

gpio_desc = gpio_to_desc(gpio_base + mux->data.gpios[i]);
mux->gpios[i] = gpio_desc;

if (!muxc->mux_locked)
continue;

gpio_desc = gpio_to_desc(gpio_base + mux->data.gpios[i]);
gpio_dev = &gpio_desc->gdev->dev;
muxc->mux_locked = i2c_root_adapter(gpio_dev) == root;
}
Expand Down

0 comments on commit feff5c0

Please sign in to comment.