#include <linux/platform_device.h>
 #include <linux/module.h>
 #include <linux/acpi.h>
+#include <linux/dmi.h>
 
 #include "ucsi.h"
 
        struct completion complete;
        unsigned long flags;
        guid_t guid;
+       u64 cmd;
 };
 
 static int ucsi_acpi_dsm(struct ucsi_acpi *ua, int func)
        struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi);
 
        memcpy(ua->base + offset, val, val_len);
+       ua->cmd = *(u64 *)val;
 
        return ucsi_acpi_dsm(ua, UCSI_DSM_FUNC_WRITE);
 }
        .async_write = ucsi_acpi_async_write
 };
 
+static int
+ucsi_zenbook_read(struct ucsi *ucsi, unsigned int offset, void *val, size_t val_len)
+{
+       struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi);
+       int ret;
+
+       if (offset == UCSI_VERSION || UCSI_COMMAND(ua->cmd) == UCSI_PPM_RESET) {
+               ret = ucsi_acpi_dsm(ua, UCSI_DSM_FUNC_READ);
+               if (ret)
+                       return ret;
+       }
+
+       memcpy(val, ua->base + offset, val_len);
+
+       return 0;
+}
+
+static const struct ucsi_operations ucsi_zenbook_ops = {
+       .read = ucsi_zenbook_read,
+       .sync_write = ucsi_acpi_sync_write,
+       .async_write = ucsi_acpi_async_write
+};
+
+static const struct dmi_system_id zenbook_dmi_id[] = {
+       {
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UA_UM325UA"),
+               },
+       },
+       { }
+};
+
 static void ucsi_acpi_notify(acpi_handle handle, u32 event, void *data)
 {
        struct ucsi_acpi *ua = data;
        u32 cci;
        int ret;
 
-       ret = ucsi_acpi_read(ua->ucsi, UCSI_CCI, &cci, sizeof(cci));
+       ret = ua->ucsi->ops->read(ua->ucsi, UCSI_CCI, &cci, sizeof(cci));
        if (ret)
                return;
 
 static int ucsi_acpi_probe(struct platform_device *pdev)
 {
        struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);
+       const struct ucsi_operations *ops = &ucsi_acpi_ops;
        struct ucsi_acpi *ua;
        struct resource *res;
        acpi_status status;
        init_completion(&ua->complete);
        ua->dev = &pdev->dev;
 
-       ua->ucsi = ucsi_create(&pdev->dev, &ucsi_acpi_ops);
+       if (dmi_check_system(zenbook_dmi_id))
+               ops = &ucsi_zenbook_ops;
+
+       ua->ucsi = ucsi_create(&pdev->dev, ops);
        if (IS_ERR(ua->ucsi))
                return PTR_ERR(ua->ucsi);