Re: [PATCH v2 4/7] regulator: core: Allow specifying an initial load w/ the bulk API

From: Yongqin Liu
Date: Tue Aug 16 2022 - 08:59:37 EST


HI, Douglas

With this change, I get one kernel panic with my hikey960
android-mainline based Android build,
if it's reverted, then the build could boot to the home screen successfully.
>From the log information I shared here, not sure if you have any idea
what I could do to have the hikey960
build work with this change,

The kernel panic is something like this, for details, please check the
log here: http://ix.io/47Lq

[ 10.738042][ T193] adv7511 1-0039: error 0000000000000000: Failed
to get supply 'v1p2'
[ 10.748457][ T194] apexd: Found pre-installed APEX
/system/apex/com.android.os.statsd.apex
[ 10.752908][ T67] Unable to handle kernel read from unreadable
memory at virtual address 000000000000004c
[ 10.753116][ T8] Unable to handle kernel read from unreadable
memory at virtual address 0000000000000078
[ 10.753130][ T8] Mem abort info:
[ 10.753135][ T8] ESR = 0x0000000096000005
[ 10.753142][ T8] EC = 0x25: DABT (current EL), IL = 32 bits
[ 10.753152][ T8] SET = 0, FnV = 0
[ 10.753159][ T8] EA = 0, S1PTW = 0
[ 10.753166][ T8] FSC = 0x05: level 1 translation fault
[ 10.753174][ T8] Data abort info:
[ 10.753179][ T8] ISV = 0, ISS = 0x00000005
[ 10.753184][ T8] CM = 0, WnR = 0
[ 10.753192][ T8] user pgtable: 4k pages, 39-bit VAs, pgdp=0000000003098000
[ 10.753204][ T8] [0000000000000078] pgd=0000000000000000,
p4d=0000000000000000, pud=0000000000000000
[ 10.753232][ T8] Internal error: Oops: 96000005 [#1] PREEMPT SMP
[ 10.753245][ T8] Modules linked in: adv7511(E+) tcpci_rt1711h(E)
hci_uart(E) btqca(E) btbcm(E) cpufreq_dt(E) hi3660_i2s(E)
hisi_hikey_usb(E) hi6421_pmic_core(E) syscon_reboot_mode(E)
reboot_mode(E) hi3660_mailbox(E) dw_mmc_k3(E) hisi_thermal(E)
dw_mmc_pltfm(E) dw_mmc(E) kirin_drm(E) snd_soc_simple_card(E)
snd_soc_simple_card_utils(E) spi_pl022(E) kirin_dsi(E)
phy_hi3660_usb3(E) i2c_designware_platform(E) drm_cma_helper(E)
i2c_designware_core(E) mali_kbase(OE) k3dma(E) cma_heap(E)
system_heap(E)
[ 10.753436][ T8] CPU: 2 PID: 8 Comm: kworker/u16:0 Tainted: G
OE 5.19.0-mainline-03487-g86d047950300-dirty #1
[ 10.753454][ T8] Hardware name: HiKey960 (DT)
[ 10.753463][ T8] Workqueue: events_unbound async_run_entry_fn
[ 10.753497][ T8] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT
-SSBS BTYPE=--)
[ 10.753516][ T8] pc : regulator_bulk_enable_async+0x3c/0x98
[ 10.753540][ T8] lr : async_run_entry_fn+0x30/0xf8
[ 10.753559][ T8] sp : ffffffc009ed3d20
[ 10.753567][ T8] x29: ffffffc009ed3d40 x28: 0000000000000402
x27: ffffff801ad99828
[ 10.753592][ T8] x26: ffffff803217b010 x25: 0000000000000002
x24: ffffff8003385da8
[ 10.753617][ T8] x23: ffffff8003385da0 x22: ffffff801ad94805
x21: ffffff8003385da0
[ 10.753642][ T8] x20: 0000000000000000 x19: ffffff8003143d20
x18: ffffffc008075028
[ 10.753667][ T8] x17: 000000040044ffff x16: 0000000000000001
x15: 0000000000000010
[ 10.753691][ T8] x14: 0000000000000000 x13: 0000000000000f58
x12: 0000000082355555
[ 10.753715][ T8] x11: 00006acfbfa2f400 x10: 0000000000000016 x9
: 00ffffffffffffff
[ 10.753740][ T8] x8 : da9ecda1b63b0500 x7 : 0000000000008080 x6
: 0000000000000000
[ 10.753764][ T8] x5 : 0000000000000001 x4 : 0000646e756f626e x3
: ffffff801ad99828
[ 10.753788][ T8] x2 : ffffff8003385da8 x1 : ffffffc009ed3d20 x0
: ffffff8003143d20
[ 10.753812][ T8] Call trace:
[ 10.753818][ T8] regulator_bulk_enable_async+0x3c/0x98
[ 10.753839][ T8] async_run_entry_fn+0x30/0xf8
[ 10.753859][ T8] process_one_work+0x1d0/0x404
[ 10.753879][ T8] worker_thread+0x25c/0x43c
[ 10.753897][ T8] kthread+0xf0/0x2c0
[ 10.753912][ T8] ret_from_fork+0x10/0x20
[ 10.753940][ T8] Code: f81f83a8 f9400814 a900ffff f90003ff (f9403e95)
[ 10.753950][ T8] ---[ end trace 0000000000000000 ]---
[ 10.760621][ T194] apexd: Found pre-installed APEX
/system/apex/com.android.permission.capex
[ 10.767672][ T67] Mem abort info:
[ 10.779658][ T194] apexd: Found pre-installed APEX
/system/apex/com.android.art.capex
[ 10.783690][ T67] ESR = 0x0000000096000005
[ 10.792424][ T194] apexd: Found pre-installed APEX
/system/apex/com.android.scheduling.capex
[ 10.794713][ T8] Kernel panic - not syncing: Oops: Fatal exception
[ 10.794723][ T8] SMP: stopping secondary CPUs
[ 10.798141][ T8] Kernel Offset: 0x70000 from 0xffffffc008000000
[ 10.798150][ T8] PHYS_OFFSET: 0x0
[ 10.798156][ T8] CPU features: 0x0000,00649020,00001086
[ 10.798167][ T8] Memory Limit: none

Thanks,
Yongqin Liu

On Wed, 27 Jul 2022 at 01:39, Douglas Anderson <dianders@xxxxxxxxxxxx> wrote:
>
> There are a number of drivers that follow a pattern that looks like
> this:
> 1. Use the regulator bulk API to get a bunch of regulators.
> 2. Set the load on each of the regulators to use whenever the
> regulators are enabled.
>
> Let's make this easier by just allowing the drivers to pass the load
> in.
>
> As part of this change we need to move the error printing in
> regulator_bulk_get() around; let's switch to the new dev_err_probe()
> to simplify it.
>
> Signed-off-by: Douglas Anderson <dianders@xxxxxxxxxxxx>
> ---
>
> Changes in v2:
> - ("Allow specifying an initial load w/ the bulk API") new for v2.
>
> drivers/regulator/core.c | 20 ++++++++++++--------
> include/linux/regulator/consumer.h | 12 ++++++++----
> 2 files changed, 20 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
> index 1e54a833f2cf..17c476fc8adb 100644
> --- a/drivers/regulator/core.c
> +++ b/drivers/regulator/core.c
> @@ -4783,22 +4783,26 @@ int regulator_bulk_get(struct device *dev, int num_consumers,
> consumers[i].consumer = regulator_get(dev,
> consumers[i].supply);
> if (IS_ERR(consumers[i].consumer)) {
> - ret = PTR_ERR(consumers[i].consumer);
> consumers[i].consumer = NULL;
> + ret = dev_err_probe(dev, PTR_ERR(consumers[i].consumer),
> + "Failed to get supply '%s'",
> + consumers[i].supply);
> goto err;
> }
> +
> + if (consumers[i].init_load_uA > 0) {
> + ret = regulator_set_load(consumers[i].consumer,
> + consumers[i].init_load_uA);
> + if (ret) {
> + i++;
> + goto err;
> + }
> + }
> }
>
> return 0;
>
> err:
> - if (ret != -EPROBE_DEFER)
> - dev_err(dev, "Failed to get supply '%s': %pe\n",
> - consumers[i].supply, ERR_PTR(ret));
> - else
> - dev_dbg(dev, "Failed to get supply '%s', deferring\n",
> - consumers[i].supply);
> -
> while (--i >= 0)
> regulator_put(consumers[i].consumer);
>
> diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h
> index bbf6590a6dec..5779f4466e62 100644
> --- a/include/linux/regulator/consumer.h
> +++ b/include/linux/regulator/consumer.h
> @@ -171,10 +171,13 @@ struct regulator;
> /**
> * struct regulator_bulk_data - Data used for bulk regulator operations.
> *
> - * @supply: The name of the supply. Initialised by the user before
> - * using the bulk regulator APIs.
> - * @consumer: The regulator consumer for the supply. This will be managed
> - * by the bulk API.
> + * @supply: The name of the supply. Initialised by the user before
> + * using the bulk regulator APIs.
> + * @init_load_uA: After getting the regulator, regulator_set_load() will be
> + * called with this load. Initialised by the user before
> + * using the bulk regulator APIs.
> + * @consumer: The regulator consumer for the supply. This will be managed
> + * by the bulk API.
> *
> * The regulator APIs provide a series of regulator_bulk_() API calls as
> * a convenience to consumers which require multiple supplies. This
> @@ -182,6 +185,7 @@ struct regulator;
> */
> struct regulator_bulk_data {
> const char *supply;
> + int init_load_uA;
> struct regulator *consumer;
>
> /* private: Internal use */
> --
> 2.37.1.359.gd136c6c3e2-goog
>


--
Best Regards,
Yongqin Liu
---------------------------------------------------------------
#mailing list
linaro-android@xxxxxxxxxxxxxxxx
http://lists.linaro.org/mailman/listinfo/linaro-android