pci: imx: use reset-gpios if defined by device-tree
If reset-gpio is defined by device-tree use that if CONFIG_PCIE_IMX_PERST_GPIO is not defined. Note that after this the following boards which define CONFIG_PCIE_IMX_PERST_GPIO in their board header file as well as their device-tree should be able to remove CONFIG_PCIE_IMX_PERST_GPIO without consequence: - mx6sabresd - mx6sxsabresd - novena - tbs2910 - vining_2000 Note that the ge_bx50v3 board uses CONFIG_PCIE_IMX_PERST_GPIO and does not have reset-gpios defined it it's pcie node in the dt thus removing CONFIG_PCIE_IMX_PERST_GPIO globally can't be done until that board adds reset-gpios. Cc: Ian Ray <ian.ray@ge.com> (maintainer:GE BX50V3 BOARD) Cc: Sebastian Reichel <sebastian.reichel@collabora.com> (maintainer:GE BX50V3 BOARD) Cc: Fabio Estevam <festevam@gmail.com> (maintainer:MX6SABRESD BOARD) Cc: Marek Vasut <marex@denx.de> (maintainer:NOVENA BOARD) Cc: Soeren Moch <smoch@web.de> (maintainer:TBS2910 BOARD) Cc: Silvio Fricke <open-source@softing.de> (maintainer:VINING_2000 BOARD) Signed-off-by: Tim Harvey <tharvey@gateworks.com>
This commit is contained in:
		
							parent
							
								
									96f747b1f0
								
							
						
					
					
						commit
						c1f6fd2bb7
					
				|  | @ -7,6 +7,7 @@ | ||||||
| #ifndef __SYS_PROTO_IMX6_ | #ifndef __SYS_PROTO_IMX6_ | ||||||
| #define __SYS_PROTO_IMX6_ | #define __SYS_PROTO_IMX6_ | ||||||
| 
 | 
 | ||||||
|  | #include <asm/gpio.h> | ||||||
| #include <asm/mach-imx/sys_proto.h> | #include <asm/mach-imx/sys_proto.h> | ||||||
| #include <asm/arch/iomux.h> | #include <asm/arch/iomux.h> | ||||||
| 
 | 
 | ||||||
|  | @ -18,7 +19,7 @@ | ||||||
| 				   USBPHY_PWD_RXPWDRX)) | 				   USBPHY_PWD_RXPWDRX)) | ||||||
| 
 | 
 | ||||||
| int imx6_pcie_toggle_power(void); | int imx6_pcie_toggle_power(void); | ||||||
| int imx6_pcie_toggle_reset(void); | int imx6_pcie_toggle_reset(struct gpio_desc *gpio, bool active_high); | ||||||
| 
 | 
 | ||||||
| enum ldo_reg { | enum ldo_reg { | ||||||
| 	LDO_ARM, | 	LDO_ARM, | ||||||
|  |  | ||||||
|  | @ -372,7 +372,7 @@ int power_init_board(void) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int imx6_pcie_toggle_reset(void) | int imx6_pcie_toggle_reset(struct gpio_desc *gpio, bool active_high) | ||||||
| { | { | ||||||
| 	if (board_type < GW_UNKNOWN) { | 	if (board_type < GW_UNKNOWN) { | ||||||
| 		uint pin = gpio_cfg[board_type].pcie_rst; | 		uint pin = gpio_cfg[board_type].pcie_rst; | ||||||
|  |  | ||||||
|  | @ -100,6 +100,8 @@ | ||||||
| struct imx_pcie_priv { | struct imx_pcie_priv { | ||||||
| 	void __iomem		*dbi_base; | 	void __iomem		*dbi_base; | ||||||
| 	void __iomem		*cfg_base; | 	void __iomem		*cfg_base; | ||||||
|  | 	struct gpio_desc	reset_gpio; | ||||||
|  | 	bool			reset_active_high; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -541,7 +543,7 @@ __weak int imx6_pcie_toggle_power(void) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| __weak int imx6_pcie_toggle_reset(void) | __weak int imx6_pcie_toggle_reset(struct gpio_desc *gpio, bool active_high) | ||||||
| { | { | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * See 'PCI EXPRESS BASE SPECIFICATION, REV 3.0, SECTION 6.6.1' | 	 * See 'PCI EXPRESS BASE SPECIFICATION, REV 3.0, SECTION 6.6.1' | ||||||
|  | @ -579,12 +581,20 @@ __weak int imx6_pcie_toggle_reset(void) | ||||||
| 	mdelay(20); | 	mdelay(20); | ||||||
| 	gpio_free(CONFIG_PCIE_IMX_PERST_GPIO); | 	gpio_free(CONFIG_PCIE_IMX_PERST_GPIO); | ||||||
| #else | #else | ||||||
|  | 	if (dm_gpio_is_valid(gpio)) { | ||||||
|  | 		/* Assert PERST# for 20ms then de-assert */ | ||||||
|  | 		dm_gpio_set_value(gpio, active_high ? 0 : 1); | ||||||
|  | 		mdelay(20); | ||||||
|  | 		dm_gpio_set_value(gpio, active_high ? 1 : 0); | ||||||
|  | 		mdelay(20); | ||||||
|  | 	} else { | ||||||
| 		puts("WARNING: Make sure the PCIe #PERST line is connected!\n"); | 		puts("WARNING: Make sure the PCIe #PERST line is connected!\n"); | ||||||
|  | 	} | ||||||
| #endif | #endif | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int imx6_pcie_deassert_core_reset(void) | static int imx6_pcie_deassert_core_reset(struct imx_pcie_priv *priv) | ||||||
| { | { | ||||||
| 	struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR; | 	struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR; | ||||||
| 
 | 
 | ||||||
|  | @ -612,7 +622,7 @@ static int imx6_pcie_deassert_core_reset(void) | ||||||
| 	setbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_REF_SSP_EN); | 	setbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_REF_SSP_EN); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	imx6_pcie_toggle_reset(); | 	imx6_pcie_toggle_reset(&priv->reset_gpio, priv->reset_active_high); | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | @ -625,7 +635,7 @@ static int imx_pcie_link_up(struct imx_pcie_priv *priv) | ||||||
| 
 | 
 | ||||||
| 	imx6_pcie_assert_core_reset(priv, false); | 	imx6_pcie_assert_core_reset(priv, false); | ||||||
| 	imx6_pcie_init_phy(); | 	imx6_pcie_init_phy(); | ||||||
| 	imx6_pcie_deassert_core_reset(); | 	imx6_pcie_deassert_core_reset(priv); | ||||||
| 
 | 
 | ||||||
| 	imx_pcie_regions_setup(priv); | 	imx_pcie_regions_setup(priv); | ||||||
| 
 | 
 | ||||||
|  | @ -787,6 +797,15 @@ static int imx_pcie_dm_probe(struct udevice *dev) | ||||||
| { | { | ||||||
| 	struct imx_pcie_priv *priv = dev_get_priv(dev); | 	struct imx_pcie_priv *priv = dev_get_priv(dev); | ||||||
| 
 | 
 | ||||||
|  | 	/* if PERST# valid from dt then assert it */ | ||||||
|  | 	gpio_request_by_name(dev, "reset-gpio", 0, &priv->reset_gpio, | ||||||
|  | 			     GPIOD_IS_OUT); | ||||||
|  | 	priv->reset_active_high = dev_read_bool(dev, "reset-gpio-active-high"); | ||||||
|  | 	if (dm_gpio_is_valid(&priv->reset_gpio)) { | ||||||
|  | 		dm_gpio_set_value(&priv->reset_gpio, | ||||||
|  | 				  priv->reset_active_high ? 0 : 1); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return imx_pcie_link_up(priv); | 	return imx_pcie_link_up(priv); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue