diff mbox series

[v2] Input: elantech: Enable SMBus on new (2018+) systems

Message ID 20190121070258.1844-1-kai.heng.feng@canonical.com
State New, archived
Headers show
Series [v2] Input: elantech: Enable SMBus on new (2018+) systems | expand

Commit Message

Kai-Heng Feng Jan. 21, 2019, 7:02 a.m. UTC
There are some new HP laptops with Elantech touchpad don't support
multitouch.

Currently we use ETP_NEW_IC_SMBUS_HOST_NOTIFY() to check if SMBus is
supported, but in addition to firmware version, the bus type also
informs us if the IC can support SMBus, so also check that.

In case of breaking old ICs, only enables SMBus on systems manufactured
after 2018, alongsides aforementioned checks.

Lastly, consolidats all check into elantech_use_host_notify() and use it
to determine whether to use PS/2 or SMBus.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
v2:
- Wording.
- Further restrain on older systems (< 2018).

 drivers/input/mouse/elantech.c | 63 ++++++++++++++++++----------------
 1 file changed, 34 insertions(+), 29 deletions(-)

Comments

Benjamin Tissoires Jan. 21, 2019, 8:33 a.m. UTC | #1
On Mon, Jan 21, 2019 at 8:03 AM Kai-Heng Feng
<kai.heng.feng@canonical.com> wrote:
>
> There are some new HP laptops with Elantech touchpad don't support
> multitouch.
>
> Currently we use ETP_NEW_IC_SMBUS_HOST_NOTIFY() to check if SMBus is
> supported, but in addition to firmware version, the bus type also
> informs us if the IC can support SMBus, so also check that.
>
> In case of breaking old ICs, only enables SMBus on systems manufactured
> after 2018, alongsides aforementioned checks.
>
> Lastly, consolidats all check into elantech_use_host_notify() and use it
> to determine whether to use PS/2 or SMBus.
>
> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
> ---
> v2:
> - Wording.
> - Further restrain on older systems (< 2018).
>
>  drivers/input/mouse/elantech.c | 63 ++++++++++++++++++----------------
>  1 file changed, 34 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
> index 9fe075c137dc..2594130b0079 100644
> --- a/drivers/input/mouse/elantech.c
> +++ b/drivers/input/mouse/elantech.c
> @@ -1799,6 +1799,39 @@ static int elantech_create_smbus(struct psmouse *psmouse,
>                                   leave_breadcrumbs);
>  }
>
> +static bool elantech_use_host_notify(struct psmouse *psmouse,
> +                                    struct elantech_device_info *info)
> +{
> +       bool host_notify = false;
> +
> +       if (ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version))
> +               host_notify = true;
> +       else {
> +               switch (info->bus) {
> +               case ETP_BUS_PS2_ONLY:
> +                       /* expected case */
> +                       break;
> +               case ETP_BUS_SMB_ALERT_ONLY:
> +                       /* fall-through  */
> +               case ETP_BUS_PS2_SMB_ALERT:
> +                       psmouse_dbg(psmouse, "Ignoring SMBus provider through alert protocol.\n");
> +                       break;
> +               case ETP_BUS_SMB_HST_NTFY_ONLY:
> +                       /* fall-through  */
> +               case ETP_BUS_PS2_SMB_HST_NTFY:
> +                       host_notify = true;
> +                       break;
> +               default:
> +                       psmouse_dbg(psmouse,
> +                                   "Ignoring SMBus bus provider %d.\n",
> +                                   info->bus);
> +               }
> +       }
> +
> +       /* SMbus implementation is stable after 2018 */
> +       return host_notify && (dmi_get_bios_year() >= 2018);

Strictly speaking, the check for the year should be in the `switch
(info->bus)`, but OTOH, laptops with ETP_NEW_IC_SMBUS_HOST_NOTIFY
should be manufactured after 2018 too, so we should be good.

Acked-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>

Cheers,
Benjamin

> +}
> +
>  /**
>   * elantech_setup_smbus - called once the PS/2 devices are enumerated
>   * and decides to instantiate a SMBus InterTouch device.
> @@ -1818,7 +1851,7 @@ static int elantech_setup_smbus(struct psmouse *psmouse,
>                  * i2c_blacklist_pnp_ids.
>                  * Old ICs are up to the user to decide.
>                  */
> -               if (!ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version) ||
> +               if (!elantech_use_host_notify(psmouse, info) ||
>                     psmouse_matches_pnp_id(psmouse, i2c_blacklist_pnp_ids))
>                         return -ENXIO;
>         }
> @@ -1838,34 +1871,6 @@ static int elantech_setup_smbus(struct psmouse *psmouse,
>         return 0;
>  }
>
> -static bool elantech_use_host_notify(struct psmouse *psmouse,
> -                                    struct elantech_device_info *info)
> -{
> -       if (ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version))
> -               return true;
> -
> -       switch (info->bus) {
> -       case ETP_BUS_PS2_ONLY:
> -               /* expected case */
> -               break;
> -       case ETP_BUS_SMB_ALERT_ONLY:
> -               /* fall-through  */
> -       case ETP_BUS_PS2_SMB_ALERT:
> -               psmouse_dbg(psmouse, "Ignoring SMBus provider through alert protocol.\n");
> -               break;
> -       case ETP_BUS_SMB_HST_NTFY_ONLY:
> -               /* fall-through  */
> -       case ETP_BUS_PS2_SMB_HST_NTFY:
> -               return true;
> -       default:
> -               psmouse_dbg(psmouse,
> -                           "Ignoring SMBus bus provider %d.\n",
> -                           info->bus);
> -       }
> -
> -       return false;
> -}
> -
>  int elantech_init_smbus(struct psmouse *psmouse)
>  {
>         struct elantech_device_info info;
> --
> 2.17.1
>
Kai-Heng Feng April 11, 2019, 7:54 a.m. UTC | #2
at 16:33, Benjamin Tissoires <benjamin.tissoires@redhat.com> wrote:

> On Mon, Jan 21, 2019 at 8:03 AM Kai-Heng Feng
> <kai.heng.feng@canonical.com> wrote:
>> There are some new HP laptops with Elantech touchpad don't support
>> multitouch.
>>
>> Currently we use ETP_NEW_IC_SMBUS_HOST_NOTIFY() to check if SMBus is
>> supported, but in addition to firmware version, the bus type also
>> informs us if the IC can support SMBus, so also check that.
>>
>> In case of breaking old ICs, only enables SMBus on systems manufactured
>> after 2018, alongsides aforementioned checks.
>>
>> Lastly, consolidats all check into elantech_use_host_notify() and use it
>> to determine whether to use PS/2 or SMBus.
>>
>> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
>> ---
>> v2:
>> - Wording.
>> - Further restrain on older systems (< 2018).
>>
>>  drivers/input/mouse/elantech.c | 63 ++++++++++++++++++----------------
>>  1 file changed, 34 insertions(+), 29 deletions(-)
>>
>> diff --git a/drivers/input/mouse/elantech.c  
>> b/drivers/input/mouse/elantech.c
>> index 9fe075c137dc..2594130b0079 100644
>> --- a/drivers/input/mouse/elantech.c
>> +++ b/drivers/input/mouse/elantech.c
>> @@ -1799,6 +1799,39 @@ static int elantech_create_smbus(struct psmouse  
>> *psmouse,
>>                                   leave_breadcrumbs);
>>  }
>>
>> +static bool elantech_use_host_notify(struct psmouse *psmouse,
>> +                                    struct elantech_device_info *info)
>> +{
>> +       bool host_notify = false;
>> +
>> +       if (ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version))
>> +               host_notify = true;
>> +       else {
>> +               switch (info->bus) {
>> +               case ETP_BUS_PS2_ONLY:
>> +                       /* expected case */
>> +                       break;
>> +               case ETP_BUS_SMB_ALERT_ONLY:
>> +                       /* fall-through  */
>> +               case ETP_BUS_PS2_SMB_ALERT:
>> +                       psmouse_dbg(psmouse, "Ignoring SMBus provider  
>> through alert protocol.\n");
>> +                       break;
>> +               case ETP_BUS_SMB_HST_NTFY_ONLY:
>> +                       /* fall-through  */
>> +               case ETP_BUS_PS2_SMB_HST_NTFY:
>> +                       host_notify = true;
>> +                       break;
>> +               default:
>> +                       psmouse_dbg(psmouse,
>> +                                   "Ignoring SMBus bus provider %d.\n",
>> +                                   info->bus);
>> +               }
>> +       }
>> +
>> +       /* SMbus implementation is stable after 2018 */
>> +       return host_notify && (dmi_get_bios_year() >= 2018);
>
> Strictly speaking, the check for the year should be in the `switch
> (info->bus)`, but OTOH, laptops with ETP_NEW_IC_SMBUS_HOST_NOTIFY
> should be manufactured after 2018 too, so we should be good.
>
> Acked-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>

Hi Dmitry,

Would it be possible to include this patch?

Kai-Heng

>
> Cheers,
> Benjamin
>
>> +}
>> +
>>  /**
>>   * elantech_setup_smbus - called once the PS/2 devices are enumerated
>>   * and decides to instantiate a SMBus InterTouch device.
>> @@ -1818,7 +1851,7 @@ static int elantech_setup_smbus(struct psmouse  
>> *psmouse,
>>                  * i2c_blacklist_pnp_ids.
>>                  * Old ICs are up to the user to decide.
>>                  */
>> -               if (!ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version) ||
>> +               if (!elantech_use_host_notify(psmouse, info) ||
>>                     psmouse_matches_pnp_id(psmouse, i2c_blacklist_pnp_ids))
>>                         return -ENXIO;
>>         }
>> @@ -1838,34 +1871,6 @@ static int elantech_setup_smbus(struct psmouse  
>> *psmouse,
>>         return 0;
>>  }
>>
>> -static bool elantech_use_host_notify(struct psmouse *psmouse,
>> -                                    struct elantech_device_info *info)
>> -{
>> -       if (ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version))
>> -               return true;
>> -
>> -       switch (info->bus) {
>> -       case ETP_BUS_PS2_ONLY:
>> -               /* expected case */
>> -               break;
>> -       case ETP_BUS_SMB_ALERT_ONLY:
>> -               /* fall-through  */
>> -       case ETP_BUS_PS2_SMB_ALERT:
>> -               psmouse_dbg(psmouse, "Ignoring SMBus provider through  
>> alert protocol.\n");
>> -               break;
>> -       case ETP_BUS_SMB_HST_NTFY_ONLY:
>> -               /* fall-through  */
>> -       case ETP_BUS_PS2_SMB_HST_NTFY:
>> -               return true;
>> -       default:
>> -               psmouse_dbg(psmouse,
>> -                           "Ignoring SMBus bus provider %d.\n",
>> -                           info->bus);
>> -       }
>> -
>> -       return false;
>> -}
>> -
>>  int elantech_init_smbus(struct psmouse *psmouse)
>>  {
>>         struct elantech_device_info info;
>> —

>> 2.17.1
diff mbox series

Patch

diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
index 9fe075c137dc..2594130b0079 100644
--- a/drivers/input/mouse/elantech.c
+++ b/drivers/input/mouse/elantech.c
@@ -1799,6 +1799,39 @@  static int elantech_create_smbus(struct psmouse *psmouse,
 				  leave_breadcrumbs);
 }
 
+static bool elantech_use_host_notify(struct psmouse *psmouse,
+				     struct elantech_device_info *info)
+{
+	bool host_notify = false;
+
+	if (ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version))
+		host_notify = true;
+	else {
+		switch (info->bus) {
+		case ETP_BUS_PS2_ONLY:
+			/* expected case */
+			break;
+		case ETP_BUS_SMB_ALERT_ONLY:
+			/* fall-through  */
+		case ETP_BUS_PS2_SMB_ALERT:
+			psmouse_dbg(psmouse, "Ignoring SMBus provider through alert protocol.\n");
+			break;
+		case ETP_BUS_SMB_HST_NTFY_ONLY:
+			/* fall-through  */
+		case ETP_BUS_PS2_SMB_HST_NTFY:
+			host_notify = true;
+			break;
+		default:
+			psmouse_dbg(psmouse,
+				    "Ignoring SMBus bus provider %d.\n",
+				    info->bus);
+		}
+	}
+
+	/* SMbus implementation is stable after 2018 */
+	return host_notify && (dmi_get_bios_year() >= 2018);
+}
+
 /**
  * elantech_setup_smbus - called once the PS/2 devices are enumerated
  * and decides to instantiate a SMBus InterTouch device.
@@ -1818,7 +1851,7 @@  static int elantech_setup_smbus(struct psmouse *psmouse,
 		 * i2c_blacklist_pnp_ids.
 		 * Old ICs are up to the user to decide.
 		 */
-		if (!ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version) ||
+		if (!elantech_use_host_notify(psmouse, info) ||
 		    psmouse_matches_pnp_id(psmouse, i2c_blacklist_pnp_ids))
 			return -ENXIO;
 	}
@@ -1838,34 +1871,6 @@  static int elantech_setup_smbus(struct psmouse *psmouse,
 	return 0;
 }
 
-static bool elantech_use_host_notify(struct psmouse *psmouse,
-				     struct elantech_device_info *info)
-{
-	if (ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version))
-		return true;
-
-	switch (info->bus) {
-	case ETP_BUS_PS2_ONLY:
-		/* expected case */
-		break;
-	case ETP_BUS_SMB_ALERT_ONLY:
-		/* fall-through  */
-	case ETP_BUS_PS2_SMB_ALERT:
-		psmouse_dbg(psmouse, "Ignoring SMBus provider through alert protocol.\n");
-		break;
-	case ETP_BUS_SMB_HST_NTFY_ONLY:
-		/* fall-through  */
-	case ETP_BUS_PS2_SMB_HST_NTFY:
-		return true;
-	default:
-		psmouse_dbg(psmouse,
-			    "Ignoring SMBus bus provider %d.\n",
-			    info->bus);
-	}
-
-	return false;
-}
-
 int elantech_init_smbus(struct psmouse *psmouse)
 {
 	struct elantech_device_info info;