return 0;
 }
 
-static int vpbe_get_mode_info(struct vpbe_device *vpbe_dev, char *mode)
+static int vpbe_get_mode_info(struct vpbe_device *vpbe_dev, char *mode,
+                             int output_index)
 {
        struct vpbe_config *cfg = vpbe_dev->cfg;
        struct vpbe_enc_mode_info var;
-       int curr_output = vpbe_dev->current_out_index;
+       int curr_output = output_index;
        int i;
 
        if (NULL == mode)
        struct encoder_config_info *curr_enc_info =
                        vpbe_current_encoder_info(vpbe_dev);
        struct vpbe_config *cfg = vpbe_dev->cfg;
+       struct venc_platform_data *venc_device = vpbe_dev->venc_device;
+       enum v4l2_mbus_pixelcode if_params;
        int enc_out_index;
        int sd_index;
        int ret = 0;
                        goto out;
                }
 
+               if_params = cfg->outputs[index].if_params;
+               venc_device->setup_if_config(if_params);
                if (ret)
                        goto out;
        }
         * encoder.
         */
        ret = vpbe_get_mode_info(vpbe_dev,
-                                cfg->outputs[index].default_mode);
+                                cfg->outputs[index].default_mode, index);
        if (!ret) {
                struct osd_state *osd_device = vpbe_dev->osd_device;
 
 
        ret = v4l2_subdev_call(vpbe_dev->encoders[sd_index], video,
                                        s_dv_preset, dv_preset);
+       if (!ret && (vpbe_dev->amp != NULL)) {
+               /* Call amplifier subdevice */
+               ret = v4l2_subdev_call(vpbe_dev->amp, video,
+                               s_dv_preset, dv_preset);
+       }
        /* set the lcd controller output for the given mode */
        if (!ret) {
                struct osd_state *osd_device = vpbe_dev->osd_device;
 
        if (strcmp("vpbe-osd", pdev->name) == 0)
                vpbe_dev->osd_device = platform_get_drvdata(pdev);
+       if (strcmp("vpbe-venc", pdev->name) == 0)
+               vpbe_dev->venc_device = dev_get_platdata(&pdev->dev);
 
        return 0;
 }
 static int vpbe_initialize(struct device *dev, struct vpbe_device *vpbe_dev)
 {
        struct encoder_config_info *enc_info;
+       struct amp_config_info *amp_info;
        struct v4l2_subdev **enc_subdev;
        struct osd_state *osd_device;
        struct i2c_adapter *i2c_adap;
                        v4l2_warn(&vpbe_dev->v4l2_dev, "non-i2c encoders"
                                 " currently not supported");
        }
+       /* Add amplifier subdevice for dm365 */
+       if ((strcmp(vpbe_dev->cfg->module_name, "dm365-vpbe-display") == 0) &&
+                       vpbe_dev->cfg->amp != NULL) {
+               amp_info = vpbe_dev->cfg->amp;
+               if (amp_info->is_i2c) {
+                       vpbe_dev->amp = v4l2_i2c_new_subdev_board(
+                       &vpbe_dev->v4l2_dev, i2c_adap,
+                       &_info->board_info, NULL);
+                       if (!vpbe_dev->amp) {
+                               v4l2_err(&vpbe_dev->v4l2_dev,
+                                        "amplifier %s failed to register",
+                                        amp_info->module_name);
+                               ret = -ENODEV;
+                               goto vpbe_fail_amp_register;
+                       }
+                       v4l2_info(&vpbe_dev->v4l2_dev,
+                                         "v4l2 sub device %s registered\n",
+                                         amp_info->module_name);
+               } else {
+                           vpbe_dev->amp = NULL;
+                           v4l2_warn(&vpbe_dev->v4l2_dev, "non-i2c amplifiers"
+                           " currently not supported");
+               }
+       } else {
+           vpbe_dev->amp = NULL;
+       }
 
        /* set the current encoder and output to that of venc by default */
        vpbe_dev->current_sd_index = 0;
        /* TBD handling of bootargs for default output and mode */
        return 0;
 
+vpbe_fail_amp_register:
+       kfree(vpbe_dev->amp);
 vpbe_fail_sd_register:
        kfree(vpbe_dev->encoders);
 vpbe_fail_v4l2_device:
        if (strcmp(vpbe_dev->cfg->module_name, "dm644x-vpbe-display") != 0)
                clk_put(vpbe_dev->dac_clk);
 
+       kfree(vpbe_dev->amp);
        kfree(vpbe_dev->encoders);
        vpbe_dev->initialized = 0;
        /* disable vpss clocks */
 
         * output basis. If per mode is needed, we may have to move this to
         * mode_info structure
         */
+       enum v4l2_mbus_pixelcode if_params;
 };
 
 /* encoder configuration info */
        struct i2c_board_info board_info;
 };
 
+/*amplifier configuration info */
+struct amp_config_info {
+       char module_name[32];
+       /* Is this an i2c device ? */
+       unsigned int is_i2c:1;
+       /* i2c subdevice board info */
+       struct i2c_board_info board_info;
+};
+
 /* structure for defining vpbe display subsystem components */
 struct vpbe_config {
        char module_name[32];
        /* external encoder information goes here */
        int num_ext_encoders;
        struct encoder_config_info *ext_encoders;
+       /* amplifier information goes here */
+       struct amp_config_info *amp;
        int num_outputs;
        /* Order is venc outputs followed by LCD and then external encoders */
        struct vpbe_output *outputs;
        struct v4l2_subdev **encoders;
        /* current encoder index */
        int current_sd_index;
+       /* external amplifier v4l2 subdevice */
+       struct v4l2_subdev *amp;
        struct mutex lock;
        /* device initialized */
        int initialized;
        struct clk *dac_clk;
        /* osd_device pointer */
        struct osd_state *osd_device;
+       /* venc device pointer */
+       struct venc_platform_data *venc_device;
        /*
         * fields below are accessed by users of vpbe_device. Not the
         * ones above