struct ideapad_dytc_priv *dytc;
        struct dentry *debug;
        unsigned long cfg;
+       unsigned long r_touchpad_val;
        struct {
                bool conservation_mode    : 1;
                bool dytc                 : 1;
        if (err)
                return err;
 
+       priv->r_touchpad_val = result;
+
        return sysfs_emit(buf, "%d\n", !!result);
 }
 
        if (err)
                return err;
 
+       priv->r_touchpad_val = state;
+
        return count;
 }
 
        { KE_KEY,  65, { KEY_PROG4 } },
        { KE_KEY,  66, { KEY_TOUCHPAD_OFF } },
        { KE_KEY,  67, { KEY_TOUCHPAD_ON } },
+       { KE_KEY,  68, { KEY_TOUCHPAD_TOGGLE } },
        { KE_KEY, 128, { KEY_ESC } },
 
        /*
        unsigned char param;
        int ret;
 
-       if (!priv->features.touchpad_ctrl_via_ec)
-               return;
-
        /* Without reading from EC touchpad LED doesn't switch state */
        ret = read_ec_data(priv->adev->handle, VPCCMD_R_TOUCHPAD, &value);
        if (ret)
                i8042_command(¶m, value ? I8042_CMD_AUX_ENABLE : I8042_CMD_AUX_DISABLE);
 
        if (send_events) {
-               ideapad_input_report(priv, value ? 67 : 66);
-               sysfs_notify(&priv->platform_device->dev.kobj, NULL, "touchpad");
+               /*
+                * On older models the EC controls the touchpad and toggles it
+                * on/off itself, in this case we report KEY_TOUCHPAD_ON/_OFF.
+                * If the EC did not toggle, report KEY_TOUCHPAD_TOGGLE.
+                */
+               if (value != priv->r_touchpad_val) {
+                       ideapad_input_report(priv, value ? 67 : 66);
+                       sysfs_notify(&priv->platform_device->dev.kobj, NULL, "touchpad");
+               } else {
+                       ideapad_input_report(priv, 68);
+               }
        }
+
+       priv->r_touchpad_val = value;
 }
 
 static void ideapad_acpi_notify(acpi_handle handle, u32 event, void *data)