media: hantro: add support for Rockchip RK3036
authorAlex Bee <knaerzche@gmail.com>
Mon, 14 Jun 2021 21:32:15 +0000 (23:32 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 17 Jun 2021 09:00:43 +0000 (11:00 +0200)
RK3036's VPU IP block is the same as RK3288 has, except that it doesn't
have an encoder, decoding is supported up to 1920x1088 only and the axi
clock can be set to 300 MHz max.

Add a new RK3036 variant which reflects these differences.

Signed-off-by: Alex Bee <knaerzche@gmail.com>
Reviewed-by: Ezequiel Garcia <ezequiel@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/hantro/hantro_drv.c
drivers/staging/media/hantro/hantro_hw.h
drivers/staging/media/hantro/rockchip_vpu_hw.c

index aaef66c4c795de5efa182686856ebddde463e3ae..31d8449ca1d2dab4891647dd97032bba2ae15dcd 100644 (file)
@@ -582,6 +582,7 @@ static const struct v4l2_file_operations hantro_fops = {
 
 static const struct of_device_id of_hantro_match[] = {
 #ifdef CONFIG_VIDEO_HANTRO_ROCKCHIP
+       { .compatible = "rockchip,rk3036-vpu", .data = &rk3036_vpu_variant, },
        { .compatible = "rockchip,rk3066-vpu", .data = &rk3066_vpu_variant, },
        { .compatible = "rockchip,rk3288-vpu", .data = &rk3288_vpu_variant, },
        { .compatible = "rockchip,rk3328-vpu", .data = &rk3328_vpu_variant, },
index 77df0eba4e6f276629fb89fe8c69e0ec65ea6040..5dcf65805396b55822e280ef718c257df2745be7 100644 (file)
@@ -205,6 +205,7 @@ enum hantro_enc_fmt {
 
 extern const struct hantro_variant imx8mq_vpu_g2_variant;
 extern const struct hantro_variant imx8mq_vpu_variant;
+extern const struct hantro_variant rk3036_vpu_variant;
 extern const struct hantro_variant rk3066_vpu_variant;
 extern const struct hantro_variant rk3288_vpu_variant;
 extern const struct hantro_variant rk3328_vpu_variant;
index b370b5e802fa64353b36fab6d14b8ecbe8bfae77..3ccc16413f42ffecd4dced5ea96151667c279103 100644 (file)
@@ -244,6 +244,13 @@ static irqreturn_t rockchip_vpu2_vepu_irq(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
+static int rk3036_vpu_hw_init(struct hantro_dev *vpu)
+{
+       /* Bump ACLK to max. possible freq. to improve performance. */
+       clk_set_rate(vpu->clocks[0].clk, RK3066_ACLK_MAX_FREQ);
+       return 0;
+}
+
 static int rk3066_vpu_hw_init(struct hantro_dev *vpu)
 {
        /* Bump ACLKs to max. possible freq. to improve performance. */
@@ -297,6 +304,27 @@ static void rockchip_vpu2_enc_reset(struct hantro_ctx *ctx)
 /*
  * Supported codec ops.
  */
+static const struct hantro_codec_ops rk3036_vpu_codec_ops[] = {
+       [HANTRO_MODE_H264_DEC] = {
+               .run = hantro_g1_h264_dec_run,
+               .reset = hantro_g1_reset,
+               .init = hantro_h264_dec_init,
+               .exit = hantro_h264_dec_exit,
+       },
+       [HANTRO_MODE_MPEG2_DEC] = {
+               .run = hantro_g1_mpeg2_dec_run,
+               .reset = hantro_g1_reset,
+               .init = hantro_mpeg2_dec_init,
+               .exit = hantro_mpeg2_dec_exit,
+       },
+       [HANTRO_MODE_VP8_DEC] = {
+               .run = hantro_g1_vp8_dec_run,
+               .reset = hantro_g1_reset,
+               .init = hantro_vp8_dec_init,
+               .exit = hantro_vp8_dec_exit,
+       },
+};
+
 static const struct hantro_codec_ops rk3066_vpu_codec_ops[] = {
        [HANTRO_MODE_JPEG_ENC] = {
                .run = hantro_h1_jpeg_enc_run,
@@ -378,6 +406,10 @@ static const struct hantro_codec_ops rk3399_vpu_codec_ops[] = {
  * VPU variant.
  */
 
+static const struct hantro_irq rockchip_vdpu1_irqs[] = {
+       { "vdpu", hantro_g1_irq },
+};
+
 static const struct hantro_irq rockchip_vpu1_irqs[] = {
        { "vepu", rockchip_vpu1_vepu_irq },
        { "vdpu", hantro_g1_irq },
@@ -401,6 +433,23 @@ static const char * const rockchip_vpu_clk_names[] = {
        "aclk", "hclk"
 };
 
+const struct hantro_variant rk3036_vpu_variant = {
+       .dec_offset = 0x400,
+       .dec_fmts = rk3066_vpu_dec_fmts,
+       .num_dec_fmts = ARRAY_SIZE(rk3066_vpu_dec_fmts),
+       .postproc_fmts = rockchip_vpu1_postproc_fmts,
+       .num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts),
+       .postproc_regs = &hantro_g1_postproc_regs,
+       .codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER |
+                HANTRO_H264_DECODER,
+       .codec_ops = rk3036_vpu_codec_ops,
+       .irqs = rockchip_vdpu1_irqs,
+       .num_irqs = ARRAY_SIZE(rockchip_vdpu1_irqs),
+       .init = rk3036_vpu_hw_init,
+       .clk_names = rockchip_vpu_clk_names,
+       .num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
+};
+
 /*
  * Despite this variant has separate clocks for decoder and encoder,
  * it's still required to enable all four of them for either decoding