mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	serial: ns16550: Move PCI access from ofdata_to_platdata() to probe()
Currently the ofdata_to_platdata() method calls dev_read_addr_pci(), which potentially accesses the parent PCI bus. If this happens before the parent PCI bus is probed the resulting address will be wrong. This behavior was triggered by commit82de42fa14("dm: core: Allocate parent data separate from probing parent"). According to a comment in drivers/pci/pci-uclass.c [1] accessing the PCI parent bus in ofdata_to_platdata() is not allowed, and the access should be moved to the probe() function. Move the call to dev_read_addr_pci() and the related handling of the 'addr' value from the ofdata_to_platdata() to its own function, which is then called from the probe() method. While moving the code, the comment /* try Processor Local Bus device first */ was dropped. It was initially added with commit3db886a5bf("serial: ns16550: Support ns16550 compatible pci uart devices") and later made obsolete with commit33c215af4b("dm: pci: Add a function to read a PCI BAR"). [1] Comment in drivers/pci/pci-uclass.c: "A common cause of this problem is that this function is called in the ofdata_to_platdata() method of @dev. Accessing the PCI bus in that method is not allowed, since it has not yet been probed. To fix this, move that access to the probe() method of @dev instead." Fixes:82de42fa14("dm: core: Allocate parent data separate from probing parent") Signed-off-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com> Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Tested-by: Bin Meng <bmeng.cn@gmail.com> # Tested on Intel Galileo
This commit is contained in:
		
				
					committed by
					
						 Bin Meng
						Bin Meng
					
				
			
			
				
	
			
			
			
						parent
						
							fa97ca161b
						
					
				
				
					commit
					720f9e1fdb
				
			| @@ -479,12 +479,40 @@ static int ns16550_serial_getinfo(struct udevice *dev, | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) | ||||
| static int ns1655_serial_set_base_addr(struct udevice *dev) | ||||
| { | ||||
| 	fdt_addr_t addr; | ||||
| 	struct ns16550_platdata *plat; | ||||
|  | ||||
| 	plat = dev_get_platdata(dev); | ||||
|  | ||||
| 	addr = dev_read_addr_pci(dev); | ||||
| 	if (addr == FDT_ADDR_T_NONE) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| #ifdef CONFIG_SYS_NS16550_PORT_MAPPED | ||||
| 	plat->base = addr; | ||||
| #else | ||||
| 	plat->base = (unsigned long)map_physmem(addr, 0, MAP_NOCACHE); | ||||
| #endif | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| int ns16550_serial_probe(struct udevice *dev) | ||||
| { | ||||
| 	struct NS16550 *const com_port = dev_get_priv(dev); | ||||
| 	struct reset_ctl_bulk reset_bulk; | ||||
| 	int ret; | ||||
|  | ||||
| #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) | ||||
| 	ret = ns1655_serial_set_base_addr(dev); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| #endif | ||||
|  | ||||
| 	ret = reset_get_bulk(dev, &reset_bulk); | ||||
| 	if (!ret) | ||||
| 		reset_deassert_bulk(&reset_bulk); | ||||
| @@ -507,21 +535,9 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev) | ||||
| { | ||||
| 	struct ns16550_platdata *plat = dev->platdata; | ||||
| 	const u32 port_type = dev_get_driver_data(dev); | ||||
| 	fdt_addr_t addr; | ||||
| 	struct clk clk; | ||||
| 	int err; | ||||
|  | ||||
| 	/* try Processor Local Bus device first */ | ||||
| 	addr = dev_read_addr_pci(dev); | ||||
| 	if (addr == FDT_ADDR_T_NONE) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| #ifdef CONFIG_SYS_NS16550_PORT_MAPPED | ||||
| 	plat->base = addr; | ||||
| #else | ||||
| 	plat->base = (unsigned long)map_physmem(addr, 0, MAP_NOCACHE); | ||||
| #endif | ||||
|  | ||||
| 	plat->reg_offset = dev_read_u32_default(dev, "reg-offset", 0); | ||||
| 	plat->reg_shift = dev_read_u32_default(dev, "reg-shift", 0); | ||||
| 	plat->reg_width = dev_read_u32_default(dev, "reg-io-width", 1); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user