On Sat, May 09, 2020 at 03:03:55PM -0500, Samuel Holland wrote: > On 5/5/20 7:53 AM, Ezequiel Garcia wrote: > > On Wed, 22 Apr 2020 at 01:00, Samuel Holland <samuel@xxxxxxxxxxxx> wrote: > >> > >> This allows the VE clocks and PLL_VE to be disabled most of the time. > >> A runtime PM reference is held while streaming. > >> > >> Originally-by: Jernej Škrabec <jernej.skrabec@xxxxxxxxx> > > > > Originally-by is not documented, perhaps just go with Signed-off-by, > > as Jernej suggested. > > > >> Signed-off-by: Samuel Holland <samuel@xxxxxxxxxxxx> > >> --- > >> > >> v2: moved PM reference to cedrus_{start,stop}_streaming, based on an > >> earlier patch by Jernej Skrabec. Removes the need for autosuspend. > >> I tested this with running 2x v4l2-request-test in parallel. > >> > >> --- > >> drivers/staging/media/sunxi/cedrus/cedrus.c | 7 ++ > >> .../staging/media/sunxi/cedrus/cedrus_hw.c | 106 ++++++++++++------ > >> .../staging/media/sunxi/cedrus/cedrus_hw.h | 3 + > >> .../staging/media/sunxi/cedrus/cedrus_video.c | 33 ++++-- > >> 4 files changed, 104 insertions(+), 45 deletions(-) > >> > >> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c > >> index 05a85517ff60..bc27f9430eeb 100644 > >> --- a/drivers/staging/media/sunxi/cedrus/cedrus.c > >> +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c > >> @@ -16,6 +16,7 @@ > >> #include <linux/platform_device.h> > >> #include <linux/module.h> > >> #include <linux/of.h> > >> +#include <linux/pm.h> > >> > >> #include <media/v4l2-device.h> > >> #include <media/v4l2-ioctl.h> > >> @@ -551,12 +552,18 @@ static const struct of_device_id cedrus_dt_match[] = { > >> }; > >> MODULE_DEVICE_TABLE(of, cedrus_dt_match); > >> > >> +static const struct dev_pm_ops cedrus_dev_pm_ops = { > >> + SET_RUNTIME_PM_OPS(cedrus_hw_suspend, > >> + cedrus_hw_resume, NULL) > >> +}; > >> + > >> static struct platform_driver cedrus_driver = { > >> .probe = cedrus_probe, > >> .remove = cedrus_remove, > >> .driver = { > >> .name = CEDRUS_NAME, > >> .of_match_table = of_match_ptr(cedrus_dt_match), > >> + .pm = &cedrus_dev_pm_ops, > >> }, > >> }; > >> module_platform_driver(cedrus_driver); > >> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c > >> index daf5f244f93b..1744e6fcc999 100644 > >> --- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c > >> +++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c > >> @@ -19,6 +19,7 @@ > >> #include <linux/dma-mapping.h> > >> #include <linux/interrupt.h> > >> #include <linux/clk.h> > >> +#include <linux/pm_runtime.h> > >> #include <linux/regmap.h> > >> #include <linux/reset.h> > >> #include <linux/soc/sunxi/sunxi_sram.h> > >> @@ -140,6 +141,64 @@ static irqreturn_t cedrus_irq(int irq, void *data) > >> return IRQ_HANDLED; > >> } > >> > >> +int cedrus_hw_suspend(struct device *device) > >> +{ > >> + struct cedrus_dev *dev = dev_get_drvdata(device); > >> + > >> + reset_control_assert(dev->rstc); > >> + > >> + clk_disable_unprepare(dev->ram_clk); > >> + clk_disable_unprepare(dev->mod_clk); > >> + clk_disable_unprepare(dev->ahb_clk); > >> + > > > > You can use clk_bulk API here. > > Since this change is already tested, I'd prefer to do that as a separate > patch. Given that those three clocks are also pretty different from a semantic point of view, I'm not sure it's wise to switch to the bulk API anyway. Maxime
Attachment:
signature.asc
Description: PGP signature