RE: [PATCH/RFC 6/6] can: rcar_canfd: Add suspend/resume support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Geert,

> -----Original Message-----
> From: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>
> Sent: 12 September 2025 09:27
> Subject: Re: [PATCH/RFC 6/6] can: rcar_canfd: Add suspend/resume support
> 
> Hi Biju,
> 
> On Fri, 12 Sept 2025 at 09:54, Biju Das <biju.das.jz@xxxxxxxxxxxxxx> wrote:
> > > -----Original Message-----
> > > From: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>
> > > Sent: 22 August 2025 10:51
> > > Subject: [PATCH/RFC 6/6] can: rcar_canfd: Add suspend/resume support
> > >
> > > On R-Car Gen3 using PSCI, s2ram powers down the SoC.  After resume,
> > > the CAN-FD interface no longer works.  Trying to bring it up again fails:
> > >
> > >     # ip link set can0 up
> > >     RTNETLINK answers: Connection timed out
> > >
> > >     # dmesg
> > >     ...
> > >     channel 0 communication state failed
> > >
> > > Fix this by populating the (currently empty) suspend and resume
> > > callbacks, to stop/start the individual CAN-FD channels, and (de)initialize the CAN-FD controller.
> > >
> > > Signed-off-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>
> >
> > Tested-by: Reviewed-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx>
> >
> > With adaption to RZ/G3E for ram_clk [1]
> 
> Thanks!
> 
> > > --- a/drivers/net/can/rcar/rcar_canfd.c
> > > +++ b/drivers/net/can/rcar/rcar_canfd.c
> 
> > >
> > >  static int rcar_canfd_resume(struct device *dev)  {
> > > +     struct rcar_canfd_global *gpriv = dev_get_drvdata(dev);
> > > +     int err;
> > > +     u32 ch;
> > > +
> > > +     err = rcar_canfd_global_init(gpriv);
> > > +     if (err) {
> > > +             dev_err(dev, "rcar_canfd_open() failed %pe\n",
> > > + ERR_PTR(err));
> >
> > Typo: rcar_canfd_global_init
> 
> Oops...
> 
> > [1]
> >
> > biju@biju:~/linux-work/linux$ git diff diff --git
> > a/drivers/net/can/rcar/rcar_canfd.c
> > b/drivers/net/can/rcar/rcar_canfd.c
> > index 57ac90e57f11..cb358a4e49d0 100644
> > --- a/drivers/net/can/rcar/rcar_canfd.c
> > +++ b/drivers/net/can/rcar/rcar_canfd.c
> > @@ -468,6 +468,7 @@ struct rcar_canfd_global {
> >         struct platform_device *pdev;   /* Respective platform device */
> >         struct clk *clkp;               /* Peripheral clock */
> >         struct clk *can_clk;            /* fCAN clock */
> > +       struct clk *clk_ram;            /* Clock RAM */
> >         unsigned long channels_mask;    /* Enabled channels mask */
> >         bool extclk;                    /* CANFD or Ext clock */
> >         bool fdmode;                    /* CAN FD or Classical CAN only mode */
> > @@ -1983,10 +1984,18 @@ static int rcar_canfd_global_init(struct rcar_canfd_global *gpriv)
> >                 goto fail_reset2;
> >         }
> >
> > +       /* Enable RAM clock */
> > +       err = clk_prepare_enable(gpriv->clk_ram);
> > +       if (err) {
> > +               dev_err(dev,
> > +                       "failed to enable ram clock, error %d\n", err);
> > +               goto fail_clk;
> > +       }
> > +
> >         err = rcar_canfd_reset_controller(gpriv);
> >         if (err) {
> >                 dev_err(dev, "reset controller failed: %pe\n", ERR_PTR(err));
> > -               goto fail_clk;
> > +               goto fail_ram_clk;
> >         }
> >
> >         /* Controller in Global reset & Channel reset mode */ @@
> > -2026,6 +2035,8 @@ static int rcar_canfd_global_init(struct rcar_canfd_global *gpriv)
> >         rcar_canfd_disable_global_interrupts(gpriv);
> >  fail_clk:
> >         clk_disable_unprepare(gpriv->clkp);
> > +fail_ram_clk:
> > +       clk_disable_unprepare(gpriv->clk_ram);
> >  fail_reset2:
> >         reset_control_assert(gpriv->rstc2);
> >  fail_reset1:
> > @@ -2045,6 +2056,7 @@ static void rcar_canfd_global_deinit(struct rcar_canfd_global *gpriv, bool
> full)
> >         }
> >
> >         clk_disable_unprepare(gpriv->clkp);
> > +       clk_disable_unprepare(gpriv->clk_ram);
> >         reset_control_assert(gpriv->rstc2);
> >         reset_control_assert(gpriv->rstc1);
> >  }
> > @@ -2153,10 +2165,10 @@ static int rcar_canfd_probe(struct platform_device *pdev)
> >                 gpriv->extclk = gpriv->info->external_clk;
> >         }
> >
> > -       clk_ram = devm_clk_get_optional_enabled(dev, "ram_clk");
> > +       gpriv->clk_ram = devm_clk_get_optional(dev, "ram_clk");
> >         if (IS_ERR(clk_ram))
> >                 return dev_err_probe(dev, PTR_ERR(clk_ram),
> > -                                    "cannot get enabled ram clock\n");
> > +                                    "cannot get ram clock\n");
> 
> I guess this should be folded into "[PATCH 3/6] can: rcar_canfd:
> Extract rcar_canfd_global_{,de}init()", or even better, inserted as a new patch before that?

I agree this has to be a new patch before this. I will send next series based on this.

Cheers,
Biju




[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux