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

Yongqin Liu yongqin.liu at linaro.org
Tue Aug 16 12:58:41 UTC 2022


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 at chromium.org> 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 at chromium.org>
> ---
>
> 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 at lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-android


More information about the dri-devel mailing list