[PATCH] PCI: Add power sequencing driver for PCI slots

Marek Vasut marek.vasut at mailbox.org
Wed Jan 7 00:14:38 CET 2026


On 1/6/26 11:34 PM, Sean Anderson wrote:
> Extend the PCI bridge driver to enable resources associated with PCI
> slots like clocks, power rails, and resets. This is modeled off of the
> PCI power control subsystem in Linux. The traditional compatible for PCI
> slots in U-Boot is pci-bridge, but Linux uses the more-systematic
> pciclass,0604 so add that as an option.

Oh, nice :)

> +static int __maybe_unused pci_bridge_probe(struct udevice *dev)
> +{
> +	struct clk clk;
> +	struct gpio_desc perst;
> +
> +	if (!clk_get_by_index(dev, 0, &clk)) {
> +		int ret = clk_enable(&clk);
> +
> +		if (ret)
> +			return log_msg_ret("clk", ret);

Should we use dev_err() instead ?

> +		/* Delay for T_PERST-CLK (100 us for all slot types) */
> +		udelay(100);
> +	}
> +
> +	if (!gpio_request_by_name(dev, "reset-gpios", 0, &perst, 0)) {

Invert conditional, reduce indent.

> +		unsigned long delay = 0;
> +		int ret;
> +
> +		/*
> +		 * If PERST is inactive, the following call to dm_gpio_clrset_flags
> +		 * will be the first time we assert it and we will need to
> +		 * delay for T_PERST.
> +		 */
> +		if (dm_gpio_get_value(&perst) != 1)
> +			delay = 100;
> +
> +		ret = dm_gpio_clrset_flags(&perst, GPIOD_MASK_DIR,
> +					   GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
> +		if (ret)
> +			return log_msg_ret("set", ret);
> +		mdelay(delay);

Maybe set a flag and avoid calling mdelay() altogether ?

> +		ret = dm_gpio_set_value(&perst, 0);
> +		if (ret)
> +			return log_msg_ret("clr", ret);
> +
> +		/*
> +		 * PCIe section 6.6.1:
> +		 * > ... software must wait a minimum of 100 ms before sending a
> +		 * > Configuration Request to the device immediately below that
> +		 * > Port.
> +		 */
> +		mdelay(100);
> +	}
> +
> +	return 0;
> +}
> +
>   U_BOOT_DRIVER(pci_bridge_drv) = {
>   	.name		= "pci_bridge_drv",
>   	.id		= UCLASS_PCI,
>   	.of_match	= pci_bridge_ids,
> +#if CONFIG_IS_ENABLED(PCI_PWRCTRL_SLOT)
> +	.probe		= pci_bridge_probe,

.probe = CONFIG_IS_ENABLED(PCI_PWRCTRL_SLOT, pci_bridge_probe, NULL),

Thanks !


More information about the U-Boot mailing list