Debugging gpio-hogs which don't get probed

Chris Webb chris at arachsys.com
Tue Jun 11 12:59:00 CEST 2024


I'm building u-boot for a mt7981a board, very similar to the in-tree  
mt7981-emmc-rfb. For reference, my device tree and output of make  
savedefconfig are here:

   https://gist.github.com/arachsys/98048980728c652bea641b42cfd41a40

Everything boots fine, but I have a handful of gpios which need to be set  
to fixed values before booting the kernel to enable a 5g modem. I can do  
this with

   gpio clear 10; gpio set 5; gpio set 9; gpio 11

which works fine, but I think the 'official' solution for this might be  
using u-boot's gpio-hog support?

With that in mind, I added


   &gpio {
   	hub_power {
   		gpio-hog;
   		gpios = <5 GPIO_ACTIVE_HIGH>;
   		output-high;
   	};

   	modem_control {
   		gpio-hog;
   		gpios = <9 GPIO_ACTIVE_HIGH>;
   		output-high;
   	};

   	modem_reset {
   		gpio-hog;
   		gpios = <10 GPIO_ACTIVE_HIGH>;
   		output-low;
   	};

   	modem_power {
   		gpio-hog;
   		gpios = <11 GPIO_ACTIVE_HIGH>;
   		output-high;
   	};
   };

with CONFIG_GPIO_HOG=y, but this doesn't seem to work on either u-boot.git  
HEAD or 2024.07-rc.

To try to see what was going on better, I added some debug printfs:

   --- a/u-boot/drivers/gpio/gpio-uclass.c
   +++ b/u-boot/drivers/gpio/gpio-uclass.c
   @@ -328,6 +330,8 @@ static int gpio_hog_of_to_plat(struct udevice *dev)

    static int gpio_hog_probe(struct udevice *dev)
    {
   +	printf("gpio_hog_probe called\n");
   +
    	struct gpio_hog_data *plat = dev_get_plat(dev);
    	struct gpio_hog_priv *priv = dev_get_priv(dev);
    	int ret;
   @@ -1518,6 +1523,8 @@ void devm_gpiod_put(struct udevice *dev, struct gpio_desc *desc)

    static int gpio_post_bind(struct udevice *dev)
    {
   +	printf("gpio_post_bind called\n");
   +
    	if (CONFIG_IS_ENABLED(GPIO_HOG) && dev_has_ofnode(dev)) {
    		struct udevice *child;
    		ofnode node;
   @@ -1539,6 +1546,7 @@ static int gpio_post_bind(struct udevice *dev)
    				 * since hogs can be essential to the hardware
    				 * system.
    				 */
   +				printf("found a gpio-hog\n");
    				dev_or_flags(child, DM_FLAG_PROBE_AFTER_BIND);
    			}
    		}

This shows gpio_post_bind being called, then the four gpio-hogs found and  
set to probe after bind, but the gpio_hog_probe function is never actually  
called. Presumably this is the problem - if they're not probed then  
they'll never take effect?

I enabled CONFIG_DM_WARN and CONFIG_DM_DEBUG, which confirm that nothing  
ever seems to be probing the gpio-hog children, but there aren't obviously  
any errors or warnings related to them either. Nothing relevant happens  
after gpio_post_bind is called.

Is this a bug or is there some basic config/dts mistake on my part here?  
Is there some other debug info I can get that might shed light on what's  
going on, or some config prerequisite for DM_FLAG_PROBE_AFTER_BIND to work  
that I'm likely to be missing?

Best wishes,

Chris.


More information about the U-Boot mailing list