}
 EXPORT_SYMBOL_GPL(isst_if_mbox_cmd_set_req);
 
+static int isst_if_api_version;
+
 static int isst_if_get_platform_info(void __user *argp)
 {
        struct isst_if_platform_info info;
 
-       info.api_version = ISST_IF_API_VERSION;
+       info.api_version = isst_if_api_version;
        info.driver_version = ISST_IF_DRIVER_VERSION;
        info.max_cmds_per_ioctl = ISST_IF_CMD_LIMIT;
        info.mbox_supported = punit_callbacks[ISST_IF_DEV_MBOX].registered;
                mutex_unlock(&punit_misc_dev_open_lock);
                return -EAGAIN;
        }
+       if (!cb->api_version)
+               cb->api_version = ISST_IF_API_VERSION;
+       if (cb->api_version > isst_if_api_version)
+               isst_if_api_version = cb->api_version;
        memcpy(&punit_callbacks[device_type], cb, sizeof(*cb));
        punit_callbacks[device_type].registered = 1;
        mutex_unlock(&punit_misc_dev_open_lock);
 
  * @offset:    Offset to the first valid member in command structure.
  *             This will be the offset of the start of the command
  *             after command count field
+ * @api_version: API version supported for this target. 0, if none.
  * @owner:     Registered module owner
  * @cmd_callback: Callback function to handle IOCTL. The callback has the
  *             command pointer with data for command. There is a pointer
        int registered;
        int cmd_size;
        int offset;
-
+       int api_version;
        struct module *owner;
        long (*cmd_callback)(u8 *ptr, int *write_only, int resume);
        long (*def_ioctl)(struct file *file, unsigned int cmd, unsigned long arg);