diff options
Diffstat (limited to 'drivers/i2c/i2c-core.c')
| -rw-r--r-- | drivers/i2c/i2c-core.c | 21 | 
1 files changed, 10 insertions, 11 deletions
| diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index cf9e396d7702..583e95042a21 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -931,7 +931,10 @@ static int i2c_device_probe(struct device *dev)  	if (!client->irq) {  		int irq = -ENOENT; -		if (dev->of_node) { +		if (client->flags & I2C_CLIENT_HOST_NOTIFY) { +			dev_dbg(dev, "Using Host Notify IRQ\n"); +			irq = i2c_smbus_host_notify_to_irq(client); +		} else if (dev->of_node) {  			irq = of_irq_get_byname(dev->of_node, "irq");  			if (irq == -EINVAL || irq == -ENODATA)  				irq = of_irq_get(dev->of_node, 0); @@ -940,14 +943,7 @@ static int i2c_device_probe(struct device *dev)  		}  		if (irq == -EPROBE_DEFER)  			return irq; -		/* -		 * ACPI and OF did not find any useful IRQ, try to see -		 * if Host Notify can be used. -		 */ -		if (irq < 0) { -			dev_dbg(dev, "Using Host Notify IRQ\n"); -			irq = i2c_smbus_host_notify_to_irq(client); -		} +  		if (irq < 0)  			irq = 0; @@ -1708,7 +1704,7 @@ static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap,  	if (i2c_check_addr_validity(addr, info.flags)) {  		dev_err(&adap->dev, "of_i2c: invalid addr=%x on %s\n", -			info.addr, node->full_name); +			addr, node->full_name);  		return ERR_PTR(-EINVAL);  	} @@ -1716,6 +1712,9 @@ static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap,  	info.of_node = of_node_get(node);  	info.archdata = &dev_ad; +	if (of_property_read_bool(node, "host-notify")) +		info.flags |= I2C_CLIENT_HOST_NOTIFY; +  	if (of_get_property(node, "wakeup-source", NULL))  		info.flags |= I2C_CLIENT_WAKE; @@ -3633,7 +3632,7 @@ int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb)  	int ret;  	if (!client || !slave_cb) { -		WARN(1, "insufficent data\n"); +		WARN(1, "insufficient data\n");  		return -EINVAL;  	} |