Thread (24 messages) 24 messages, 3 authors, 2021-07-14

Re: [PATCH v1, 03/14] media: mtk-vcodec: Use component framework to manage each hardware information

From: Tzung-Bi Shih <hidden>
Date: 2021-07-08 10:05:01
Also in: linux-devicetree, linux-media, linux-mediatek, lkml

On Wed, Jul 7, 2021 at 2:22 PM Yunfei Dong [off-list ref] wrote:
+#include "mtk_vcodec_util.h"
+
 #include <media/videobuf2-core.h>
+#include <media/v4l2-ctrls.h>
 #include <media/v4l2-mem2mem.h>
The changes look like independent ones.  If any .c files need the
headers, include them in the .c files instead of here.
+               comp_node = of_find_compatible_node(NULL, NULL,
+                       mtk_vdec_drv_ids[i].compatible);
+               if (!comp_node)
+                       continue;
+
+               if (!of_device_is_available(comp_node)) {
+                       of_node_put(comp_node);
+                       dev_err(&pdev->dev, "Fail to get MMSYS node\n");
+                       continue;
+               }
+
+               of_id = of_match_node(mtk_vdec_drv_ids, comp_node);
+               if (!of_id) {
Doesn't it need to call of_node_put(comp_node)?
+static int mtk_vcodec_init_master(struct mtk_vcodec_dev *dev)
+{
+       struct platform_device *pdev = dev->plat_dev;
+       struct component_match *match;
+       int ret = 0;
ret doesn't need to be initialized.
+       match = mtk_vcodec_match_add(dev);
+       if (IS_ERR_OR_NULL(match))
+               return -EINVAL;
+
+       platform_set_drvdata(pdev, dev);
Why does platform_set_drvdata() need to be here?  The function neither
creates pdev nor dev.
+static int mtk_vcodec_init_dec_params(struct mtk_vcodec_dev *dev)
+{
+       struct platform_device *pdev = dev->plat_dev;
+       struct resource *res;
+       int ret = 0;
ret doesn't need to be initialized.
+       if (!dev->is_support_comp) {
+               res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+               if (res == NULL) {
!res, res is not used BTW.
+               dev->dec_irq = platform_get_irq(dev->plat_dev, 0);
Check return value.
+               irq_set_status_flags(dev->dec_irq, IRQ_NOAUTOEN);
+               ret = devm_request_irq(&pdev->dev, dev->dec_irq,
+                               mtk_vcodec_dec_irq_handler, 0, pdev->name, dev);
+               if (ret) {
+                       dev_err(&pdev->dev, "failed to install dev->dec_irq %d (%d)",
+                               dev->dec_irq,
+                               ret);
Can join to previous line.
+       if (!of_find_compatible_node(NULL, NULL, "mediatek,mtk-vcodec-core"))
+               dev->is_support_comp = false;
+       else
+               dev->is_support_comp = true;
Need a DT binding document patch for the attribute.

Does it really need to call of_find_compatible_node() for parsing an
attribute?  If so, it needs to call of_node_put() afterward.
quoted hunk ↗ jump to hunk
@@ -319,7 +434,6 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
                MTK_VCODEC_DEC_NAME);
        video_set_drvdata(vfd_dec, dev);
        dev->vfd_dec = vfd_dec;
-       platform_set_drvdata(pdev, dev);
Why does it need to remove platform_set_drvdata()?
quoted hunk ↗ jump to hunk
@@ -370,8 +484,17 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
        mtk_v4l2_debug(0, "decoder registered as /dev/video%d",
                vfd_dec->num);

-       return 0;
+       if (dev->is_support_comp) {
+               ret = mtk_vcodec_init_master(dev);
+               if (ret < 0)
+                       goto err_component_match;
+       } else {
+               platform_set_drvdata(pdev, dev);
+       }
mtk_vcodec_init_master() also calls platform_set_drvdata().  What is
the difference?
+       /* clear interrupt */
+       writel((readl(vdec_misc_addr) | VDEC_IRQ_CFG), vdec_misc_addr);
+       writel((readl(vdec_misc_addr) & ~VDEC_IRQ_CLR), vdec_misc_addr);
Can remove 1 parenthese pair.
+static int mtk_vdec_comp_probe(struct platform_device *pdev)
+{
+       struct mtk_vdec_comp_dev *dev;
+       int ret;
+
+       dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
+       if (!dev)
+               return -ENOMEM;
+
+       dev->plat_dev = pdev;
+       spin_lock_init(&dev->irqlock);
+
+       ret = mtk_vcodec_init_dec_pm(dev->plat_dev, &dev->pm);
To be concise, use pdev.
+       dev->reg_base[VDEC_COMP_MISC] =
+               devm_platform_ioremap_resource(pdev, 0);
Confusing about the index 0, where:
VDEC_COMP_SYS = 0
VDEC_COMP_MISC = 1
+#ifndef _MTK_VCODEC_DEC_HW_H_
+#define _MTK_VCODEC_DEC_HW_H_
+
+#include <linux/component.h>
Does it really need to include component.h?
+/**
+ * enum mtk_comp_hw_reg_idx - component register base index
+ */
+enum mtk_comp_hw_reg_idx {
+       VDEC_COMP_SYS,
+       VDEC_COMP_MISC,
+       NUM_MAX_COMP_VCODEC_REG_BASE
The name is suboptimal.  How about VDEC_COMP_MAX or VDEC_COMP_LAST?
+#include <linux/component.h>
+#include <linux/io.h>
 #include <linux/platform_device.h>
 #include <linux/videodev2.h>
 #include <media/v4l2-ctrls.h>
The newly added code in the file doesn't look like it needs anything
from component.h and io.h.
quoted hunk ↗ jump to hunk
@@ -404,6 +422,7 @@ struct mtk_vcodec_enc_pdata {
  *
  * @fw_handler: used to communicate with the firmware.
  * @id_counter: used to identify current opened instance
+ * @is_support_comp: 1: using compoent framework, 0: not support
is_support_comp is a boolean.  Use true and false instead of 1 and 0.
quoted hunk ↗ jump to hunk
@@ -422,6 +441,10 @@ struct mtk_vcodec_enc_pdata {
  * @pm: power management control
  * @dec_capability: used to identify decode capability, ex: 4k
  * @enc_capability: used to identify encode capability
+ *
+ * comp_dev: component hardware device
+ * component_node: component node
+ * comp_idx: component index
To be neat, missing "@" before each symbol name.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help