RE: [PATCH] reset: axs10x: Implement assert and deassert callbacks

From: Vitor Soares
Date: Mon Apr 08 2019 - 09:25:59 EST


Hi Eugeniy,

From: Eugeniy Paltsev <paltsev@xxxxxxxxxxxx>
Date: Mon, Apr 08, 2019 at 12:40:00

> Hi Vitor,
>
> On Mon, 2019-04-08 at 12:31 +0200, Vitor Soares wrote:
> > Some custom IP-block connected to ARC AXS10x board need assert and
> > deassert functions to control reset signal of selected peripherals.
> >
> > This patch improve AXS10x reset driver by adding assert and deassert
> > callbacks.
>
>
> In the AXS10x reset driver only 'reset' callback is intentionally
> > implemented.
> AXS10x is FPGA based boards and with our default firmware AXS10x reset
> > register is implemented as self-deasserted.
>

I have another reset block connect through AXI.

> Do you have somehow modified AXS10x firmware where reset register is not
> > self-deasserted?
> In that case "simple-reset" driver will be suitable for you, I guess.

I will try it.

> Otherwise this implementation is incorrect - there should be no 'assert' for
> > reset controller with self-deasserted logic.

So the assert and reset callback are mutually exclusive?

>
>
> >
> > Signed-off-by: Vitor Soares <vitor.soares@xxxxxxxxxxxx>
> >
> > Cc: Eugeniy Paltsev <eugeniy.Paltsev@xxxxxxxxxxxx>
> > Cc: Alexey Brodkin <abrodkin@xxxxxxxxxxxx>
> > Cc: Joao Pinto <jpinto@xxxxxxxxxxxx>
> > Cc: Jose Abreu <jose.abreu@xxxxxxxxxxxx>
> > Cc: Luis Oliveira <lolivei@xxxxxxxxxxxx>
> > Cc: Gustavo Pimentel <gustavo.pimentel@xxxxxxxxxxxx>
> > Cc: Nelson Costa <nelson.costa@xxxxxxxxxxxx>
> > Cc: Pedro Sousa <pedrom.sousa@xxxxxxxxxxxx>
> > Cc: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx>
> > ---
> > drivers/reset/reset-axs10x.c | 30 +++++++++++++++++++++++++++++-
> > 1 file changed, 29 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/reset/reset-axs10x.c b/drivers/reset/reset-axs10x.c
> > index a854ef41..12dac8b 100644
> > --- a/drivers/reset/reset-axs10x.c
> > +++ b/drivers/reset/reset-axs10x.c
> > @@ -37,8 +37,36 @@ static int axs10x_reset_reset(struct
> > reset_controller_dev *rcdev,
> > return 0;
> > }
> >
> > +static int axs10x_reset_assert(struct reset_controller_dev *rcdev,
> > + unsigned long id)
> > +{
> > + struct axs10x_rst *rst = to_axs10x_rst(rcdev);
> > + unsigned long flags;
> > +
> > + spin_lock_irqsave(&rst->lock, flags);
> > + writel(readl(rst->regs_rst) & ~BIT(id), rst->regs_rst);
> > + spin_unlock_irqrestore(&rst->lock, flags);
> > +
> > + return 0;
> > +}
> > +
> > +static int axs10x_reset_deassert(struct reset_controller_dev *rcdev,
> > + unsigned long id)
> > +{
> > + struct axs10x_rst *rst = to_axs10x_rst(rcdev);
> > + unsigned long flags;
> > +
> > + spin_lock_irqsave(&rst->lock, flags);
> > + writel(readl(rst->regs_rst) | BIT(id), rst->regs_rst);
> > + spin_unlock_irqrestore(&rst->lock, flags);
> > +
> > + return 0;
> > +}
> > +
> > static const struct reset_control_ops axs10x_reset_ops = {
> > - .reset = axs10x_reset_reset,
> > + .reset = axs10x_reset_reset,
> > + .assert = axs10x_reset_assert,
> > + .deassert = axs10x_reset_deassert,
> > };
> >
> > static int axs10x_reset_probe(struct platform_device *pdev)
> --
> Eugeniy Paltsev
>

Best regards,
Vitor Soares