forked from Minki/linux
media: staging: imgu: make imgu work on low frequency for low input
Currently, imgu is working on 450MHz for all cases, however in some cases (input frame less than 2048x1152), the imgu did not need work in high frequency. This patch make imgu work on 200MHz if the imgu input frame is less than 2048x1152 to save power. Signed-off-by: Bingbu Cao <bingbu.cao@intel.com> Reviewed-by: Tomasz Figa <tfiga@chromium.org> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
6de18fa3bd
commit
9a9b138e64
@ -210,12 +210,12 @@ static int imgu_hw_wait(void __iomem *base, int reg, u32 mask, u32 cmp)
|
||||
|
||||
/* Initialize the IPU3 CSS hardware and associated h/w blocks */
|
||||
|
||||
int imgu_css_set_powerup(struct device *dev, void __iomem *base)
|
||||
int imgu_css_set_powerup(struct device *dev, void __iomem *base,
|
||||
unsigned int freq)
|
||||
{
|
||||
static const unsigned int freq = 450;
|
||||
u32 pm_ctrl, state, val;
|
||||
|
||||
dev_dbg(dev, "%s\n", __func__);
|
||||
dev_dbg(dev, "%s with freq %u\n", __func__, freq);
|
||||
/* Clear the CSS busy signal */
|
||||
readl(base + IMGU_REG_GP_BUSY);
|
||||
writel(0, base + IMGU_REG_GP_BUSY);
|
||||
|
@ -187,7 +187,8 @@ bool imgu_css_is_streaming(struct imgu_css *css);
|
||||
bool imgu_css_pipe_queue_empty(struct imgu_css *css, unsigned int pipe);
|
||||
|
||||
/******************* css hw *******************/
|
||||
int imgu_css_set_powerup(struct device *dev, void __iomem *base);
|
||||
int imgu_css_set_powerup(struct device *dev, void __iomem *base,
|
||||
unsigned int freq);
|
||||
void imgu_css_set_powerdown(struct device *dev, void __iomem *base);
|
||||
int imgu_css_irq_ack(struct imgu_css *css);
|
||||
|
||||
|
@ -345,8 +345,20 @@ failed:
|
||||
static int imgu_powerup(struct imgu_device *imgu)
|
||||
{
|
||||
int r;
|
||||
unsigned int pipe;
|
||||
unsigned int freq = 200;
|
||||
struct v4l2_mbus_framefmt *fmt;
|
||||
|
||||
r = imgu_css_set_powerup(&imgu->pci_dev->dev, imgu->base);
|
||||
/* input larger than 2048*1152, ask imgu to work on high freq */
|
||||
for_each_set_bit(pipe, imgu->css.enabled_pipes, IMGU_MAX_PIPE_NUM) {
|
||||
fmt = &imgu->imgu_pipe[pipe].nodes[IMGU_NODE_IN].pad_fmt;
|
||||
dev_dbg(&imgu->pci_dev->dev, "pipe %u input format = %ux%u",
|
||||
pipe, fmt->width, fmt->height);
|
||||
if ((fmt->width * fmt->height) >= (2048 * 1152))
|
||||
freq = 450;
|
||||
}
|
||||
|
||||
r = imgu_css_set_powerup(&imgu->pci_dev->dev, imgu->base, freq);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
@ -666,7 +678,7 @@ static int imgu_pci_probe(struct pci_dev *pci_dev,
|
||||
atomic_set(&imgu->qbuf_barrier, 0);
|
||||
init_waitqueue_head(&imgu->buf_drain_wq);
|
||||
|
||||
r = imgu_css_set_powerup(&pci_dev->dev, imgu->base);
|
||||
r = imgu_css_set_powerup(&pci_dev->dev, imgu->base, 200);
|
||||
if (r) {
|
||||
dev_err(&pci_dev->dev,
|
||||
"failed to power up CSS (%d)\n", r);
|
||||
|
Loading…
Reference in New Issue
Block a user