Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

media: rkvdec: Support per-variant interrupt handler

Prepare for supporting different variants with different interrupt
managers.

To support other variants specific function type later, introduce the
rkvdec_variant_ops struct.

Tested-by: Diederik de Haas <didi.debian@cknow.org> # Rock 5B
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>

authored by

Detlev Casanova and committed by
Hans Verkuil
f9c7b7de e5640dbb

+23 -3
+18 -3
drivers/media/platform/rockchip/rkvdec/rkvdec.c
··· 1222 1222 } 1223 1223 } 1224 1224 1225 - static irqreturn_t rkvdec_irq_handler(int irq, void *priv) 1225 + static irqreturn_t rk3399_irq_handler(struct rkvdec_ctx *ctx) 1226 1226 { 1227 - struct rkvdec_dev *rkvdec = priv; 1228 - struct rkvdec_ctx *ctx = v4l2_m2m_get_curr_priv(rkvdec->m2m_dev); 1227 + struct rkvdec_dev *rkvdec = ctx->dev; 1229 1228 enum vb2_buffer_state state; 1230 1229 u32 status; 1231 1230 ··· 1245 1246 return IRQ_HANDLED; 1246 1247 } 1247 1248 1249 + static irqreturn_t rkvdec_irq_handler(int irq, void *priv) 1250 + { 1251 + struct rkvdec_dev *rkvdec = priv; 1252 + struct rkvdec_ctx *ctx = v4l2_m2m_get_curr_priv(rkvdec->m2m_dev); 1253 + const struct rkvdec_variant *variant = rkvdec->variant; 1254 + 1255 + return variant->ops->irq_handler(ctx); 1256 + } 1257 + 1248 1258 static void rkvdec_watchdog_func(struct work_struct *work) 1249 1259 { 1250 1260 struct rkvdec_dev *rkvdec; ··· 1269 1261 } 1270 1262 } 1271 1263 1264 + static const struct rkvdec_variant_ops rk3399_variant_ops = { 1265 + .irq_handler = rk3399_irq_handler, 1266 + }; 1267 + 1272 1268 static const struct rkvdec_variant rk3288_rkvdec_variant = { 1273 1269 .num_regs = 68, 1274 1270 .coded_fmts = rk3288_coded_fmts, 1275 1271 .num_coded_fmts = ARRAY_SIZE(rk3288_coded_fmts), 1272 + .ops = &rk3399_variant_ops, 1276 1273 }; 1277 1274 1278 1275 static const struct rkvdec_variant rk3328_rkvdec_variant = { 1279 1276 .num_regs = 109, 1280 1277 .coded_fmts = rkvdec_coded_fmts, 1281 1278 .num_coded_fmts = ARRAY_SIZE(rkvdec_coded_fmts), 1279 + .ops = &rk3399_variant_ops, 1282 1280 .quirks = RKVDEC_QUIRK_DISABLE_QOS, 1283 1281 }; 1284 1282 ··· 1292 1278 .num_regs = 78, 1293 1279 .coded_fmts = rkvdec_coded_fmts, 1294 1280 .num_coded_fmts = ARRAY_SIZE(rkvdec_coded_fmts), 1281 + .ops = &rk3399_variant_ops, 1295 1282 }; 1296 1283 1297 1284 static const struct of_device_id of_rkvdec_match[] = {
+5
drivers/media/platform/rockchip/rkvdec/rkvdec.h
··· 67 67 base.vb.vb2_buf); 68 68 } 69 69 70 + struct rkvdec_variant_ops { 71 + irqreturn_t (*irq_handler)(struct rkvdec_ctx *ctx); 72 + }; 73 + 70 74 struct rkvdec_variant { 71 75 unsigned int num_regs; 72 76 const struct rkvdec_coded_fmt_desc *coded_fmts; 73 77 size_t num_coded_fmts; 74 78 const struct rcb_size_info *rcb_sizes; 75 79 size_t num_rcb_sizes; 80 + const struct rkvdec_variant_ops *ops; 76 81 unsigned int quirks; 77 82 }; 78 83