i2c: i2c-smbus: add of_i2c_setup_smbus_alert
This commit adds of_i2c_setup_smbus_alert which allows the smbalert driver to be attached to an i2c adapter via the device tree. Signed-off-by: Phil Reid <preid@electromag.com.au> Acked-by: Rob Herring <robh@kernel.org> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:
		
							parent
							
								
									3c0a60bee1
								
							
						
					
					
						commit
						69d17246ab
					
				| @ -59,8 +59,8 @@ wants to support one of the below features, it should adapt the bindings below. | ||||
| 	interrupts used by the device. | ||||
| 
 | ||||
| - interrupt-names | ||||
| 	"irq" and "wakeup" names are recognized by I2C core, other names are | ||||
| 	left to individual drivers. | ||||
| 	"irq", "wakeup" and "smbus_alert" names are recognized by I2C core, | ||||
| 	other names are	left to individual drivers. | ||||
| 
 | ||||
| - host-notify | ||||
| 	device uses SMBus host notify protocol instead of interrupt line. | ||||
|  | ||||
| @ -625,3 +625,25 @@ struct i2c_client *i2c_setup_smbus_alert(struct i2c_adapter *adapter, | ||||
| 	return i2c_new_device(adapter, &ara_board_info); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(i2c_setup_smbus_alert); | ||||
| 
 | ||||
| #if IS_ENABLED(CONFIG_I2C_SMBUS) && IS_ENABLED(CONFIG_OF) | ||||
| int of_i2c_setup_smbus_alert(struct i2c_adapter *adapter) | ||||
| { | ||||
| 	struct i2c_client *client; | ||||
| 	int irq; | ||||
| 
 | ||||
| 	irq = of_property_match_string(adapter->dev.of_node, "interrupt-names", | ||||
| 				       "smbus_alert"); | ||||
| 	if (irq == -EINVAL || irq == -ENODATA) | ||||
| 		return 0; | ||||
| 	else if (irq < 0) | ||||
| 		return irq; | ||||
| 
 | ||||
| 	client = i2c_setup_smbus_alert(adapter, NULL); | ||||
| 	if (!client) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(of_i2c_setup_smbus_alert); | ||||
| #endif | ||||
|  | ||||
| @ -21,6 +21,7 @@ | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/of_irq.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/workqueue.h> | ||||
| 
 | ||||
| @ -139,7 +140,14 @@ static int smbalert_probe(struct i2c_client *ara, | ||||
| 	if (!alert) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	irq = setup->irq; | ||||
| 	if (setup) { | ||||
| 		irq = setup->irq; | ||||
| 	} else { | ||||
| 		irq = of_irq_get_byname(adapter->dev.of_node, "smbus_alert"); | ||||
| 		if (irq <= 0) | ||||
| 			return irq; | ||||
| 	} | ||||
| 
 | ||||
| 	INIT_WORK(&alert->alert, smbalert_work); | ||||
| 	alert->ara = ara; | ||||
| 
 | ||||
|  | ||||
| @ -49,4 +49,13 @@ struct i2c_client *i2c_setup_smbus_alert(struct i2c_adapter *adapter, | ||||
| 					 struct i2c_smbus_alert_setup *setup); | ||||
| int i2c_handle_smbus_alert(struct i2c_client *ara); | ||||
| 
 | ||||
| #if IS_ENABLED(CONFIG_I2C_SMBUS) && IS_ENABLED(CONFIG_OF) | ||||
| int of_i2c_setup_smbus_alert(struct i2c_adapter *adap); | ||||
| #else | ||||
| static inline int of_i2c_setup_smbus_alert(struct i2c_adapter *adap) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* _LINUX_I2C_SMBUS_H */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user