On Mon, 26 Feb 2024 at 14:24, Marek Vasut <[email protected]> wrote: > > On 2/26/24 9:04 AM, Sumit Garg wrote: > > pcie_imx doesn't seem to share any useful code for iMX8 SoC and it is > > tied to quite old port of pcie_designware driver from Linux which > > suffices only iMX6 specific needs. > > It is probably hand-rolled, but it does suck, that's true. > > > But currently we have the common DWC specific bits which alligns pretty > > well with DW PCIe controller on iMX8MP SoC. So lets reuse those common > > bits instead as a new driver for iMX8 SoCs. It should be fairly easy to > > add support for other iMX8 variants to this driver. > > > > iMX8MP SoC also comes up with standalone PCIe PHY support, so hence we > > can reuse the generic PHY infrastructure to power on PCIe PHY. > > [...] > > > +static int pcie_dw_imx_of_to_plat(struct udevice *dev) > > +{ > > + struct pcie_dw_imx *priv = dev_get_priv(dev); > > + ofnode gpr; > > + int ret; > > + > > + /* Get the controller base address */ > > + priv->dw.dbi_base = (void *)dev_read_addr_name(dev, "dbi"); > > + if ((fdt_addr_t)priv->dw.dbi_base == FDT_ADDR_T_NONE) { > > + dev_err(dev, "failed to get dbi_base address\n"); > > + return -EINVAL; > > + } > > + > > + /* Get the config space base address and size */ > > + priv->dw.cfg_base = (void *)dev_read_addr_size_name(dev, "config", > > + > > &priv->dw.cfg_size); > > + if ((fdt_addr_t)priv->dw.cfg_base == FDT_ADDR_T_NONE) { > > + dev_err(dev, "failed to get cfg_base address\n"); > > + return -EINVAL; > > + } > > + > > + ret = clk_get_bulk(dev, &priv->clks); > > + if (ret) { > > + dev_err(dev, "failed to get PCIe clks\n"); > > + return ret; > > + } > > + > > + ret = reset_get_by_name(dev, "apps", &priv->apps_reset); > > + if (ret) { > > + dev_err(dev, > > + "Failed to get PCIe apps reset control\n"); > > + return ret; > > + } > > + > > + ret = gpio_request_by_name(dev, "reset-gpio", 0, &priv->reset_gpio, > > + (GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE)); > > + if (ret) { > > + dev_err(dev, "unable to get reset-gpio\n"); > > + return ret; > > + } > > + > > + ret = generic_phy_get_by_name(dev, "pcie-phy", &priv->phy); > > + if (ret) { > > + dev_err(dev, "failed to get pcie phy\n"); > > + return ret; > > + } > > + > > + gpr = ofnode_by_compatible(ofnode_null(), "fsl,imx8mp-iomuxc-gpr"); > > + if (ofnode_equal(gpr, ofnode_null())) { > > + dev_err(dev, "unable to find GPR node\n"); > > + return -ENODEV; > > + } > > You likely need a fail path here too, to undo allocation and co.
Ack. -Sumit

