diff mbox

[03/14] Input: atmel_mxt_ts - switch ChromeOS ACPI devices to generic props

Message ID 20180312190907.174301-4-dmitry.torokhov@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Dmitry Torokhov March 12, 2018, 7:08 p.m. UTC
Move older ChromeOS devices describing Atmel controllers in ACPI, but not
providing enough details to configure the controllers properly, from
platform data over to generic device properties. This will allow us
remove support for platform data later on, leaving only generic device
properties in place.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/touchscreen/atmel_mxt_ts.c | 63 +++++++++++++++---------
 1 file changed, 40 insertions(+), 23 deletions(-)

Comments

Nick Dyer March 14, 2018, 8:52 p.m. UTC | #1
On Mon, Mar 12, 2018 at 12:08:56PM -0700, Dmitry Torokhov wrote:
> Move older ChromeOS devices describing Atmel controllers in ACPI, but not
> providing enough details to configure the controllers properly, from
> platform data over to generic device properties. This will allow us
> remove support for platform data later on, leaving only generic device
> properties in place.
> 
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

Acked-by: Nick Dyer <nick@shmanahar.org>

> ---
>  drivers/input/touchscreen/atmel_mxt_ts.c | 63 +++++++++++++++---------
>  1 file changed, 40 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
> index 072b78d3c6e00..cf2aac4e79ae8 100644
> --- a/drivers/input/touchscreen/atmel_mxt_ts.c
> +++ b/drivers/input/touchscreen/atmel_mxt_ts.c
> @@ -2972,7 +2972,7 @@ mxt_parse_device_properties(struct i2c_client *client)
>  
>  struct mxt_acpi_platform_data {
>  	const char *hid;
> -	struct mxt_platform_data pdata;
> +	const struct property_entry *props;
>  };
>  
>  static unsigned int samus_touchpad_buttons[] = {
> @@ -2982,14 +2982,16 @@ static unsigned int samus_touchpad_buttons[] = {
>  	BTN_LEFT
>  };
>  
> +static const struct property_entry samus_touchpad_props[] = {
> +	PROPERTY_ENTRY_U32_ARRAY("linux,gpio-keymap", samus_touchpad_buttons),
> +	{ }
> +};
> +
>  static struct mxt_acpi_platform_data samus_platform_data[] = {
>  	{
>  		/* Touchpad */
>  		.hid	= "ATML0000",
> -		.pdata	= {
> -			.t19_num_keys	= ARRAY_SIZE(samus_touchpad_buttons),
> -			.t19_keymap	= samus_touchpad_buttons,
> -		},
> +		.props	= samus_touchpad_props,
>  	},
>  	{
>  		/* Touchscreen */
> @@ -3007,14 +3009,16 @@ static unsigned int chromebook_tp_buttons[] = {
>  	BTN_LEFT
>  };
>  
> +static const struct property_entry chromebook_tp_props[] = {
> +	PROPERTY_ENTRY_U32_ARRAY("linux,gpio-keymap", chromebook_tp_buttons),
> +	{ }
> +};
> +
>  static struct mxt_acpi_platform_data chromebook_platform_data[] = {
>  	{
>  		/* Touchpad */
>  		.hid	= "ATML0000",
> -		.pdata	= {
> -			.t19_num_keys	= ARRAY_SIZE(chromebook_tp_buttons),
> -			.t19_keymap	= chromebook_tp_buttons,
> -		},
> +		.props	= chromebook_tp_props,
>  	},
>  	{
>  		/* Touchscreen */
> @@ -3044,7 +3048,7 @@ static const struct dmi_system_id mxt_dmi_table[] = {
>  	{ }
>  };
>  
> -static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client)
> +static int mxt_acpi_probe(struct i2c_client *client)
>  {
>  	struct acpi_device *adev;
>  	const struct dmi_system_id *system_id;
> @@ -3061,33 +3065,46 @@ static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client)
>  	 * as a threshold.
>  	 */
>  	if (client->addr < 0x40)
> -		return ERR_PTR(-ENXIO);
> +		return -ENXIO;
>  
>  	adev = ACPI_COMPANION(&client->dev);
>  	if (!adev)
> -		return ERR_PTR(-ENOENT);
> +		return -ENOENT;
>  
>  	system_id = dmi_first_match(mxt_dmi_table);
>  	if (!system_id)
> -		return ERR_PTR(-ENOENT);
> +		return -ENOENT;
>  
>  	acpi_pdata = system_id->driver_data;
>  	if (!acpi_pdata)
> -		return ERR_PTR(-ENOENT);
> +		return -ENOENT;
>  
>  	while (acpi_pdata->hid) {
> -		if (!strcmp(acpi_device_hid(adev), acpi_pdata->hid))
> -			return &acpi_pdata->pdata;
> +		if (!strcmp(acpi_device_hid(adev), acpi_pdata->hid)) {
> +			/*
> +			 * Remove previously installed properties if we
> +			 * are probing this device not for the very first
> +			 * time.
> +			 */
> +			device_remove_properties(&client->dev);
> +
> +			/*
> +			 * Now install the platform-specific properties
> +			 * that are missing from ACPI.
> +			 */
> +			device_add_properties(&client->dev, acpi_pdata->props);
> +			break;
> +		}
>  
>  		acpi_pdata++;
>  	}
>  
> -	return ERR_PTR(-ENOENT);
> +	return 0;
>  }
>  #else
> -static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client)
> +static int mxt_acpi_probe(struct i2c_client *client)
>  {
> -	return ERR_PTR(-ENOENT);
> +	return -ENOENT;
>  }
>  #endif
>  
> @@ -3100,10 +3117,6 @@ mxt_get_platform_data(struct i2c_client *client)
>  	if (pdata)
>  		return pdata;
>  
> -	pdata = mxt_parse_acpi(client);
> -	if (!IS_ERR(pdata) || PTR_ERR(pdata) != -ENOENT)
> -		return pdata;
> -
>  	return mxt_parse_device_properties(client);
>  }
>  
> @@ -3113,6 +3126,10 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
>  	const struct mxt_platform_data *pdata;
>  	int error;
>  
> +	error = mxt_acpi_probe(client);
> +	if (error && error != -ENOENT)
> +		return error;
> +
>  	pdata = mxt_get_platform_data(client);
>  	if (IS_ERR(pdata))
>  		return PTR_ERR(pdata);
> -- 
> 2.16.2.660.g709887971b-goog
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 072b78d3c6e00..cf2aac4e79ae8 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -2972,7 +2972,7 @@  mxt_parse_device_properties(struct i2c_client *client)
 
 struct mxt_acpi_platform_data {
 	const char *hid;
-	struct mxt_platform_data pdata;
+	const struct property_entry *props;
 };
 
 static unsigned int samus_touchpad_buttons[] = {
@@ -2982,14 +2982,16 @@  static unsigned int samus_touchpad_buttons[] = {
 	BTN_LEFT
 };
 
+static const struct property_entry samus_touchpad_props[] = {
+	PROPERTY_ENTRY_U32_ARRAY("linux,gpio-keymap", samus_touchpad_buttons),
+	{ }
+};
+
 static struct mxt_acpi_platform_data samus_platform_data[] = {
 	{
 		/* Touchpad */
 		.hid	= "ATML0000",
-		.pdata	= {
-			.t19_num_keys	= ARRAY_SIZE(samus_touchpad_buttons),
-			.t19_keymap	= samus_touchpad_buttons,
-		},
+		.props	= samus_touchpad_props,
 	},
 	{
 		/* Touchscreen */
@@ -3007,14 +3009,16 @@  static unsigned int chromebook_tp_buttons[] = {
 	BTN_LEFT
 };
 
+static const struct property_entry chromebook_tp_props[] = {
+	PROPERTY_ENTRY_U32_ARRAY("linux,gpio-keymap", chromebook_tp_buttons),
+	{ }
+};
+
 static struct mxt_acpi_platform_data chromebook_platform_data[] = {
 	{
 		/* Touchpad */
 		.hid	= "ATML0000",
-		.pdata	= {
-			.t19_num_keys	= ARRAY_SIZE(chromebook_tp_buttons),
-			.t19_keymap	= chromebook_tp_buttons,
-		},
+		.props	= chromebook_tp_props,
 	},
 	{
 		/* Touchscreen */
@@ -3044,7 +3048,7 @@  static const struct dmi_system_id mxt_dmi_table[] = {
 	{ }
 };
 
-static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client)
+static int mxt_acpi_probe(struct i2c_client *client)
 {
 	struct acpi_device *adev;
 	const struct dmi_system_id *system_id;
@@ -3061,33 +3065,46 @@  static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client)
 	 * as a threshold.
 	 */
 	if (client->addr < 0x40)
-		return ERR_PTR(-ENXIO);
+		return -ENXIO;
 
 	adev = ACPI_COMPANION(&client->dev);
 	if (!adev)
-		return ERR_PTR(-ENOENT);
+		return -ENOENT;
 
 	system_id = dmi_first_match(mxt_dmi_table);
 	if (!system_id)
-		return ERR_PTR(-ENOENT);
+		return -ENOENT;
 
 	acpi_pdata = system_id->driver_data;
 	if (!acpi_pdata)
-		return ERR_PTR(-ENOENT);
+		return -ENOENT;
 
 	while (acpi_pdata->hid) {
-		if (!strcmp(acpi_device_hid(adev), acpi_pdata->hid))
-			return &acpi_pdata->pdata;
+		if (!strcmp(acpi_device_hid(adev), acpi_pdata->hid)) {
+			/*
+			 * Remove previously installed properties if we
+			 * are probing this device not for the very first
+			 * time.
+			 */
+			device_remove_properties(&client->dev);
+
+			/*
+			 * Now install the platform-specific properties
+			 * that are missing from ACPI.
+			 */
+			device_add_properties(&client->dev, acpi_pdata->props);
+			break;
+		}
 
 		acpi_pdata++;
 	}
 
-	return ERR_PTR(-ENOENT);
+	return 0;
 }
 #else
-static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client)
+static int mxt_acpi_probe(struct i2c_client *client)
 {
-	return ERR_PTR(-ENOENT);
+	return -ENOENT;
 }
 #endif
 
@@ -3100,10 +3117,6 @@  mxt_get_platform_data(struct i2c_client *client)
 	if (pdata)
 		return pdata;
 
-	pdata = mxt_parse_acpi(client);
-	if (!IS_ERR(pdata) || PTR_ERR(pdata) != -ENOENT)
-		return pdata;
-
 	return mxt_parse_device_properties(client);
 }
 
@@ -3113,6 +3126,10 @@  static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
 	const struct mxt_platform_data *pdata;
 	int error;
 
+	error = mxt_acpi_probe(client);
+	if (error && error != -ENOENT)
+		return error;
+
 	pdata = mxt_get_platform_data(client);
 	if (IS_ERR(pdata))
 		return PTR_ERR(pdata);