From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Wu Date: Sat, 9 May 2020 10:59:26 +0800 Subject: [PATCH 3/8] net: dwc_eth_qos: Add option "snps,reset-gpio" phy-rst gpio for stm32 In-Reply-To: <78711f22-8c04-03f1-ce93-23420165e3ee@st.com> References: <20200430103656.29728-1-david.wu@rock-chips.com> <20200430103656.29728-4-david.wu@rock-chips.com> <78711f22-8c04-03f1-ce93-23420165e3ee@st.com> Message-ID: <313a9f42-57af-5a35-e2fc-6ac831fb4475@rock-chips.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Patrice, ? 2020/4/30 ??11:47, Patrice CHOTARD ??: >> @@ -701,6 +702,15 @@ static int eqos_start_resets_stm32(struct udevice *dev) >> >> debug("%s(dev=%p):\n", __func__, dev); >> if (dm_gpio_is_valid(&eqos->phy_reset_gpio)) { >> + ret = dm_gpio_set_value(&eqos->phy_reset_gpio, 0); >> + if (ret < 0) { >> + pr_err("dm_gpio_set_value(phy_reset, deassert) failed: %d", >> + ret); >> + return ret; >> + } >> + >> + udelay(eqos->reset_delays[0]); >> + > not related to this patch subject >> ret = dm_gpio_set_value(&eqos->phy_reset_gpio, 1); >> if (ret < 0) { >> pr_err("dm_gpio_set_value(phy_reset, assert) failed: %d", >> @@ -708,7 +718,7 @@ static int eqos_start_resets_stm32(struct udevice *dev) >> return ret; >> } >> >> - udelay(2); >> + udelay(eqos->reset_delays[1]); >> >> ret = dm_gpio_set_value(&eqos->phy_reset_gpio, 0); >> if (ret < 0) { >> @@ -1712,11 +1724,29 @@ static int eqos_probe_resources_stm32(struct udevice *dev) >> if (ret) >> pr_warn("gpio_request_by_name(phy reset) not provided %d", >> ret); >> + else >> + eqos->reset_delays[1] = 2; > this is not the correct place to set default value. It must be set in case we can't get value from DT below No, three cases below, it is second case, and we can see udelay(2) in eqos_start_resets_stm32(), here we are to be compatible with the original. - If there is not phy rst, reset_delays is 0; - If "reset-gpios exists in phy node, reset_delays [1] = 2; - "snps, reset-gpio" exists in DT, reset_delays is obtained from DT >> >> eqos->phyaddr = ofnode_read_u32_default(phandle_args.node, >> "reg", -1); >> } >> >> + if (!dm_gpio_is_valid(&eqos->phy_reset_gpio)) { >> + int reset_flags = GPIOD_IS_OUT; >> + >> + if (dev_read_bool(dev, "snps,reset-active-low")) >> + reset_flags |= GPIOD_ACTIVE_LOW; >> + >> + ret = gpio_request_by_name(dev, "snps,reset-gpio", 0, >> + &eqos->phy_reset_gpio, reset_flags); >> + if (ret == 0) >> + ret = dev_read_u32_array(dev, "snps,reset-delays-us", >> + eqos->reset_delays, 3); > in case "snps,reset-delays-us" is not in present DT, all resets-delays are set to 0, see my remark above >> + else >> + pr_warn("gpio_request_by_name(snps,reset-gpio) failed: %d", >> + ret); >> + } >> + >> debug("%s: OK\n", __func__); >> return 0; >>