Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull more i2c updates from Wolfram Sang: "A small update pull request from I2C. This adds one comment to a change we did in this merge window to handle lockdep better, and pulls in a branch which should have been in 4.8 already improving DT support for I2C" * 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: gpio: pca953x: add a comment explaining the need for a lockdep subclass i2c: core: Add support for 'i2c-bus' subnode dt-bindings: i2c: Add support for 'i2c-bus' subnode
This commit is contained in:
commit
e5050143d6
3 changed files with 32 additions and 2 deletions
|
@ -32,6 +32,14 @@ wants to support one of the below features, it should adapt the bindings below.
|
|||
- clock-frequency
|
||||
frequency of bus clock in Hz.
|
||||
|
||||
- i2c-bus
|
||||
For I2C adapters that have child nodes that are a mixture of both I2C
|
||||
devices and non-I2C devices, the 'i2c-bus' subnode can be used for
|
||||
populating I2C devices. If the 'i2c-bus' subnode is present, only
|
||||
subnodes of this will be considered as I2C slaves. The properties,
|
||||
'#address-cells' and '#size-cells' must be defined under this subnode
|
||||
if present.
|
||||
|
||||
- i2c-scl-falling-time-ns
|
||||
Number of nanoseconds the SCL signal takes to fall; t(f) in the I2C
|
||||
specification.
|
||||
|
|
|
@ -794,6 +794,22 @@ static int pca953x_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
mutex_init(&chip->i2c_lock);
|
||||
/*
|
||||
* In case we have an i2c-mux controlled by a GPIO provided by an
|
||||
* expander using the same driver higher on the device tree, read the
|
||||
* i2c adapter nesting depth and use the retrieved value as lockdep
|
||||
* subclass for chip->i2c_lock.
|
||||
*
|
||||
* REVISIT: This solution is not complete. It protects us from lockdep
|
||||
* false positives when the expander controlling the i2c-mux is on
|
||||
* a different level on the device tree, but not when it's on the same
|
||||
* level on a different branch (in which case the subclass number
|
||||
* would be the same).
|
||||
*
|
||||
* TODO: Once a correct solution is developed, a similar fix should be
|
||||
* applied to all other i2c-controlled GPIO expanders (and potentially
|
||||
* regmap-i2c).
|
||||
*/
|
||||
lockdep_set_subclass(&chip->i2c_lock,
|
||||
i2c_adapter_depth(client->adapter));
|
||||
|
||||
|
|
|
@ -1680,7 +1680,7 @@ static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap,
|
|||
|
||||
static void of_i2c_register_devices(struct i2c_adapter *adap)
|
||||
{
|
||||
struct device_node *node;
|
||||
struct device_node *bus, *node;
|
||||
|
||||
/* Only register child devices if the adapter has a node pointer set */
|
||||
if (!adap->dev.of_node)
|
||||
|
@ -1688,11 +1688,17 @@ static void of_i2c_register_devices(struct i2c_adapter *adap)
|
|||
|
||||
dev_dbg(&adap->dev, "of_i2c: walking child nodes\n");
|
||||
|
||||
for_each_available_child_of_node(adap->dev.of_node, node) {
|
||||
bus = of_get_child_by_name(adap->dev.of_node, "i2c-bus");
|
||||
if (!bus)
|
||||
bus = of_node_get(adap->dev.of_node);
|
||||
|
||||
for_each_available_child_of_node(bus, node) {
|
||||
if (of_node_test_and_set_flag(node, OF_POPULATED))
|
||||
continue;
|
||||
of_i2c_register_device(adap, node);
|
||||
}
|
||||
|
||||
of_node_put(bus);
|
||||
}
|
||||
|
||||
static int of_dev_node_match(struct device *dev, void *data)
|
||||
|
|
Loading…
Reference in a new issue