lkml.org 
[lkml]   [2019]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRE: [PATCH] reset: axs10x: Implement assert and deassert callbacks
    Date
    Hi Eugeniy,

    From: Eugeniy Paltsev <paltsev@synopsys.com>
    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@synopsys.com>
    > >
    > > Cc: Eugeniy Paltsev <eugeniy.Paltsev@synopsys.com>
    > > Cc: Alexey Brodkin <abrodkin@synopsys.com>
    > > Cc: Joao Pinto <jpinto@synopsys.com>
    > > Cc: Jose Abreu <jose.abreu@synopsys.com>
    > > Cc: Luis Oliveira <lolivei@synopsys.com>
    > > Cc: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
    > > Cc: Nelson Costa <nelson.costa@synopsys.com>
    > > Cc: Pedro Sousa <pedrom.sousa@synopsys.com>
    > > Cc: Philipp Zabel <p.zabel@pengutronix.de>
    > > ---
    > > 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

    \
     
     \ /
      Last update: 2019-04-08 15:26    [W:2.976 / U:0.808 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site