|
|
|
@ -1,5 +1,6 @@ |
|
|
|
|
/*
|
|
|
|
|
* Copyright (C) 2015 - 2016 Xilinx, Inc. |
|
|
|
|
* Copyright (C) 2017 National Instruments Corp |
|
|
|
|
* Written by Michal Simek |
|
|
|
|
* |
|
|
|
|
* SPDX-License-Identifier: GPL-2.0+ |
|
|
|
@ -9,7 +10,8 @@ |
|
|
|
|
#include <dm.h> |
|
|
|
|
#include <errno.h> |
|
|
|
|
#include <i2c.h> |
|
|
|
|
#include <asm/gpio.h> |
|
|
|
|
|
|
|
|
|
#include <asm-generic/gpio.h> |
|
|
|
|
|
|
|
|
|
DECLARE_GLOBAL_DATA_PTR; |
|
|
|
|
|
|
|
|
@ -30,6 +32,7 @@ struct chip_desc { |
|
|
|
|
struct pca954x_priv { |
|
|
|
|
u32 addr; /* I2C mux address */ |
|
|
|
|
u32 width; /* I2C mux width - number of busses */ |
|
|
|
|
struct gpio_desc gpio_mux_reset; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const struct chip_desc chips[] = { |
|
|
|
@ -105,10 +108,45 @@ static int pca954x_ofdata_to_platdata(struct udevice *dev) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int pca954x_probe(struct udevice *dev) |
|
|
|
|
{ |
|
|
|
|
if (IS_ENABLED(CONFIG_DM_GPIO)) { |
|
|
|
|
struct pca954x_priv *priv = dev_get_priv(dev); |
|
|
|
|
int err; |
|
|
|
|
|
|
|
|
|
err = gpio_request_by_name(dev, "reset-gpios", 0, |
|
|
|
|
&priv->gpio_mux_reset, GPIOD_IS_OUT); |
|
|
|
|
|
|
|
|
|
/* it's optional so only bail if we get a real error */ |
|
|
|
|
if (err && (err != -ENOENT)) |
|
|
|
|
return err; |
|
|
|
|
|
|
|
|
|
/* dm will take care of polarity */ |
|
|
|
|
if (dm_gpio_is_valid(&priv->gpio_mux_reset)) |
|
|
|
|
dm_gpio_set_value(&priv->gpio_mux_reset, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int pca954x_remove(struct udevice *dev) |
|
|
|
|
{ |
|
|
|
|
if (IS_ENABLED(CONFIG_DM_GPIO)) { |
|
|
|
|
struct pca954x_priv *priv = dev_get_priv(dev); |
|
|
|
|
|
|
|
|
|
if (dm_gpio_is_valid(&priv->gpio_mux_reset)) |
|
|
|
|
dm_gpio_free(dev, &priv->gpio_mux_reset); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
U_BOOT_DRIVER(pca954x) = { |
|
|
|
|
.name = "pca954x", |
|
|
|
|
.id = UCLASS_I2C_MUX, |
|
|
|
|
.of_match = pca954x_ids, |
|
|
|
|
.probe = pca954x_probe, |
|
|
|
|
.remove = pca954x_remove, |
|
|
|
|
.ops = &pca954x_ops, |
|
|
|
|
.ofdata_to_platdata = pca954x_ofdata_to_platdata, |
|
|
|
|
.priv_auto_alloc_size = sizeof(struct pca954x_priv), |
|
|
|
|