lkml.org 
[lkml]   [2021]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH 3/7] soc: apple: Add driver for Apple PMGR power state controls
    From
    Date
    Hi Hector,

    On Wed, 2021-10-06 at 00:59 +0900, Hector Martin wrote:
    > Implements genpd and reset providers for downstream devices. Each
    > instance of the driver binds to a single register and represents a
    > single SoC power domain.
    >
    > The driver does not currently implement all features (auto-pm,
    > clockgate-only state), but we declare the respective registers for
    > documentation purposes. These features will be added as they become
    > useful for downstream devices.
    >
    > This also creates the apple/soc tree and Kconfig submenu.
    >
    > Signed-off-by: Hector Martin <marcan@marcan.st>
    > ---
    > MAINTAINERS | 1 +
    > drivers/soc/Kconfig | 1 +
    > drivers/soc/Makefile | 1 +
    > drivers/soc/apple/Kconfig | 21 ++
    > drivers/soc/apple/Makefile | 2 +
    > drivers/soc/apple/apple-pmgr-pwrstate.c | 281 ++++++++++++++++++++++++
    > 6 files changed, 307 insertions(+)
    > create mode 100644 drivers/soc/apple/Kconfig
    > create mode 100644 drivers/soc/apple/Makefile
    > create mode 100644 drivers/soc/apple/apple-pmgr-pwrstate.c
    >
    [...]
    > diff --git a/drivers/soc/apple/apple-pmgr-pwrstate.c b/drivers/soc/apple/apple-pmgr-pwrstate.c
    > new file mode 100644
    > index 000000000000..a0338dbb29b8
    > --- /dev/null
    > +++ b/drivers/soc/apple/apple-pmgr-pwrstate.c
    > @@ -0,0 +1,281 @@
    [...]
    > +static int apple_pmgr_reset_assert(struct reset_controller_dev *rcdev, unsigned long id)
    > +{
    > + struct apple_pmgr_ps *ps = rcdev_to_apple_pmgr_ps(rcdev);
    > +
    > + mutex_lock(&ps->genpd.mlock);
    > +
    > + if (ps->genpd.status == GENPD_STATE_OFF)
    > + dev_err(ps->dev, "PS 0x%x: asserting RESET while powered down\n", ps->offset);
    > +
    > + dev_dbg(ps->dev, "PS 0x%x: assert reset\n", ps->offset);
    > + /* Quiesce device before asserting reset */
    > + regmap_set_bits(ps->regmap, ps->offset, APPLE_PMGR_DEV_DISABLE);
    > + regmap_set_bits(ps->regmap, ps->offset, APPLE_PMGR_RESET);
    > +
    > + mutex_unlock(&ps->genpd.mlock);
    > +
    > + return 0;
    > +}
    > +
    > +static int apple_pmgr_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id)
    > +{
    > + struct apple_pmgr_ps *ps = rcdev_to_apple_pmgr_ps(rcdev);
    > +
    > + mutex_lock(&ps->genpd.mlock);
    > +
    > + dev_dbg(ps->dev, "PS 0x%x: deassert reset\n", ps->offset);
    > + regmap_clear_bits(ps->regmap, ps->offset, APPLE_PMGR_RESET);
    > + regmap_clear_bits(ps->regmap, ps->offset, APPLE_PMGR_DEV_DISABLE);
    > +
    > + if (ps->genpd.status == GENPD_STATE_OFF)
    > + dev_err(ps->dev, "PS 0x%x: RESET was deasserted while powered down\n", ps->offset);
    > +
    > + mutex_unlock(&ps->genpd.mlock);
    > +
    > + return 0;
    > +}
    > +
    > +static int apple_pmgr_reset_reset(struct reset_controller_dev *rcdev, unsigned long id)
    > +{
    > + int ret;
    > +
    > + ret = apple_pmgr_reset_assert(rcdev, id);
    > + if (ret)
    > + return ret;
    > +
    > + usleep_range(APPLE_PMGR_RESET_TIME, 2 * APPLE_PMGR_RESET_TIME);

    Is this delay known to be long enough for all consumers using the
    reset_control_reset() functionality? Are there any users at all?

    Is it ok for a genpd transition to happen during this sleep?

    > + return apple_pmgr_reset_deassert(rcdev, id);
    > +}

    regards
    Philipp

    \
     
     \ /
      Last update: 2021-10-06 11:25    [W:5.352 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site