i2c: designware: add reset ctrl to driver
Add code to look for a reset manager property. Specifically, look for the reset-names of 'i2c'. A reset property is an optional feature, so only print out a warning and do not fail if a reset property is not present. If a reset property is discovered, then use it to deassert, thus bringing the IP out of reset. Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
This commit is contained in:
		
							parent
							
								
									449ff9c431
								
							
						
					
					
						commit
						622597dee4
					
				|  | @ -9,6 +9,7 @@ | ||||||
| #include <dm.h> | #include <dm.h> | ||||||
| #include <i2c.h> | #include <i2c.h> | ||||||
| #include <pci.h> | #include <pci.h> | ||||||
|  | #include <reset.h> | ||||||
| #include <asm/io.h> | #include <asm/io.h> | ||||||
| #include "designware_i2c.h" | #include "designware_i2c.h" | ||||||
| 
 | 
 | ||||||
|  | @ -34,6 +35,7 @@ static struct dw_scl_sda_cfg byt_config = { | ||||||
| struct dw_i2c { | struct dw_i2c { | ||||||
| 	struct i2c_regs *regs; | 	struct i2c_regs *regs; | ||||||
| 	struct dw_scl_sda_cfg *scl_sda_cfg; | 	struct dw_scl_sda_cfg *scl_sda_cfg; | ||||||
|  | 	struct reset_ctl reset_ctl; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_SYS_I2C_DW_ENABLE_STATUS_UNSUPPORTED | #ifdef CONFIG_SYS_I2C_DW_ENABLE_STATUS_UNSUPPORTED | ||||||
|  | @ -534,6 +536,7 @@ static int designware_i2c_probe_chip(struct udevice *bus, uint chip_addr, | ||||||
| static int designware_i2c_probe(struct udevice *bus) | static int designware_i2c_probe(struct udevice *bus) | ||||||
| { | { | ||||||
| 	struct dw_i2c *priv = dev_get_priv(bus); | 	struct dw_i2c *priv = dev_get_priv(bus); | ||||||
|  | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	if (device_is_on_pci_bus(bus)) { | 	if (device_is_on_pci_bus(bus)) { | ||||||
| #ifdef CONFIG_DM_PCI | #ifdef CONFIG_DM_PCI | ||||||
|  | @ -549,6 +552,13 @@ static int designware_i2c_probe(struct udevice *bus) | ||||||
| 		priv->regs = (struct i2c_regs *)devfdt_get_addr_ptr(bus); | 		priv->regs = (struct i2c_regs *)devfdt_get_addr_ptr(bus); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	ret = reset_get_by_name(bus, "i2c", &priv->reset_ctl); | ||||||
|  | 	if (ret) | ||||||
|  | 		pr_info("reset_get_by_name() failed: %d\n", ret); | ||||||
|  | 
 | ||||||
|  | 	if (&priv->reset_ctl) | ||||||
|  | 		reset_deassert(&priv->reset_ctl); | ||||||
|  | 
 | ||||||
| 	__dw_i2c_init(priv->regs, 0, 0); | 	__dw_i2c_init(priv->regs, 0, 0); | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue