lkml.org 
[lkml]   [2015]   [May]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RESEND PATCH v3 05/10] mfd: arizona: Factor out SYSCLK enable from wm5102 hardware patch
    On Mon, 11 May 2015, Charles Keepax wrote:

    > wm5102 applies a custom hardware boot sequence, for this the SYSCLK
    > needs to be enabled. This patch factors out the code that enables
    > SYSCLK for this sequence such that it can be used for other boot time
    > operations that require SYSCLK.
    >
    > Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
    > Acked-by: Lee Jones <lee.jones@linaro.org>
    > ---
    > drivers/mfd/arizona-core.c | 77 ++++++++++++++++++++++++++++++++-----------
    > 1 files changed, 57 insertions(+), 20 deletions(-)

    Applied, thanks.

    > diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
    > index 326a4af..b5a7e0e 100644
    > --- a/drivers/mfd/arizona-core.c
    > +++ b/drivers/mfd/arizona-core.c
    > @@ -264,19 +264,25 @@ static void arizona_disable_reset(struct arizona *arizona)
    > }
    > }
    >
    > -static int wm5102_apply_hardware_patch(struct arizona *arizona)
    > +struct arizona_sysclk_state {
    > + unsigned int fll;
    > + unsigned int sysclk;
    > +};
    > +
    > +static int arizona_enable_freerun_sysclk(struct arizona *arizona,
    > + struct arizona_sysclk_state *state)
    > {
    > - unsigned int fll, sysclk;
    > int ret, err;
    >
    > /* Cache existing FLL and SYSCLK settings */
    > - ret = regmap_read(arizona->regmap, ARIZONA_FLL1_CONTROL_1, &fll);
    > + ret = regmap_read(arizona->regmap, ARIZONA_FLL1_CONTROL_1, &state->fll);
    > if (ret) {
    > dev_err(arizona->dev, "Failed to cache FLL settings: %d\n",
    > ret);
    > return ret;
    > }
    > - ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, &sysclk);
    > + ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1,
    > + &state->sysclk);
    > if (ret) {
    > dev_err(arizona->dev, "Failed to cache SYSCLK settings: %d\n",
    > ret);
    > @@ -306,14 +312,58 @@ static int wm5102_apply_hardware_patch(struct arizona *arizona)
    > goto err_fll;
    > }
    >
    > + return 0;
    > +
    > +err_fll:
    > + err = regmap_write(arizona->regmap, ARIZONA_FLL1_CONTROL_1, state->fll);
    > + if (err)
    > + dev_err(arizona->dev,
    > + "Failed to re-apply old FLL settings: %d\n", err);
    > +
    > + return ret;
    > +}
    > +
    > +static int arizona_disable_freerun_sysclk(struct arizona *arizona,
    > + struct arizona_sysclk_state *state)
    > +{
    > + int ret;
    > +
    > + ret = regmap_write(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1,
    > + state->sysclk);
    > + if (ret) {
    > + dev_err(arizona->dev,
    > + "Failed to re-apply old SYSCLK settings: %d\n", ret);
    > + return ret;
    > + }
    > +
    > + ret = regmap_write(arizona->regmap, ARIZONA_FLL1_CONTROL_1, state->fll);
    > + if (ret) {
    > + dev_err(arizona->dev,
    > + "Failed to re-apply old FLL settings: %d\n", ret);
    > + return ret;
    > + }
    > +
    > + return 0;
    > +}
    > +
    > +static int wm5102_apply_hardware_patch(struct arizona *arizona)
    > +{
    > + struct arizona_sysclk_state state;
    > + int err, ret;
    > +
    > + ret = arizona_enable_freerun_sysclk(arizona, &state);
    > + if (ret)
    > + return ret;
    > +
    > /* Start the write sequencer and wait for it to finish */
    > ret = regmap_write(arizona->regmap, ARIZONA_WRITE_SEQUENCER_CTRL_0,
    > ARIZONA_WSEQ_ENA | ARIZONA_WSEQ_START | 160);
    > if (ret) {
    > dev_err(arizona->dev, "Failed to start write sequencer: %d\n",
    > ret);
    > - goto err_sysclk;
    > + goto err;
    > }
    > +
    > ret = arizona_poll_reg(arizona, 5, ARIZONA_WRITE_SEQUENCER_CTRL_1,
    > ARIZONA_WSEQ_BUSY, 0);
    > if (ret) {
    > @@ -322,21 +372,8 @@ static int wm5102_apply_hardware_patch(struct arizona *arizona)
    > ret = -ETIMEDOUT;
    > }
    >
    > -err_sysclk:
    > - err = regmap_write(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, sysclk);
    > - if (err) {
    > - dev_err(arizona->dev,
    > - "Failed to re-apply old SYSCLK settings: %d\n",
    > - err);
    > - }
    > -
    > -err_fll:
    > - err = regmap_write(arizona->regmap, ARIZONA_FLL1_CONTROL_1, fll);
    > - if (err) {
    > - dev_err(arizona->dev,
    > - "Failed to re-apply old FLL settings: %d\n",
    > - err);
    > - }
    > +err:
    > + err = arizona_disable_freerun_sysclk(arizona, &state);
    >
    > return ret ?: err;
    > }

    --
    Lee Jones
    Linaro STMicroelectronics Landing Team Lead
    Linaro.org │ Open source software for ARM SoCs
    Follow Linaro: Facebook | Twitter | Blog


    \
     
     \ /
      Last update: 2015-05-13 14:41    [W:3.057 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site