Thanks Paul. Some comments embedded and for the rest I will update the code accordingly.
A few nits follow.
On Wed, 2015-04-01 at 17:12 -0400, Jilai Wang wrote:
--- a/drivers/gpu/drm/msm/Kconfig +++ b/drivers/gpu/drm/msm/Kconfig
+config DRM_MSM_WB
- bool "Enable writeback support for MSM modesetting driver"
- depends on DRM_MSM
- depends on VIDEO_V4L2
- select VIDEOBUF2_CORE
- default y
- help
Choose this option if you have a need to support writeback
connector.
DRM_MSM_WB is a bool symbol...
--- a/drivers/gpu/drm/msm/Makefile +++ b/drivers/gpu/drm/msm/Makefile
+msm-$(CONFIG_DRM_MSM_WB) += \
- mdp/mdp5/mdp5_wb_encoder.o \
- mdp/mdp_wb/mdp_wb.o \
- mdp/mdp_wb/mdp_wb_connector.o \
- mdp/mdp_wb/mdp_wb_v4l2.o
so mdp_wb_v4l2.o will never be part of a module.
If CONFIG-DRM_MSM_WB is y, then all wb related files (including mdp_wb_v4l2.o) will be added to msm-y, then be linked to msm.o obj-$(CONFIG_DRM_MSM) += msm.o Refer to document http://lwn.net/Articles/21835/ (section 3.3), it should be able to be built-in to kernel or as a module.
--- /dev/null +++ b/drivers/gpu/drm/msm/mdp/mdp_wb/mdp_wb_v4l2.c
+#include <linux/module.h>
This include is needed mostly for module_param(), right?
+#define MSM_WB_MODULE_NAME "msm_wb"
MSM_WB_DRIVER_NAME? But see below.
+static unsigned debug; +module_param(debug, uint, 0644);
debug is basically a boolean type of flag. Would static bool debug; module_param(debug, bool, 0644);
work?
+MODULE_PARM_DESC(debug, "activates debug info");
No one is ever going to see this description.
+#define dprintk(dev, level, fmt, arg...) \
- v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
All instances of dprintk() that I found had level set to 1, so the above could be simplified a bit: #define dprintk(dev, fmt, arg...) \ v4l2_dbg(1, debug, &dev->v4l2_dev, fmt, ## arg)
But perhaps pr_debug() and the dynamic debug facility could be used instead of module_param(), dprintk() and v4l2_dbg(). Not sure which approach is easier.
+static const struct v4l2_file_operations msm_wb_v4l2_fops = {
- .owner = THIS_MODULE,
THIS_MODULE will basically be equivalent to NULL.
- .open = v4l2_fh_open,
- .release = vb2_fop_release,
- .poll = vb2_fop_poll,
- .unlocked_ioctl = video_ioctl2,
+};
+int msm_wb_v4l2_init(struct msm_wb *wb) +{
- struct msm_wb_v4l2_dev *dev;
- struct video_device *vfd;
- struct vb2_queue *q;
- int ret;
- dev = kzalloc(sizeof(*dev), GFP_KERNEL);
- if (!dev)
return -ENOMEM;
- snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),
"%s", MSM_WB_MODULE_NAME);
It looks like you can actually drop the #define and merge the last two arguments to snprintf() into just "msm_wb".
- ret = v4l2_device_register(NULL, &dev->v4l2_dev);
- if (ret)
goto free_dev;
- /* default ARGB8888 640x480 */
- dev->fmt = get_format(V4L2_PIX_FMT_RGB32);
- dev->width = 640;
- dev->height = 480;
- /* initialize queue */
- q = &dev->vb_vidq;
- q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- q->io_modes = VB2_DMABUF;
- q->drv_priv = dev;
- q->buf_struct_size = sizeof(struct msm_wb_v4l2_buffer);
- q->ops = &msm_wb_vb2_ops;
- q->mem_ops = &msm_wb_vb2_mem_ops;
- q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
- ret = vb2_queue_init(q);
- if (ret)
goto unreg_dev;
- mutex_init(&dev->mutex);
- vfd = &dev->vdev;
- *vfd = msm_wb_v4l2_template;
- vfd->debug = debug;
I couldn't find a member of struct video_device named debug. Where does that come from? Because, as far as I can see, this won't compile.
yes, it's there: http://lxr.free-electrons.com/source/include/media/v4l2-dev.h#L127
- vfd->v4l2_dev = &dev->v4l2_dev;
- vfd->queue = q;
- /*
* Provide a mutex to v4l2 core. It will be used to protect
* all fops and v4l2 ioctls.
*/
- vfd->lock = &dev->mutex;
- video_set_drvdata(vfd, dev);
- ret = video_register_device(vfd, VFL_TYPE_GRABBER, -1);
- if (ret < 0)
goto unreg_dev;
- dev->wb = wb;
- wb->wb_v4l2 = dev;
- v4l2_info(&dev->v4l2_dev, "V4L2 device registered as %s\n",
video_device_node_name(vfd));
- return 0;
+unreg_dev:
- v4l2_device_unregister(&dev->v4l2_dev);
+free_dev:
- kfree(dev);
- return ret;
+}
Paul Bolle