media: cedrus: Allow different mod clock rates
authorJernej Skrabec <jernej.skrabec@siol.net>
Sat, 18 May 2019 17:44:15 +0000 (13:44 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Wed, 29 May 2019 10:22:12 +0000 (06:22 -0400)
Some VPU variants may run at higher clock speeds. They actually need
extra speed to be capable of decoding more complex codecs like HEVC or
bigger image sizes (4K).

Expand variant structure with mod_rate information.

Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/staging/media/sunxi/cedrus/cedrus.c
drivers/staging/media/sunxi/cedrus/cedrus.h
drivers/staging/media/sunxi/cedrus/cedrus_hw.c
drivers/staging/media/sunxi/cedrus/cedrus_hw.h

index d0429c0e6b6b74bee82d79aa020d2d27bb32ccf6..9349a082a29c6b2d8f784501aee6a8e4378fe7c0 100644 (file)
@@ -369,36 +369,41 @@ static int cedrus_remove(struct platform_device *pdev)
 }
 
 static const struct cedrus_variant sun4i_a10_cedrus_variant = {
-       /* No particular capability. */
+       .mod_rate       = 320000000,
 };
 
 static const struct cedrus_variant sun5i_a13_cedrus_variant = {
-       /* No particular capability. */
+       .mod_rate       = 320000000,
 };
 
 static const struct cedrus_variant sun7i_a20_cedrus_variant = {
-       /* No particular capability. */
+       .mod_rate       = 320000000,
 };
 
 static const struct cedrus_variant sun8i_a33_cedrus_variant = {
        .capabilities   = CEDRUS_CAPABILITY_UNTILED,
+       .mod_rate       = 320000000,
 };
 
 static const struct cedrus_variant sun8i_h3_cedrus_variant = {
        .capabilities   = CEDRUS_CAPABILITY_UNTILED,
+       .mod_rate       = 402000000,
 };
 
 static const struct cedrus_variant sun50i_a64_cedrus_variant = {
        .capabilities   = CEDRUS_CAPABILITY_UNTILED,
+       .mod_rate       = 402000000,
 };
 
 static const struct cedrus_variant sun50i_h5_cedrus_variant = {
        .capabilities   = CEDRUS_CAPABILITY_UNTILED,
+       .mod_rate       = 402000000,
 };
 
 static const struct cedrus_variant sun50i_h6_cedrus_variant = {
        .capabilities   = CEDRUS_CAPABILITY_UNTILED,
        .quirks         = CEDRUS_QUIRK_NO_DMA_OFFSET,
+       .mod_rate       = 600000000,
 };
 
 static const struct of_device_id cedrus_dt_match[] = {
index c57c04b41d2e8f451a1d5628644c1209b01de3cb..25ee1f80f2c7b067242efc6b291985aeceb83e4e 100644 (file)
@@ -94,6 +94,7 @@ struct cedrus_dec_ops {
 struct cedrus_variant {
        unsigned int    capabilities;
        unsigned int    quirks;
+       unsigned int    mod_rate;
 };
 
 struct cedrus_dev {
index fbfff7c1c771f78e85eb366443a0e469f56b8686..60406b2d45956d02ae129915a7979d90758050ba 100644 (file)
@@ -236,7 +236,7 @@ int cedrus_hw_probe(struct cedrus_dev *dev)
                goto err_sram;
        }
 
-       ret = clk_set_rate(dev->mod_clk, CEDRUS_CLOCK_RATE_DEFAULT);
+       ret = clk_set_rate(dev->mod_clk, variant->mod_rate);
        if (ret) {
                dev_err(dev->dev, "Failed to set clock rate\n");
 
index b43c77d54b95f0481e27d7c7a8762c8b3e239568..27d0882397aaf07ce22b33305cc087c901452426 100644 (file)
@@ -16,8 +16,6 @@
 #ifndef _CEDRUS_HW_H_
 #define _CEDRUS_HW_H_
 
-#define CEDRUS_CLOCK_RATE_DEFAULT      320000000
-
 int cedrus_engine_enable(struct cedrus_dev *dev, enum cedrus_codec codec);
 void cedrus_engine_disable(struct cedrus_dev *dev);