Debugging gpio-hogs which don't get probed

Chris Webb chris at arachsys.com
Tue Jun 11 17:25:28 CEST 2024


Chris Webb <chris at arachsys.com> wrote:

> 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.

Following up to myself here, I enabled CONFIG_CMD_DM which seems to  
confirm they aren't getting probed:

   boot> dm tree
    Class     Index  Probed  Driver                Name
   -----------------------------------------------------------
    root          0  [ + ]   root_driver           root_driver
    clk           0  [   ]   fixed_clock           |-- gpt_dummy20m
    syscon        0  [   ]   syscon                |-- hwver
    clk           1  [ + ]   mt7981-clock-fixed-p  |-- apmixedsys at 1001e000
    clk           2  [ + ]   mt7981-clock-topckge  |-- topckgen at 1001b000
    clk           3  [ + ]   mt7981-clock-infracf  |-- infracfg_ao at 10001000
    clk           4  [ + ]   mt7981-clock-infracf  |-- infracfg at 10001000
    pinctrl       0  [ + ]   mt7981_pinctrl        |-- pinctrl at 11d00000
    pinconfig     0  [ + ]   pinconfig             |   |-- mmc0-pins-default
    pinconfig     1  [   ]   pinconfig             |   |   |-- mux
    pinconfig     2  [   ]   pinconfig             |   |   |-- conf-cmd-dat
    pinconfig     3  [   ]   pinconfig             |   |   |-- conf-clk
    pinconfig     4  [   ]   pinconfig             |   |   `-- conf-rst
    gpio          0  [   ]   mediatek_gpio         |   `-- mediatek_gpio
    nop           1  [   ]   gpio_hog              |       |-- hub_power
    nop           2  [   ]   gpio_hog              |       |-- modem_control
    nop           3  [   ]   gpio_hog              |       |-- modem_reset
    nop           4  [   ]   gpio_hog              |       `-- modem_power
    serial        0  [ + ]   serial_mtk            |-- serial at 11002000
    clk           5  [ + ]   mt7981-clock-ethsys   |-- syscon at 15000000
    reset         0  [ + ]   mediatek_reset        |   |-- reset
    syscon        4  [ + ]   syscon                |   `-- syscon at 15000000
    ethernet      0  [ + ]   mtk-eth               |-- ethernet at 15100000
    syscon        1  [   ]   syscon                |-- syscon at 10060000
    syscon        2  [   ]   syscon                |-- syscon at 10070000
    syscon        3  [ + ]   syscon                |-- topmisc at 11d10000
    mmc           0  [ + ]   mtk_sd                |-- mmc at 11230000
    blk           0  [   ]   mmc_blk               |   `-- mmc at 11230000.blk
    regulator     0  [   ]   regulator_fixed       |-- regulator-3p3v
    button        0  [   ]   button_gpio           |-- keys
    button        1  [   ]   button_gpio           |   `-- reset
    nop           0  [   ]   gpio_led_wrap         `-- leds
    led           0  [   ]   gpio_led                  |-- power
    led           1  [   ]   gpio_led                  |-- internet
    led           2  [   ]   gpio_led                  |-- wifi_2g
    led           3  [   ]   gpio_led                  |-- wifi_5g
    led           4  [   ]   gpio_led                  |-- signal_1
    led           5  [   ]   gpio_led                  |-- signal_2
    led           6  [   ]   gpio_led                  |-- signal_3
    led           7  [   ]   gpio_led                  `-- signal_4

on power up.

I noted that the parent gpio-controller wasn't getting probed either, so  
tried this:

   --- a/u-boot/drivers/pinctrl/mediatek/pinctrl-mt7981.c
   +++ b/u-boot/drivers/pinctrl/mediatek/pinctrl-mt7981.c
   @@ -1038,6 +1038,12 @@ static int mtk_pinctrl_mt7981_probe(struct udevice *dev)
           return mtk_pinctrl_common_probe(dev, &mt7981_data);
    }

   +static int mtk_pinctrl_mt7981_bind(struct udevice *dev)
   +{
   +       dev_or_flags(dev, DM_FLAG_PROBE_AFTER_BIND);
   +       return 0;
   +}
   +
    static const struct udevice_id mt7981_pctrl_match[] = {
           {.compatible = "mediatek,mt7981-pinctrl"},
           { /* sentinel */ }
   @@ -1048,6 +1054,7 @@ U_BOOT_DRIVER(mt7981_pinctrl) = {
           .id = UCLASS_PINCTRL,
           .of_match = mt7981_pctrl_match,
           .ops = &mtk_pinctrl_ops,
   +       .bind = mtk_pinctrl_mt7981_bind,
           .probe = mtk_pinctrl_mt7981_probe,
           .priv_auto = sizeof(struct mtk_pinctrl_priv),
    };

This does indeed fix the problem: the hogs get probed and the gpios show  
as active outputs on gpio status -a on boot.

But presumably this is all supposed to work without patching that?

Best wishes,

Chris.


More information about the U-Boot mailing list