x86: Probe pinctrl driver in cpu_init_r()
At present pinctrl driver gets probed in ich6_gpio driver's probe routine, which has two issues: - Pin's PADs only gets configured when GPIO driver is probed, which is not done by default. This leaves the board in a partially functional state as we must initialize PADs correctly to get perepherals fully working. - The probe routine of pinctrl driver is called multiple times, as normally there are multiple GPIO controllers. It should really be called just once. Move the call to syscon_get_by_driver_data() from ich6_gpio driver to cpu_init_r(). Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Stefan Roese <sr@denx.de> Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: George McCollister <george.mccollister@gmail.com> Tested-by: George McCollister <george.mccollister@gmail.com>
This commit is contained in:
		
							parent
							
								
									2f29c83eec
								
							
						
					
					
						commit
						d8906c1f3f
					
				|  | @ -24,6 +24,7 @@ | ||||||
| #include <dm.h> | #include <dm.h> | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
| #include <malloc.h> | #include <malloc.h> | ||||||
|  | #include <syscon.h> | ||||||
| #include <asm/control_regs.h> | #include <asm/control_regs.h> | ||||||
| #include <asm/coreboot_tables.h> | #include <asm/coreboot_tables.h> | ||||||
| #include <asm/cpu.h> | #include <asm/cpu.h> | ||||||
|  | @ -751,6 +752,10 @@ int cpu_init_r(void) | ||||||
| 	uclass_first_device(UCLASS_PCH, &dev); | 	uclass_first_device(UCLASS_PCH, &dev); | ||||||
| 	uclass_first_device(UCLASS_LPC, &dev); | 	uclass_first_device(UCLASS_LPC, &dev); | ||||||
| 
 | 
 | ||||||
|  | 	/* Set up pin control if available */ | ||||||
|  | 	ret = syscon_get_by_driver_data(X86_SYSCON_PINCONF, &dev); | ||||||
|  | 	debug("%s, pinctrl=%p, ret=%d\n", __func__, dev, ret); | ||||||
|  | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -32,7 +32,6 @@ | ||||||
| #include <fdtdec.h> | #include <fdtdec.h> | ||||||
| #include <pch.h> | #include <pch.h> | ||||||
| #include <pci.h> | #include <pci.h> | ||||||
| #include <syscon.h> |  | ||||||
| #include <asm/cpu.h> | #include <asm/cpu.h> | ||||||
| #include <asm/gpio.h> | #include <asm/gpio.h> | ||||||
| #include <asm/io.h> | #include <asm/io.h> | ||||||
|  | @ -113,12 +112,6 @@ static int ich6_gpio_probe(struct udevice *dev) | ||||||
| 	struct ich6_bank_platdata *plat = dev_get_platdata(dev); | 	struct ich6_bank_platdata *plat = dev_get_platdata(dev); | ||||||
| 	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev); | 	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev); | ||||||
| 	struct ich6_bank_priv *bank = dev_get_priv(dev); | 	struct ich6_bank_priv *bank = dev_get_priv(dev); | ||||||
| 	struct udevice *pinctrl; |  | ||||||
| 	int ret; |  | ||||||
| 
 |  | ||||||
| 	/* Set up pin control if available */ |  | ||||||
| 	ret = syscon_get_by_driver_data(X86_SYSCON_PINCONF, &pinctrl); |  | ||||||
| 	debug("%s, pinctrl=%p, ret=%d\n", __func__, pinctrl, ret); |  | ||||||
| 
 | 
 | ||||||
| 	uc_priv->gpio_count = GPIO_PER_BANK; | 	uc_priv->gpio_count = GPIO_PER_BANK; | ||||||
| 	uc_priv->bank_name = plat->bank_name; | 	uc_priv->bank_name = plat->bank_name; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue