/* size of a firmware chunk */
 #define FIRMWARE_CHUNK_SIZE 0x2000
 
+typedef void (*pvr2_subdev_update_func)(struct pvr2_hdw *,
+                                       struct v4l2_subdev *);
+
+static const pvr2_subdev_update_func pvr2_module_update_functions[] = {
+       /* ????? */
+};
+
 static const char *module_names[] = {
        [PVR2_CLIENT_ID_MSP3400] = "msp3400",
        [PVR2_CLIENT_ID_CX25840] = "cx25840",
    sub-devices so that they match our current control values. */
 static void pvr2_subdev_update(struct pvr2_hdw *hdw)
 {
+       struct v4l2_subdev *sd;
+       unsigned int id;
+       pvr2_subdev_update_func fp;
+
        if (hdw->input_dirty || hdw->std_dirty) {
                pvr2_trace(PVR2_TRACE_CHIPS,"subdev v4l2 set_standard");
                if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
        /* Unable to set crop parameters; there is apparently no equivalent
           for VIDIOC_S_CROP */
 
-       /* ????? Cover special cases for specific sub-devices. */
+       v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) {
+               id = sd->grp_id;
+               if (id >= ARRAY_SIZE(pvr2_module_update_functions)) continue;
+               fp = pvr2_module_update_functions[id];
+               if (!fp) continue;
+               (*fp)(hdw, sd);
+       }
 
        if (hdw->tuner_signal_stale && hdw->cropcap_stale) {
                pvr2_hdw_status_poll(hdw);