Embedded Buildroot and Yocto Linux crash 50% of the time

0

I am getting the below error 50% of the time during startup on an STM32 based processor (OSD32MP15x).

I've tried over 40 versions configs and setups none work and I am under high pressure to deliver this piece of hardware to a client. To me this looks like some kind of timing issue because it doesn't always happen.

I've tried to disable USB related configs, change DTS files and strip out everything that is not needed and last but not least change power config in the linux config and DTS.

Questions: How can I debug the below? What does this error look like to you?

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 5.4.56 (yme@ubuntu18) (gcc version 9.3.0 (Buildroot 2020.02-00011-g7ea8a52)) #1 SMP PREEMPT Wed Nov 4 17:25:46 CET 2020
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt: Machine model: IM45
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] Reserved memory: created DMA memory pool at 0x10000000, size 0 MiB
[    0.000000] OF: reserved mem: initialized node mcuram2@10000000, compatible id shared-dma-pool
[    0.000000] Reserved memory: created DMA memory pool at 0x10040000, size 0 MiB
[    0.000000] OF: reserved mem: initialized node vdev0vring0@10040000, compatible id shared-dma-pool
[    0.000000] Reserved memory: created DMA memory pool at 0x10041000, size 0 MiB
[    0.000000] OF: reserved mem: initialized node vdev0vring1@10041000, compatible id shared-dma-pool
[    0.000000] Reserved memory: created DMA memory pool at 0x10042000, size 0 MiB
[    0.000000] OF: reserved mem: initialized node vdev0buffer@10042000, compatible id shared-dma-pool
[    0.000000] Reserved memory: created DMA memory pool at 0x30000000, size 0 MiB
[    0.000000] OF: reserved mem: initialized node mcuram@30000000, compatible id shared-dma-pool
[    0.000000] Reserved memory: created DMA memory pool at 0x38000000, size 0 MiB
[    0.000000] OF: reserved mem: initialized node retram@38000000, compatible id shared-dma-pool
[    0.000000] cma: Reserved 128 MiB at 0xd2000000
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.0
[    0.000000] percpu: Embedded 20 pages/cpu s50124 r8192 d23604 u81920
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 113536
[    0.000000] Kernel command line: root=/dev/mmcblk1p2 rootwait rw console=ttySTM0,115200
[    0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 305152K/458752K available (11264K kernel code, 844K rwdata, 3364K rodata, 1024K init, 216K bss, 22528K reserved, 131072K cma-reserved, 0K highmem)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1
[    0.000000] rcu: Preemptible hierarchical RCU implementation.
[    0.000000] rcu:     RCU event tracing is enabled.
[    0.000000]  Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[    0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[    0.000000] random: get_random_bytes called from start_kernel+0x31c/0x4f4 with crng_init=0
[    0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (virt).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[    0.000009] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[    0.000027] Switching to timer-based delay loop, resolution 41ns
[    0.001228] Console: colour dummy device 80x30
[    0.001276] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
[    0.001296] pid_max: default: 32768 minimum: 301
[    0.001560] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.001581] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.002900] CPU: Testing write buffer coherency: ok
[    0.003447] /cpus/cpu@0 missing clock-frequency property
[    0.003484] /cpus/cpu@1 missing clock-frequency property
[    0.003504] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[    0.060001] Setting up static identity map for 0xc0100000 - 0xc0100060
[    0.079971] rcu: Hierarchical SRCU implementation.
[    0.104229] smp: Bringing up secondary CPUs ...
[    0.180623] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
[    0.180859] smp: Brought up 1 node, 2 CPUs
[    0.180884] SMP: Total of 2 processors activated (96.00 BogoMIPS).
[    0.180895] CPU: All CPU(s) started in SVC mode.
[    0.181728] devtmpfs: initialized
[    0.201048] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5
[    0.201702] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.201736] futex hash table entries: 512 (order: 3, 32768 bytes, linear)
[    0.208702] pinctrl core: initialized pinctrl subsystem
[    0.211039] NET: Registered protocol family 16
[    0.223325] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.225695] hw-breakpoint: found 5 (+1 reserved) breakpoint and 4 watchpoint registers.
[    0.225715] hw-breakpoint: maximum watchpoint size is 8 bytes.
[    0.226146] Serial: AMBA PL011 UART driver
[    0.228991] stm32-pm-domain pm_domain: domain core-ret-power-domain registered
[    0.229030] stm32-pm-domain pm_domain: subdomain core-power-domain registered
[    0.229046] stm32-pm-domain pm_domain: domains probed
[    0.264062] SCSI subsystem initialized
[    0.264934] usbcore: registered new interface driver usbfs
[    0.265017] usbcore: registered new interface driver hub
[    0.265170] usbcore: registered new device driver usb
[    0.265576] pps_core: LinuxPPS API ver. 1 registered
[    0.265590] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.265624] PTP clock support registered
[    0.265887] EDAC MC: Ver: 3.0.0
[    0.267262] Advanced Linux Sound Architecture Driver Initialized.
[    0.269092] clocksource: Switched to clocksource arch_sys_counter
[    0.994946] thermal_sys: Registered thermal governor 'step_wise'
[    0.995599] NET: Registered protocol family 2
[    0.996743] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 6144 bytes, linear)
[    0.996799] TCP established hash table entries: 4096 (order: 2, 16384 bytes, linear)
[    0.996866] TCP bind hash table entries: 4096 (order: 3, 32768 bytes, linear)
[    0.996962] TCP: Hash tables configured (established 4096 bind 4096)
[    0.997119] UDP hash table entries: 256 (order: 1, 8192 bytes, linear)
[    0.997165] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)
[    0.997480] NET: Registered protocol family 1
[    0.998493] RPC: Registered named UNIX socket transport module.
[    0.998514] RPC: Registered udp transport module.
[    0.998525] RPC: Registered tcp transport module.
[    0.998536] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.999750] hw perfevents: enabled with armv7_cortex_a7 PMU driver, 5 counters available
[    1.001772] Initialise system trusted keyrings
[    1.002136] workingset: timestamp_bits=14 max_order=17 bucket_order=3
[    1.015364] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    1.016787] NFS: Registering the id_resolver key type
[    1.016838] Key type id_resolver registered
[    1.016850] Key type id_legacy registered
[    1.017081] ntfs: driver 2.1.32 [Flags: R/O].
[    1.017623] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
[    1.018434] fuse: init (API version 7.31)
[    1.019683] NET: Registered protocol family 38
[    1.019706] Key type asymmetric registered
[    1.019719] Asymmetric key parser 'x509' registered
[    1.019785] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
[    1.019800] io scheduler mq-deadline registered
[    1.019811] io scheduler kyber registered
[    1.029372] STM32 USART driver initialized
[    1.050170] brd: module loaded
[    1.065205] loop: module loaded
[    1.070532] libphy: Fixed MDIO Bus: probed
[    1.072541] CAN device driver interface
[    1.075529] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.075582] ehci-platform: EHCI generic platform driver
[    1.076011] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    1.076048] ohci-platform: OHCI generic platform driver
[    1.076725] usbcore: registered new interface driver cdc_acm
[    1.076739] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[    1.080942] i2c /dev entries driver
[    1.084746] stm32-cpufreq stm32-cpufreq: Failed to get chip info: -517
[    1.087467] sdhci: Secure Digital Host Controller Interface driver
[    1.087483] sdhci: Copyright(c) Pierre Ossman
[    1.087493] Synopsys Designware Multimedia Card Interface Driver
[    1.087913] sdhci-pltfm: SDHCI platform and OF driver helper
[    1.088990] ledtrig-cpu: registered to indicate activity on CPUs
[    1.090464] usbcore: registered new interface driver usbhid
[    1.090481] usbhid: USB HID core driver
[    1.090775] arm-smc-mbox mailbox-0: ARM SMC mailbox enabled.
[    1.090909] arm-smc-mbox mailbox-1: ARM SMC mailbox enabled.
[    1.092452] remoteproc remoteproc0: releasing m4
[    1.094961] Unable to get STM32 DDR PMU clock
[    1.099244] drop_monitor: Initializing network drop monitor service
[    1.099591] NET: Registered protocol family 17
[    1.099625] can: controller area network core (rev 20170425 abi 9)
[    1.099760] NET: Registered protocol family 29
[    1.099779] can: raw protocol (rev 20170425)
[    1.099791] can: broadcast manager protocol (rev 20170425 t)
[    1.099809] can: netlink gateway (rev 20190810) max_hops=1
[    1.100648] Key type dns_resolver registered
[    1.100825] ThumbEE CPU extension supported.
[    1.100855] Registering SWP/SWPB emulation handler
[    1.101320] registered taskstats version 1
[    1.101336] Loading compiled-in X.509 certificates
[    1.112592] Loaded X.509 cert 'Build time autogenerated kernel key: a1bb00e898260e4deb50c76fbad98451248b76f2'
[    1.132155] arm-scmi firmware:scmi-0: SCMI Protocol v2.0 'ST:' Firmware version 0x0
[    1.135402] remoteproc remoteproc0: releasing m4
[    1.136357] Unable to get STM32 DDR PMU clock
[    1.159535] remoteproc remoteproc0: releasing m4
[    1.160502] Unable to get STM32 DDR PMU clock
[    1.199623] stm32-mdma 58000000.dma: STM32 MDMA driver registered
[    1.202939] stm32-dma 48000000.dma: STM32 DMA driver registered
[    1.229428] random: fast init done
[    1.229493] stm32-crc32 58009000.crc: Initialized
[    1.233994] random: crng init done
[    1.241968] remoteproc remoteproc0: releasing m4
[    1.243240] stm32-ddr-pmu: probed (ID=0x00140061 VER=0x00000010), DDR@533MHz
[    1.243899] /soc/interrupt-controller@5000d000: bank0
[    1.243916] /soc/interrupt-controller@5000d000: bank1
[    1.243929] /soc/interrupt-controller@5000d000: bank2
[    1.245454] stm32mp157-pinctrl soc:pin-controller@50002000: GPIOA bank added
[    1.245888] stm32mp157-pinctrl soc:pin-controller@50002000: GPIOB bank added
[    1.246272] stm32mp157-pinctrl soc:pin-controller@50002000: GPIOC bank added
[    1.246674] stm32mp157-pinctrl soc:pin-controller@50002000: GPIOD bank added
[    1.247034] stm32mp157-pinctrl soc:pin-controller@50002000: GPIOE bank added
[    1.247478] stm32mp157-pinctrl soc:pin-controller@50002000: GPIOF bank added
[    1.247852] stm32mp157-pinctrl soc:pin-controller@50002000: GPIOG bank added
[    1.248211] stm32mp157-pinctrl soc:pin-controller@50002000: GPIOH bank added
[    1.248577] stm32mp157-pinctrl soc:pin-controller@50002000: GPIOI bank added
[    1.248617] stm32mp157-pinctrl soc:pin-controller@50002000: Pinctrl STM32 initialized
[    1.249706] stm32mp157-pinctrl soc:pin-controller-z@54004000: GPIOZ bank added
[    1.249733] stm32mp157-pinctrl soc:pin-controller-z@54004000: Pinctrl STM32 initialized
[    1.252232] 4000f000.serial: ttySTM1 at MMIO 0x4000f000 (irq = 36, base_baud = 6527435) is a stm32-usart
[    1.253971] stm32-usart 40010000.serial: interrupt mode for rx (no dma)
[    1.253994] stm32-usart 40010000.serial: interrupt mode for tx (no dma)
[    1.254033] 40010000.serial: ttySTM0 at MMIO 0x40010000 (irq = 37, base_baud = 4000000) is a stm32-usart
[    2.327555] printk: console [ttySTM0] enabled
[    2.336702] stm32_rtc 5c004000.rtc: registered as rtc0
[    2.341362] stm32_rtc 5c004000.rtc: Date/Time must be initialized
[    2.346472] stm32_rtc 5c004000.rtc: registered rev:1.2
[    2.373942] stm32f7-i2c 5c002000.i2c: doesn't use DMA
[    2.379061] stpmic1 0-0033: PMIC Chip Version: 0x21
[    2.383768] genirq: irq_chip stm32-exti-h did not update eff. affinity mask of irq 42
[    2.391628] BUCK1: supplied by vin
[    2.397045] BUCK2: supplied by vin
[    2.402086] BUCK3: supplied by vin
[    2.407216] BUCK4: supplied by vin
[    2.412185] LDO1: supplied by v3v3
[    2.417921] LDO2: supplied by vin
[    2.423176] LDO3: supplied by vdd_ddr
[    2.428498] LDO4: supplied by vin
[    2.433721] LDO5: supplied by vin
[    2.438846] LDO6: supplied by v3v3
[    2.444180] VREF_DDR: supplied by vin
[    2.449317] BOOST: supplied by vin
[    2.454858] 8<--- cut here ---
[    2.454968] VBUS_OTG: supplied by bst_out
[    2.456448] Unable to handle kernel NULL pointer dereference at virtual address 00000050
[    2.468540] pgd = 65ccf75c
[    2.471247] [00000050] *pgd=00000000
[    2.474801] Internal error: Oops: 5 [#1] PREEMPT SMP ARM
[    2.480100] Modules linked in:
[    2.483148] CPU: 0 PID: 73 Comm: irq/42-pmic_irq Not tainted 5.4.56 #1
[    2.489664] Hardware name: STM32 (Device Tree Support)
[    2.494809] PC is at mutex_trylock+0xc/0x84
[    2.498977] LR is at regulator_lock+0x1c/0xbc
[    2.503319] pc : [<c0b0dfec>]    lr : [<c05d48ec>]    psr: 60000013
[    2.509580] sp : df7c7ecc  ip : 010a1d00  fp : c0cbe554
[    2.514798] r10: c0cbe984  r9 : df7c3800  r8 : 0000000e
[    2.520016] r7 : df7eec68  r6 : 00000050  r5 : c11b5550  r4 : 00000000
[    2.526539] r3 : df7c7ecc  r2 : df7c600c  r1 : 00000000  r0 : 00000050
[    2.533064] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
[    2.540194] Control: 10c5387d  Table: c000406a  DAC: 00000051
[    2.545935] Process irq/42-pmic_irq (pid: 73, stack limit = 0xa70e693e)
[    2.552542] Stack: (0xdf7c7ecc to 0xdf7c8000)
[    2.556897] 7ec0:                            c05d48ec df7ed0c0 c11b5550 df7eec00 c05e813c
[    2.565073] 7ee0: df7f8bc0 00000000 df7eec00 c017fba0 00000020 00000024 df7ca800 00000001
[    2.573247] 7f00: 0000000e c069b370 00000001 df1a6540 df7ca700 c1104c88 df7c6000 df7eb380
[    2.581422] 7f20: df7ca700 df7c6000 00000001 df7eb380 c017c470 ffffe000 00000000 c017c48c
[    2.589599] 7f40: df7ca700 df7eb3a4 df7c6000 c017c7a4 40000013 00000000 c017c59c c1104c88
[    2.597774] 7f60: 00000000 df5a9d00 df7eb3c0 df1cbab4 df7c6000 df7eb380 c017c670 df5a9d1c
[    2.605949] 7f80: 00000000 c0148a70 00000000 df7eb3c0 c0148954 00000000 00000000 00000000
[    2.614124] 7fa0: 00000000 00000000 00000000 c01010e8 00000000 00000000 00000000 00000000
[    2.622298] 7fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[    2.630473] 7fe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
[    2.638666] [<c0b0dfec>] (mutex_trylock) from [<c05d48ec>] (regulator_lock+0x1c/0xbc)
[    2.646486] [<c05d48ec>] (regulator_lock) from [<c05e813c>] (stpmic1_boost_irq_handler+0x44/0x1cc)
[    2.655438] [<c05e813c>] (stpmic1_boost_irq_handler) from [<c017fba0>] (handle_nested_irq+0xc4/0x130)
[    2.664654] [<c017fba0>] (handle_nested_irq) from [<c069b370>] (regmap_irq_thread+0x328/0x508)
[    2.673260] [<c069b370>] (regmap_irq_thread) from [<c017c48c>] (irq_thread_fn+0x1c/0x78)
[    2.681344] [<c017c48c>] (irq_thread_fn) from [<c017c7a4>] (irq_thread+0x134/0x200)
[    2.688999] [<c017c7a4>] (irq_thread) from [<c0148a70>] (kthread+0x11c/0x144)
[    2.696132] [<c0148a70>] (kthread) from [<c01010e8>] (ret_from_fork+0x14/0x2c)
[    2.703338] Exception stack(0xdf7c7fb0 to 0xdf7c7ff8)
[    2.708385] 7fa0:                                     00000000 00000000 00000000 00000000
[    2.716562] 7fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[    2.724735] 7fe0: 00000000 00000000 00000000 00000000 00000013 00000000
[    2.731348] Code: e8bd81f0 e52de004 e1a0300d e3c32d7f (e5903000)
[    2.737474] ---[ end trace 63a5f7bb4baf46f1 ]---
[    2.742083] genirq: exiting task "irq/42-pmic_irq" (73) is an active IRQ thread (irq 42)

Edit link linux codebase: v5.4-stm32mp

Edit add DTS config:

pmic:stpmic@33{
        compatible = "st,stpmic1";
        reg = <0x33>;
        interrupts-extended = <&exti_pwr 55 IRQ_TYPE_EDGE_FALLING>;
        interrupt-controller;
        #interrupt-cells = <2>;
        status = "okay";

        regulators{
            compatible = "st,stpmic1-regulators";
            buck1-supply = <&vin>;
            buck2-supply = <&vin>;
            buck3-supply = <&vin>;
            buck4-supply = <&vin>;
            ldo1-supply = <&v3v3>;
            ldo2-supply = <&vin>;
            ldo3-supply = <&vdd_ddr>;
            ldo4-supply = <&vin>;
            ldo5-supply = <&vin>;
            ldo6-supply = <&v3v3>;
            vref_ddr-supply = <&vin>;
            boost-supply = <&vin>;
            pwr_sw1-supply = <&bst_out>;
            pwr_sw2-supply = <&bst_out>;

            vddcore:buck1{
                regulator-name = "vddcore";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <1350000>;
                regulator-always-on;
                regulator-initial-mode = <0>;
                regulator-over-current-protection;
            };

            vdd_ddr:buck2{
                regulator-name = "vdd_ddr";
                regulator-min-microvolt = <1350000>;
                regulator-max-microvolt = <1350000>;
                regulator-always-on;
                regulator-initial-mode = <0>;
                regulator-over-current-protection;
            };

            vdd:buck3{
                regulator-name = "vdd";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
                regulator-always-on;
                st,mask-reset;
                regulator-initial-mode = <0>;
                regulator-over-current-protection;
            };

            v3v3:buck4{
                regulator-name = "v3v3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
                regulator-always-on;
                regulator-over-current-protection;
                regulator-initial-mode = <0>;
            };

            v1v8_audio:ldo1{
                regulator-name = "v1v8_audio";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <1800000>;
                regulator-always-on;
                interrupts = <IT_CURLIM_LDO1 0>;
            };

            v3v3_hdmi:ldo2{
                regulator-name = "v3v3_hdmi";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
                regulator-always-on;
                interrupts = <IT_CURLIM_LDO2 0>;
            };

            vtt_ddr:ldo3{
                regulator-name = "vtt_ddr";
                regulator-min-microvolt = <500000>;
                regulator-max-microvolt = <750000>;
                regulator-always-on;
                regulator-over-current-protection;
            };

            vdd_usb:ldo4{
                regulator-name = "vdd_usb";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
                interrupts = <IT_CURLIM_LDO4 0>;
                regulator-always-on;                
            };

            vdda:ldo5{
                regulator-name = "vdda";
                regulator-min-microvolt = <2900000>;
                regulator-max-microvolt = <2900000>;
                interrupts = <IT_CURLIM_LDO5 0>;
                regulator-boot-on;
            };

            v1v2_hdmi:ldo6{
                regulator-name = "v1v2_hdmi";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <1200000>;
                regulator-always-on;
                interrupts = <IT_CURLIM_LDO6 0>;
            };

            vref_ddr:vref_ddr{
                regulator-name = "vref_ddr";
                regulator-always-on;
                regulator-over-current-protection;
            };

            bst_out:boost{
                regulator-name = "bst_out";
                interrupts = <IT_OCP_BOOST 0>;
                regulator-always-on;
            };

            vbus_otg:pwr_sw1{
                regulator-name = "vbus_otg";
                interrupts = <IT_OCP_OTG 0>;
            };

            vbus_sw:pwr_sw2{
                regulator-name = "vbus_sw";
                interrupts = <IT_OCP_SWOUT 0>;
                regulator-active-discharge = <1>;
                regulator-always-on;
            };
        };

        onkey{
            compatible = "st,stpmic1-onkey";
            interrupts = <IT_PONKEY_F 0>, <IT_PONKEY_R 0>;
            interrupt-names = "onkey-falling", "onkey-rising";
            power-off-time-sec = <10>;
            status = "okay";
        };

        watchdog {
            compatible = "st,stpmic1-wdt";
            status = "disabled";
        };
    };
linux-kernel
embedded-linux
stm32
buildroot
asked on Stack Overflow Nov 4, 2020 by Legion • edited Nov 4, 2020 by Legion

1 Answer

3

It looks like the problem was introduced by the patch: regulator: stpmic1: Usb boost over-current protection workaround.

  • The "boost" interrupt handler stpmic1_boost_irq_handler calls regulator_lock(usb_data->boost_rdev);
  • The "boost" interrupt handler (stpmic1_boost_irq_handler) is set up by the stpmic1_boost_register function, but usb_data->boost_rdev is still null at this time.
  • usb_data->boost_rdev is set to the return value of the stpmic1_boost_register function by thestpmic1_regulator_probe function.
  • If the "boost" interrupt handler stpmic1_boost_irq_handler gets called before usb_data->boost_rdev has been set by the stpmic1_regulator_probe function, then the crash occurs.

A workaround would be to set usb_data->boost_rdev = rdev; in the stpmic1_boost_register function after it has set rdev but before it sets up the interrupt handler.

This should be reported to the author of the patch. See the "Signed-off-by:" line in the patch for the email address.

answered on Stack Overflow Nov 4, 2020 by Ian Abbott • edited Nov 4, 2020 by Ian Abbott

User contributions licensed under CC BY-SA 3.0