unsigned long flags;
        guid_t guid;
        u64 cmd;
+       bool dell_quirk_probed;
+       bool dell_quirk_active;
 };
 
 static int ucsi_acpi_dsm(struct ucsi_acpi *ua, int func)
        .async_write = ucsi_acpi_async_write
 };
 
-static const struct dmi_system_id zenbook_dmi_id[] = {
+/*
+ * Some Dell laptops expect that an ACK command with the
+ * UCSI_ACK_CONNECTOR_CHANGE bit set is followed by a (separate)
+ * ACK command that only has the UCSI_ACK_COMMAND_COMPLETE bit set.
+ * If this is not done events are not delivered to OSPM and
+ * subsequent commands will timeout.
+ */
+static int
+ucsi_dell_sync_write(struct ucsi *ucsi, unsigned int offset,
+                    const void *val, size_t val_len)
+{
+       struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi);
+       u64 cmd = *(u64 *)val, ack = 0;
+       int ret;
+
+       if (UCSI_COMMAND(cmd) == UCSI_ACK_CC_CI &&
+           cmd & UCSI_ACK_CONNECTOR_CHANGE)
+               ack = UCSI_ACK_CC_CI | UCSI_ACK_COMMAND_COMPLETE;
+
+       ret = ucsi_acpi_sync_write(ucsi, offset, val, val_len);
+       if (ret != 0)
+               return ret;
+       if (ack == 0)
+               return ret;
+
+       if (!ua->dell_quirk_probed) {
+               ua->dell_quirk_probed = true;
+
+               cmd = UCSI_GET_CAPABILITY;
+               ret = ucsi_acpi_sync_write(ucsi, UCSI_CONTROL, &cmd,
+                                          sizeof(cmd));
+               if (ret == 0)
+                       return ucsi_acpi_sync_write(ucsi, UCSI_CONTROL,
+                                                   &ack, sizeof(ack));
+               if (ret != -ETIMEDOUT)
+                       return ret;
+
+               ua->dell_quirk_active = true;
+               dev_err(ua->dev, "Firmware bug: Additional ACK required after ACKing a connector change.\n");
+               dev_err(ua->dev, "Firmware bug: Enabling workaround\n");
+       }
+
+       if (!ua->dell_quirk_active)
+               return ret;
+
+       return ucsi_acpi_sync_write(ucsi, UCSI_CONTROL, &ack, sizeof(ack));
+}
+
+static const struct ucsi_operations ucsi_dell_ops = {
+       .read = ucsi_acpi_read,
+       .sync_write = ucsi_dell_sync_write,
+       .async_write = ucsi_acpi_async_write
+};
+
+static const struct dmi_system_id ucsi_acpi_quirks[] = {
        {
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UA_UM325UA"),
                },
+               .driver_data = (void *)&ucsi_zenbook_ops,
+       },
+       {
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+               },
+               .driver_data = (void *)&ucsi_dell_ops,
        },
        { }
 };
 {
        struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);
        const struct ucsi_operations *ops = &ucsi_acpi_ops;
+       const struct dmi_system_id *id;
        struct ucsi_acpi *ua;
        struct resource *res;
        acpi_status status;
        init_completion(&ua->complete);
        ua->dev = &pdev->dev;
 
-       if (dmi_check_system(zenbook_dmi_id))
-               ops = &ucsi_zenbook_ops;
+       id = dmi_first_match(ucsi_acpi_quirks);
+       if (id)
+               ops = id->driver_data;
 
        ua->ucsi = ucsi_create(&pdev->dev, ops);
        if (IS_ERR(ua->ucsi))