
Hi Cheo,
(please keep the mailing list on this)
On Fri, 13 Jan 2023 at 02:04, Cheo Fusi fusibrandon13@gmail.com wrote:
Hi Simon
I get the same -ENODEV with uclass_first_device_err().
Here are the outputs of 'dm tree' and 'dm uclass'
=> dm tree Class Index Probed Driver Name
root 0 [ + ] root_driver root_driver simple_bus 0 [ + ] simple_bus |-- soc@1c00000 mmc 0 [ + ] sunxi_mmc | |-- mmc@1c0f000 blk 0 [ + ] mmc_blk | | `-- mmc@1c0f000.blk mmc 1 [ + ] sunxi_mmc | |-- mmc@1c10000 blk 1 [ ] mmc_blk | | `-- mmc@1c10000.blk mmc 2 [ + ] sunxi_mmc | |-- mmc@1c11000 blk 2 [ ] mmc_blk | | `-- mmc@1c11000.blk usb 0 [ + ] sunxi-musb | |-- usb@1c19000 ethernet 0 [ + ] usb_ether | | `-- usb_ether phy 0 [ + ] sun4i_usb_phy | |-- phy@1c19400 usb 0 [ + ] ehci_generic | |-- usb@1c1a000 usb_hub 0 [ + ] usb_hub | | `-- usb_hub usb 1 [ + ] ohci_generic | |-- usb@1c1a400 usb_hub 1 [ + ] usb_hub | | `-- usb_hub clk 0 [ + ] sun8i_a23_ccu | |-- clock@1c20000 reset 0 [ + ] sunxi_reset | | `-- reset gpio 0 [ + ] gpio_sunxi | |-- pinctrl@1c20800 gpio 1 [ + ] gpio_sunxi | | |-- PA gpio 2 [ + ] gpio_sunxi | | |-- PB gpio 3 [ + ] gpio_sunxi | | |-- PC gpio 4 [ + ] gpio_sunxi | | |-- PD gpio 5 [ + ] gpio_sunxi | | |-- PE gpio 6 [ + ] gpio_sunxi | | |-- PF gpio 7 [ + ] gpio_sunxi | | |-- PG gpio 8 [ + ] gpio_sunxi | | |-- PH gpio 9 [ + ] gpio_sunxi | | `-- PI watchdog 0 [ + ] sunxi_wdt | |-- watchdog@1c20ca0 sysreset 1 [ ] wdt_reboot | | `-- watchdog@1c20ca0 serial 0 [ + ] ns16550_serial | |-- serial@1c28000 serial 1 [ ] ns16550_serial | |-- serial@1c28400 clk 1 [ + ] clk_sun6i_rtc | |-- rtc@1f00000 gpio 10 [ + ] gpio_sunxi | |-- pinctrl@1f02c00 gpio 11 [ + ] gpio_sunxi | | `-- PL i2c 0 [ + ] sun8i_rsb | `-- rsb@1f03400 pmic 0 [ + ] axp_pmic | `-- pmic@3a3 sysreset 0 [ ] axp_sysreset | `-- axp_sysreset backlight 0 [ ] pwm_backlight |-- backlight clk 2 [ + ] fixed_clock |-- osc24M_clk clk 3 [ ] fixed_clock `-- ext_osc32k_clk
=> dm uclass uclass 0: root 0 * root_driver @ 5bf62028, seq 0
uclass 22: blk 0 * mmc@1c0f000.blk @ 5bf622f8, seq 0 1 mmc@1c10000.blk @ 5bf62588, seq 1 2 mmc@1c11000.blk @ 5bf62818, seq 2
uclass 26: clk 0 * clock@1c20000 @ 5bf62c20, seq 0 1 * rtc@1f00000 @ 5bf63338, seq 1 2 * osc24M_clk @ 5bf63658, seq 2 3 ext_osc32k_clk @ 5bf636e0, seq 3
uclass 29: display uclass 34: efi uclass 36: ethernet 0 * usb_ether @ 5bf6ab38, seq 0
uclass 40: gpio 0 * pinctrl@1c20800 @ 5bf62d20, seq 0 1 * PA @ 5bf62d98, seq 1 2 * PB @ 5bf62e10, seq 2 3 * PC @ 5bf62e88, seq 3 4 * PD @ 5bf62f00, seq 4 5 * PE @ 5bf62f78, seq 5 6 * PF @ 5bf62ff0, seq 6 7 * PG @ 5bf63068, seq 7 8 * PH @ 5bf630e0, seq 8 9 * PI @ 5bf63158, seq 9 10 * pinctrl@1f02c00 @ 5bf63390, seq 10 11 * PL @ 5bf63408, seq 11
uclass 43: i2c 0 * rsb@1f03400 @ 5bf63480, seq 3
uclass 45: i2c_generic uclass 51: keyboard uclass 55: usb_mass_storage uclass 59: mmc 0 * mmc@1c0f000 @ 5bf62128, seq 0 1 * mmc@1c10000 @ 5bf623d8, seq 2 2 * mmc@1c11000 @ 5bf62668, seq 1
uclass 63: nop uclass 67: panel uclass 68: backlight 0 backlight @ 5bf63600, seq 0
uclass 73: phy 0 * phy@1c19400 @ 5bf629a0, seq 0
uclass 76: pmic 0 * pmic@3a3 @ 5bf634f8, seq 0
uclass 78: pwm uclass 83: regulator uclass 85: reset 0 * reset @ 5bf62c98, seq 0
uclass 90: serial 0 * serial@1c28000 @ 5bf63248, seq 0 1 serial@1c28400 @ 5bf632c0, seq 1
uclass 91: simple_bus 0 * soc@1c00000 @ 5bf620a0, seq 0
uclass 101: sysreset 0 axp_sysreset @ 5bf63588, seq 0 1 watchdog@1c20ca0 @ 5bf639d8, seq 1
uclass 107: usb 0 * usb@1c1a000 @ 5bf62b50, seq 0 1 * usb@1c1a400 @ 5bf62ba8, seq 1
uclass 108: usb_dev_generic uclass 109: usb_hub 0 * usb_hub @ 5bf74528, seq 0 1 * usb_hub @ 5bf6bc08, seq 1
uclass 110: usb 0 * usb@1c19000 @ 5bf62918, seq 0
uclass 111: video uclass 113: vidconsole0 uclass 118: watchdog 0 * watchdog@1c20ca0 @ 5bf631d0, seq 0
But you don't have a PWM, so how can the PWM work?
I imagine it is failing this line of pwm_backlight_of_to_plat():
ret = uclass_get_device_by_ofnode(UCLASS_PWM, args.node, &priv->pwm);
Here is an example DT fragment from snow:
backlight: backlight { compatible = "pwm-backlight"; pwms = <&pwm 0 1000000 0>; brightness-levels = <0 100 500 1000 1500 2000 2500 2800>; default-brightness-level = <7>; enable-gpios = <&gpx3 0 GPIO_ACTIVE_HIGH>; power-supply = <&fet1>; };
- Simon
Sincerely, Brandon
On Fri, Jan 13, 2023 at 12:43 AM Simon Glass sjg@chromium.org wrote:
Hi Cheo,
On Thu, 12 Jan 2023 at 02:40, Cheo Fusi fusibrandon13@gmail.com wrote:
Hi Simon,
Thank you for your response.
What I'm trying to do is control a backlight WITHOUT attaching it to a panel in the device tree.
My approach is to find the top level backlight node in the device tree at some point late in the init sequence (like board_init_f), grab the first and only backlight device in UCLASS_PANEL_BACKLIGHT, and call backlight_enable on it. Something like
struct udevice* backlight; ret = uclass_get_device(UCLASS_PANEL_BACKLIGHT, 0, &backlight);
Can you post the output of 'dm tree' and 'dm uclass'? It is possible that it is not device 0. It would be safer to use uclass_first_device_err() or similar.
No device itself should return -ENODEV as an error. It always means that the device cannot be found. Given that you have established that it is bound, that can only mean that you are specifying the wrong device sequence number.
[.]
Regards, Simon