Hi! I lost my original reply... so this will be slightly brief. > > > + * This program is distributed in the hope that it will be useful, but > > > + * WITHOUT ANY WARRANTY; without even the implied warranty of > > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > > > + * General Public License for more details. > > > + */ > > > + > > > +#define DEBUG > > Please remove. Ok. > > > +#include > > > +#include > > Alphabetical order, please. Ok. (But let me make unhappy noise, because these rules are inconsistent across kernel.) > > > + * TODO: > > > + * isp_subdev_notifier_complete() calls v4l2_device_register_subdev_nodes() > > > + */ > > > + > > > +#define CSI_SWITCH_SUBDEVS 2 > > > +#define CSI_SWITCH_PORTS 3 > > This could go to the enum below. > > I guess the CSI_SWITCH_SUBDEVS could be (CSI_SWITCH_PORTS - 1). > > I'd just replace CSI_SWITCH by VBS. The bus could be called > differently. Ok. > > > +static int vbs_registered(struct v4l2_subdev *sd) > > > +{ > > > + struct v4l2_device *v4l2_dev = sd->v4l2_dev; > > > + struct vbs_data *pdata; > > > + int err; > > > + > > > + dev_dbg(sd->dev, "registered, init notifier...\n"); > > Looks like a development time debug message. :-) ex-development message ;-). > > > + gpiod_set_value(pdata->swgpio, local->index == CSI_SWITCH_PORT_2); > > > + pdata->state = local->index; > > > + > > > + sd = vbs_get_remote_subdev(sd); > > > + if (IS_ERR(sd)) > > > + return PTR_ERR(sd); > > > + > > > + pdata->subdev.ctrl_handler = sd->ctrl_handler; > > This is ugly. You're exposing all the controls through another sub-device. > > How does link validation work now? > > I wonder if it'd be less so if you just pass through the LINK_FREQ and > PIXEL_RATE controls. It'll certainly be more code though. > > I think the link frequency could be something that goes to the frame > descriptor as well. Then we wouldn't need to worry about the controls > separately, just passing the frame descriptor would be enough. > > I apologise that I don't have patches quite ready for posting to the > list. (Plus of course question is "what is link validation".) Ok, let me play with this one. Solution you are suggesting is to make a custom harndler that only passes certain data through, right? > > > + dev_dbg(pdata->subdev.dev, "create link: %s[%d] -> %s[%d])\n", > > > + src->name, src_pad, sink->name, sink_pad); > > > + } > > > + > > > + return v4l2_device_register_subdev_nodes(pdata->subdev.v4l2_dev); > > The ISP driver's complete() callback calls > v4l2_device_register_subdev_nodes() already. Currently it cannot handle > being called more than once --- that needs to be fixed. I may have patches for that. Let me check. > > > +} > > > + > > > + > > I'd say that's an extra newline. Not any more. > > > + v4l2_subdev_init(&pdata->subdev, &vbs_ops); > > > + pdata->subdev.dev = &pdev->dev; > > > + pdata->subdev.owner = pdev->dev.driver->owner; > > > + strncpy(pdata->subdev.name, dev_name(&pdev->dev), V4L2_SUBDEV_NAME_SIZE); > > How about sizeof(pdata->subdev.name) ? Ok. > I'm not sure I like V4L2_SUBDEV_NAME_SIZE in general. It could be even > removed. But not by this patch. :-) > > > > + v4l2_set_subdevdata(&pdata->subdev, pdata); > > > + pdata->subdev.entity.function = MEDIA_ENT_F_SWITCH; > > > + pdata->subdev.entity.flags |= MEDIA_ENT_F_SWITCH; > > MEDIA_ENT_FL_* Do we actually have a flag here? We already have .function, so this looks like a duplicate. > > > + if (err < 0) { > > > + dev_err(&pdev->dev, "Failed to register v4l2 subdev: %d\n", err); > > > + media_entity_cleanup(&pdata->subdev.entity); > > > + return err; > > > + } > > > + > > > + dev_info(&pdev->dev, "video-bus-switch registered\n"); > > How about dev_dbg()? Ok. > > > +static int video_bus_switch_remove(struct platform_device *pdev) > > > +{ > > > + struct vbs_data *pdata = platform_get_drvdata(pdev); > > > + > > > + v4l2_async_notifier_unregister(&pdata->notifier); > > Shouldn't you unregister the notifier in the .unregister() callback? Ok, I guess we can do that for symetry. > > > /* generic v4l2_device notify callback notification values */ > > > #define V4L2_SUBDEV_IR_RX_NOTIFY _IOW('v', 0, u32) > > > @@ -415,6 +416,8 @@ struct v4l2_subdev_video_ops { > > > const struct v4l2_mbus_config *cfg); > > > int (*s_rx_buffer)(struct v4l2_subdev *sd, void *buf, > > > unsigned int *size); > > > + int (*g_endpoint_config)(struct v4l2_subdev *sd, > > > + struct v4l2_of_endpoint *cfg); > > This should be in a separate patch --- assuming we'll add this one. Hmm. I believe the rest of the driver is quite useful in understanding this. Ok, lets get the discussion started. > > > --- a/include/uapi/linux/media.h > > > +++ b/include/uapi/linux/media.h > > > @@ -147,6 +147,7 @@ struct media_device_info { > > > * MEDIA_ENT_F_IF_VID_DECODER and/or MEDIA_ENT_F_IF_AUD_DECODER. > > > */ > > > #define MEDIA_ENT_F_TUNER (MEDIA_ENT_F_OLD_SUBDEV_BASE + 5) > > > +#define MEDIA_ENT_F_SWITCH (MEDIA_ENT_F_OLD_SUBDEV_BASE + 6) > > I wonder if MEDIA_ENT_F_PROC_ would be a better prefix. > We shouldn't have new entries in MEDIA_ENT_F_OLD_SUBDEV_BASE anymore. Ok. Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html