From nobody Sun Oct 5 03:36:58 2025 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B7AF7285CB0; Mon, 11 Aug 2025 02:23:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754879004; cv=none; b=dgiDyRjVNNJ+PZoQDztiP2JSUbo1Cd8FvW2F7DOjeDU3SvFIsb3JBfgAuDe6acHbVAdEE5xKKHHiPd20LJteQsLxeP7NEndirw2LTtxDeXu1v4ULQskAYqI9yv+nqz1pmvvzvfHieYV7lnK/wgz6Q9X7oigxXOSw4cHqy1MiS/M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754879004; c=relaxed/simple; bh=tkg9uXrsU0kfP1J4wKHXdPxWLrfWQgNzypBdnkXmcxU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XT96IGrGg2SBab8bZSPK6Ae8Z5pJEpzeFPZTzJZRBFn0KrOkSXNSxz6FRP0taAZDuvzv5Xe0pkQtEOjm+KodPYLxKdXKJsK+Epezx3BvRA1641ncgKftorwcofO1SdGUGzj+ZqMk1Iouc8t4ZGLgK2W7+DYVVggfS2b8A+pC648= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PRX9hBw9; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PRX9hBw9" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-76be8e4b59aso3140919b3a.1; Sun, 10 Aug 2025 19:23:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1754879002; x=1755483802; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Zc0OmXKKIKzJxLhoELmXzeUr9qo5ipAMm7/O57p0HGY=; b=PRX9hBw9A2mMvMEVROEh/yzjCxMkXwx7js0oyQDYzdKOsz0UGm28NgjUvh3tcAfalp OuSkNoBCLtAgpxrUGR9bGdzYWpYwVh0h8HcR6ajoaL1TAXMyRxByiBVWCbZKnyXD4flJ MpfXSi3ltQLSD9kROrEWC4+kPQpK8CusbUn/bHdWjPclSIumOjeHpn3c9/1fyBxj2jQB IOxLIUJS/zkPr/IGHqzH7yuVsF1hn2v7jW031IDfOoYtwttaRM3ned6V1Fsl0PfOEwC0 DM/k9/Zd9R56PtGd5Isk4w712QHMBJBWq3yoO3bAWrrUPSGY4t3AFiRw3Mt0D9KBd4ZQ sN6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754879002; x=1755483802; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Zc0OmXKKIKzJxLhoELmXzeUr9qo5ipAMm7/O57p0HGY=; b=v5d83odNuBQP+6jyWt52vG6crKCmfJBNHDuV/rwADb5UGo/X/lKBuiD31/vdWAf5GJ lTH8znwKOgHYjATrM7eCFfTk0ss77h7uTGL2jjwbXfa7SOrNlFYFb1dvDJcFXtkNIRkU VxQWmliG4Gym1/p8o6i1AY2caVQpSbAMihdM0LzcErKqfwBZFSvC6nYQ1kRwAPJFas6w yKJ6GVvdOV5wx10+bBllwvcMchqf6V0AphTaDWONN9isyPOqT/ox0Fqk9Au4f+8rSqSI wSeqOXh4BGkxqJ3AuK6q9dRhylveib+x8Hnp++PqYJZWoAC1QkZVq4GfrB1B1Xfkd2da Iqlw== X-Forwarded-Encrypted: i=1; AJvYcCURP+4UlJYZLZ01Fu0hUpC9dnRBJoajTl+0ggMuJA1YQ/gD7onnAVMOwD6EJQgrqk7A75srxkG1b2MZcQPAP3pgZ6LVAg==@vger.kernel.org, AJvYcCVcUpHQj6ANQmBW4+8IV2XEprcP76PbC/iHba94SgGeWg05lEvV/x4bLLhVMnK0t127djzEgDtB0MOQ/X4=@vger.kernel.org X-Gm-Message-State: AOJu0Yx/0ynZ21zl4bMf7pPaCtUW0DSDoV2t+4YABignQNdGP1bQcNfr v5PbNhEBI4wSv74t3ZfKxa2gk6cUeK5T59ubLOQjxNE6qsERmM2xFWzR X-Gm-Gg: ASbGncurgg8WF4FChxaYw4xkdjg1IhrhHKQNdmxMN9YGZGEh89xSg4XRRR9nXVobuki MGTGp17QqcpYB8Q7DEGYaaQRKIKMDIKdW3Ar+LncVtyvPl3g7JrWdr3lc9sA4RFpgn1MF1f5XM8 iVJCAY4ncgA0TumY+PQ09BBQOOiXvNScvstdXcmqcqx560t1NX1ppCV4kTRx6hnn+MMhUflqWLT zLJBvBrCwuVXr9TFycV7pkWc+YRBwP9XY7CkCFdSfJlGm0lg+eYDGrVMXLafkvnS4Pp/+VsyXkE 6wXymdmJpmmaIvI6UxV3ApgoUr8ny2odLoGLmbnW25+C8d0FYeW1CgTJZ+4o11WYaI2lnqJeDaH iCyYirZGy16gIdNQ5KJALs3bZDrTmGGbV3YTaqAs1OAK5nw== X-Google-Smtp-Source: AGHT+IHVIafIzp2Ny4atF7F4CpYo8rTGVyou4mhKOPf9znFtYZduCLWZ99MsCK4L1IL2zWUQgCIhXw== X-Received: by 2002:a05:6a20:3ca5:b0:23d:de52:a5c9 with SMTP id adf61e73a8af0-240550142eemr16946211637.1.1754879001839; Sun, 10 Aug 2025 19:23:21 -0700 (PDT) Received: from dtor-ws.sjc.corp.google.com ([2620:15c:9d:2:69d7:30de:b05e:915b]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b422be2b3a5sm21880366a12.46.2025.08.10.19.23.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 10 Aug 2025 19:23:21 -0700 (PDT) From: Dmitry Torokhov To: Hans de Goede Cc: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Arnd Bergmann , Andy Shevchenko , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 11/11] platform/x86: x86-android-tablets: convert gpio_keys devices to GPIO references Date: Sun, 10 Aug 2025 19:22:57 -0700 Message-ID: <20250810-x86-andoroid-tablet-v2-11-9c7a1b3c32b2@gmail.com> X-Mailer: git-send-email 2.51.0.rc0.155.g4a0f42376b-goog In-Reply-To: <20250810-x86-andoroid-tablet-v2-0-9c7a1b3c32b2@gmail.com> References: <20250810-x86-andoroid-tablet-v2-0-9c7a1b3c32b2@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-e44bb Content-Transfer-Encoding: quoted-printable Now that gpiolib supports software nodes to describe GPIOs, switch the driver away from using GPIO lookup tables for wm1502 devices to using PROPERTY_ENTRY_GPIO(). With that we can remove support for gpiod_lookup_tables from the driver. Signed-off-by: Dmitry Torokhov --- drivers/platform/x86/x86-android-tablets/asus.c | 42 ++++--- drivers/platform/x86/x86-android-tablets/core.c | 44 +++---- drivers/platform/x86/x86-android-tablets/lenovo.c | 79 +++++++----- drivers/platform/x86/x86-android-tablets/other.c | 138 +++++++++++++----= ---- .../x86/x86-android-tablets/x86-android-tablets.h | 10 +- 5 files changed, 177 insertions(+), 136 deletions(-) diff --git a/drivers/platform/x86/x86-android-tablets/asus.c b/drivers/plat= form/x86/x86-android-tablets/asus.c index ce581d161551..91245f1bfd87 100644 --- a/drivers/platform/x86/x86-android-tablets/asus.c +++ b/drivers/platform/x86/x86-android-tablets/asus.c @@ -10,7 +10,7 @@ =20 #include #include -#include +#include #include =20 #include "shared-psy-info.h" @@ -31,17 +31,29 @@ static const struct platform_device_info asus_me176c_tf= 103c_pdevs[] __initconst }, }; =20 -static const struct x86_gpio_button asus_me176c_tf103c_lid __initconst =3D= { - .button =3D { - .code =3D SW_LID, - .active_low =3D true, - .desc =3D "lid_sw", - .type =3D EV_SW, - .wakeup =3D true, - .debounce_interval =3D 50, - }, - .chip =3D "INT33FC:02", - .pin =3D 12, +static const struct software_node asus_me176c_tf103c_gpio_keys_node =3D { + .name =3D "lid_sw", +}; + +static const struct property_entry asus_me176c_tf103c_lid_props[] =3D { + PROPERTY_ENTRY_U32("linux,input-type", EV_SW), + PROPERTY_ENTRY_U32("linux,code", SW_LID), + PROPERTY_ENTRY_STRING("label", "lid_sw"), + PROPERTY_ENTRY_GPIO("gpios", &baytrail_gpiochip_nodes[2], 12, GPIO_ACTIVE= _LOW), + PROPERTY_ENTRY_U32("debounce-interval", 50), + PROPERTY_ENTRY_BOOL("wakeup-source"), + { } +}; + +static const struct software_node asus_me176c_tf103c_lid_node =3D { + .parent =3D &asus_me176c_tf103c_gpio_keys_node, + .properties =3D asus_me176c_tf103c_lid_props, +}; + +static const struct software_node *asus_me176c_tf103c_lid_swnodes[] =3D { + &asus_me176c_tf103c_gpio_keys_node, + &asus_me176c_tf103c_lid_node, + NULL }; =20 /* Asus ME176C tablets have an Android factory image with everything hardc= oded */ @@ -177,8 +189,7 @@ const struct x86_dev_info asus_me176c_info __initconst = =3D { .pdev_count =3D ARRAY_SIZE(asus_me176c_tf103c_pdevs), .serdev_info =3D asus_me176c_serdevs, .serdev_count =3D ARRAY_SIZE(asus_me176c_serdevs), - .gpio_button =3D &asus_me176c_tf103c_lid, - .gpio_button_count =3D 1, + .gpio_button_swnodes =3D asus_me176c_tf103c_lid_swnodes, .bat_swnode =3D &generic_lipo_hv_4v35_battery_node, .modules =3D bq24190_modules, .gpiochip_type =3D X86_GPIOCHIP_BAYTRAIL, @@ -301,8 +312,7 @@ const struct x86_dev_info asus_tf103c_info __initconst = =3D { .i2c_client_count =3D ARRAY_SIZE(asus_tf103c_i2c_clients), .pdev_info =3D asus_me176c_tf103c_pdevs, .pdev_count =3D ARRAY_SIZE(asus_me176c_tf103c_pdevs), - .gpio_button =3D &asus_me176c_tf103c_lid, - .gpio_button_count =3D 1, + .gpio_button_swnodes =3D asus_me176c_tf103c_lid_swnodes, .bat_swnode =3D &generic_lipo_4v2_battery_node, .modules =3D bq24190_modules, .gpiochip_type =3D X86_GPIOCHIP_BAYTRAIL, diff --git a/drivers/platform/x86/x86-android-tablets/core.c b/drivers/plat= form/x86/x86-android-tablets/core.c index 94942921b203..232f6076aa99 100644 --- a/drivers/platform/x86/x86-android-tablets/core.c +++ b/drivers/platform/x86/x86-android-tablets/core.c @@ -152,7 +152,7 @@ static struct i2c_client **i2c_clients; static struct spi_device **spi_devs; static struct platform_device **pdevs; static struct serdev_device **serdevs; -static struct gpio_keys_button *buttons; +static const struct software_node **gpio_button_swnodes; static const struct software_node *bat_swnode; static const struct software_node **gpiochip_node_group; static void (*exit_handler)(void); @@ -374,7 +374,6 @@ static void x86_android_tablet_remove(struct platform_d= evice *pdev) platform_device_unregister(pdevs[i]); =20 kfree(pdevs); - kfree(buttons); =20 for (i =3D spi_dev_count - 1; i >=3D 0; i--) spi_unregister_device(spi_devs[i]); @@ -389,6 +388,9 @@ static void x86_android_tablet_remove(struct platform_d= evice *pdev) if (exit_handler) exit_handler(); =20 + if (gpio_button_swnodes) + software_node_unregister_node_group(gpio_button_swnodes); + if (bat_swnode) software_node_unregister(bat_swnode); =20 @@ -515,38 +517,22 @@ static __init int x86_android_tablet_probe(struct pla= tform_device *pdev) } } =20 - if (dev_info->gpio_button_count) { - struct gpio_keys_platform_data pdata =3D { }; - struct gpio_desc *gpiod; + if (dev_info->gpio_button_swnodes) { + struct platform_device_info button_info =3D { + .name =3D "gpio-keys", + .id =3D PLATFORM_DEVID_AUTO, + }; =20 - buttons =3D kcalloc(dev_info->gpio_button_count, sizeof(*buttons), GFP_K= ERNEL); - if (!buttons) { + ret =3D software_node_register_node_group(dev_info->gpio_button_swnodes); + if (ret < 0) { x86_android_tablet_remove(pdev); - return -ENOMEM; - } - - for (i =3D 0; i < dev_info->gpio_button_count; i++) { - ret =3D x86_android_tablet_get_gpiod(dev_info->gpio_button[i].chip, - dev_info->gpio_button[i].pin, - dev_info->gpio_button[i].button.desc, - false, GPIOD_IN, &gpiod); - if (ret < 0) { - x86_android_tablet_remove(pdev); - return ret; - } - - buttons[i] =3D dev_info->gpio_button[i].button; - buttons[i].gpio =3D desc_to_gpio(gpiod); - /* Release GPIO descriptor so that gpio-keys can request it */ - devm_gpiod_put(&x86_android_tablet_device->dev, gpiod); + return ret; } =20 - pdata.buttons =3D buttons; - pdata.nbuttons =3D dev_info->gpio_button_count; + gpio_button_swnodes =3D dev_info->gpio_button_swnodes; =20 - pdevs[pdev_count] =3D platform_device_register_data(&pdev->dev, "gpio-ke= ys", - PLATFORM_DEVID_AUTO, - &pdata, sizeof(pdata)); + button_info.fwnode =3D software_node_fwnode(dev_info->gpio_button_swnode= s[0]); + pdevs[pdev_count] =3D platform_device_register_full(&button_info); if (IS_ERR(pdevs[pdev_count])) { ret =3D PTR_ERR(pdevs[pdev_count]); x86_android_tablet_remove(pdev); diff --git a/drivers/platform/x86/x86-android-tablets/lenovo.c b/drivers/pl= atform/x86/x86-android-tablets/lenovo.c index 7c6a6fc6be42..0cee7f4f1f98 100644 --- a/drivers/platform/x86/x86-android-tablets/lenovo.c +++ b/drivers/platform/x86/x86-android-tablets/lenovo.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -199,17 +200,34 @@ static const struct x86_serdev_info lenovo_yb1_x90_se= rdevs[] __initconst =3D { }, }; =20 -static const struct x86_gpio_button lenovo_yb1_x90_lid __initconst =3D { - .button =3D { - .code =3D SW_LID, - .active_low =3D true, - .desc =3D "lid_sw", - .type =3D EV_SW, - .wakeup =3D true, - .debounce_interval =3D 50, - }, - .chip =3D "INT33FF:02", - .pin =3D 19, +/* + * Software node attached to gpio-keys device representing the LID and + * serving as a parent to software nodes representing individual keys/butt= ons + * as required by the device tree binding. + */ +static const struct software_node lenovo_lid_gpio_keys_node =3D { + .name =3D "lid_sw", +}; + +static const struct property_entry lenovo_yb1_x90_lid_props[] =3D { + PROPERTY_ENTRY_U32("linux,input-type", EV_SW), + PROPERTY_ENTRY_U32("linux,code", SW_LID), + PROPERTY_ENTRY_STRING("label", "lid_sw"), + PROPERTY_ENTRY_GPIO("gpios", &cherryview_gpiochip_nodes[2], 19, GPIO_ACTI= VE_LOW), + PROPERTY_ENTRY_U32("debounce-interval", 50), + PROPERTY_ENTRY_BOOL("wakeup-source"), + { } +}; + +static const struct software_node lenovo_yb1_x90_lid_node =3D { + .parent =3D &lenovo_lid_gpio_keys_node, + .properties =3D lenovo_yb1_x90_lid_props, +}; + +static const struct software_node *lenovo_yb1_x90_lid_swnodes[] =3D { + &lenovo_lid_gpio_keys_node, + &lenovo_yb1_x90_lid_node, + NULL }; =20 static int __init lenovo_yb1_x90_init(struct device *dev) @@ -238,8 +256,7 @@ const struct x86_dev_info lenovo_yogabook_x90_info __in= itconst =3D { .pdev_count =3D ARRAY_SIZE(lenovo_yb1_x90_pdevs), .serdev_info =3D lenovo_yb1_x90_serdevs, .serdev_count =3D ARRAY_SIZE(lenovo_yb1_x90_serdevs), - .gpio_button =3D &lenovo_yb1_x90_lid, - .gpio_button_count =3D 1, + .gpio_button_swnodes =3D lenovo_yb1_x90_lid_swnodes, .gpiochip_type =3D X86_GPIOCHIP_CHERRYVIEW, .init =3D lenovo_yb1_x90_init, }; @@ -276,17 +293,25 @@ static const struct software_node lenovo_yoga_tab2_83= 0_1050_bq24190_node =3D { .properties =3D lenovo_yoga_tab2_830_1050_bq24190_props, }; =20 -static const struct x86_gpio_button lenovo_yoga_tab2_830_1050_lid __initco= nst =3D { - .button =3D { - .code =3D SW_LID, - .active_low =3D true, - .desc =3D "lid_sw", - .type =3D EV_SW, - .wakeup =3D true, - .debounce_interval =3D 50, - }, - .chip =3D "INT33FC:02", - .pin =3D 26, +static const struct property_entry lenovo_yoga_tab2_830_1050_lid_props[] = =3D { + PROPERTY_ENTRY_U32("linux,input-type", EV_SW), + PROPERTY_ENTRY_U32("linux,code", SW_LID), + PROPERTY_ENTRY_STRING("label", "lid_sw"), + PROPERTY_ENTRY_GPIO("gpios", &baytrail_gpiochip_nodes[2], 26, GPIO_ACTIVE= _LOW), + PROPERTY_ENTRY_U32("debounce-interval", 50), + PROPERTY_ENTRY_BOOL("wakeup-source"), + { } +}; + +static const struct software_node lenovo_yoga_tab2_830_1050_lid_node =3D { + .parent =3D &lenovo_lid_gpio_keys_node, + .properties =3D lenovo_yoga_tab2_830_1050_lid_props, +}; + +static const struct software_node *lenovo_yoga_tab2_830_1050_lid_swnodes[]= =3D { + &lenovo_lid_gpio_keys_node, + &lenovo_yoga_tab2_830_1050_lid_node, + NULL }; =20 /* This gets filled by lenovo_yoga_tab2_830_1050_init() */ @@ -422,8 +447,7 @@ const struct x86_dev_info lenovo_yoga_tab2_830_1050_inf= o __initconst =3D { .i2c_client_count =3D ARRAY_SIZE(lenovo_yoga_tab2_830_1050_i2c_clients), .pdev_info =3D lenovo_yoga_tab2_830_1050_pdevs, .pdev_count =3D ARRAY_SIZE(lenovo_yoga_tab2_830_1050_pdevs), - .gpio_button =3D &lenovo_yoga_tab2_830_1050_lid, - .gpio_button_count =3D 1, + .gpio_button_swnodes =3D lenovo_yoga_tab2_830_1050_lid_swnodes, .bat_swnode =3D &generic_lipo_hv_4v35_battery_node, .modules =3D bq24190_modules, .gpiochip_type =3D X86_GPIOCHIP_BAYTRAIL, @@ -785,8 +809,7 @@ const struct x86_dev_info lenovo_yoga_tab2_1380_info __= initconst =3D { .i2c_client_count =3D ARRAY_SIZE(lenovo_yoga_tab2_1380_i2c_clients), .pdev_info =3D lenovo_yoga_tab2_1380_pdevs, .pdev_count =3D ARRAY_SIZE(lenovo_yoga_tab2_1380_pdevs), - .gpio_button =3D &lenovo_yoga_tab2_830_1050_lid, - .gpio_button_count =3D 1, + .gpio_button_swnodes =3D lenovo_yoga_tab2_830_1050_lid_swnodes, .bat_swnode =3D &generic_lipo_hv_4v35_battery_node, .modules =3D lenovo_yoga_tab2_1380_modules, .gpiochip_type =3D X86_GPIOCHIP_BAYTRAIL, diff --git a/drivers/platform/x86/x86-android-tablets/other.c b/drivers/pla= tform/x86/x86-android-tablets/other.c index 38c5e7bd88b0..8bb63546097f 100644 --- a/drivers/platform/x86/x86-android-tablets/other.c +++ b/drivers/platform/x86/x86-android-tablets/other.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include @@ -115,22 +115,32 @@ const struct x86_dev_info acer_b1_750_info __initcons= t =3D { * which is not described in the ACPI tables in anyway. * Use the x86-android-tablets infra to create a gpio-keys device for this. */ -static const struct x86_gpio_button advantech_mica_071_button __initconst = =3D { - .button =3D { - .code =3D KEY_PROG1, - .active_low =3D true, - .desc =3D "prog1_key", - .type =3D EV_KEY, - .wakeup =3D false, - .debounce_interval =3D 50, - }, - .chip =3D "INT33FC:00", - .pin =3D 2, +static const struct software_node advantech_mica_071_gpio_keys_node =3D { + .name =3D "prog1_key", +}; + +static const struct property_entry advantech_mica_071_prog1_key_props[] = =3D { + PROPERTY_ENTRY_U32("linux,code", KEY_PROG1), + PROPERTY_ENTRY_STRING("label", "prog1_key"), + PROPERTY_ENTRY_GPIO("gpios", &baytrail_gpiochip_nodes[0], 2, GPIO_ACTIVE_= LOW), + PROPERTY_ENTRY_U32("debounce-interval", 50), + { } +}; + +static const struct software_node advantech_mica_071_prog1_key_node =3D { + .parent =3D &advantech_mica_071_gpio_keys_node, + .properties =3D advantech_mica_071_prog1_key_props, +}; + +static const struct software_node *advantech_mica_071_button_swnodes[] =3D= { + &advantech_mica_071_gpio_keys_node, + &advantech_mica_071_prog1_key_node, + NULL }; =20 const struct x86_dev_info advantech_mica_071_info __initconst =3D { - .gpio_button =3D &advantech_mica_071_button, - .gpio_button_count =3D 1, + .gpio_button_swnodes =3D advantech_mica_071_button_swnodes, + .gpiochip_type =3D X86_GPIOCHIP_BAYTRAIL, }; =20 /* @@ -226,36 +236,46 @@ const struct x86_dev_info chuwi_hi8_info __initconst = =3D { * in the button row with the power + volume-buttons labeled P and F. * Use the x86-android-tablets infra to create a gpio-keys device for thes= e. */ -static const struct x86_gpio_button cyberbook_t116_buttons[] __initconst = =3D { - { - .button =3D { - .code =3D KEY_PROG1, - .active_low =3D true, - .desc =3D "prog1_key", - .type =3D EV_KEY, - .wakeup =3D false, - .debounce_interval =3D 50, - }, - .chip =3D "INT33FF:00", - .pin =3D 30, - }, - { - .button =3D { - .code =3D KEY_PROG2, - .active_low =3D true, - .desc =3D "prog2_key", - .type =3D EV_KEY, - .wakeup =3D false, - .debounce_interval =3D 50, - }, - .chip =3D "INT33FF:03", - .pin =3D 48, - }, +static const struct software_node cyberbook_t116_gpio_keys_node =3D { + .name =3D "prog_keys", +}; + +static const struct property_entry cyberbook_t116_prog1_key_props[] =3D { + PROPERTY_ENTRY_U32("linux,code", KEY_PROG1), + PROPERTY_ENTRY_STRING("label", "prog1_key"), + PROPERTY_ENTRY_GPIO("gpios", &cherryview_gpiochip_nodes[0], 30, GPIO_ACTI= VE_LOW), + PROPERTY_ENTRY_U32("debounce-interval", 50), + { } +}; + +static const struct software_node cyberbook_t116_prog1_key_node =3D { + .parent =3D &cyberbook_t116_gpio_keys_node, + .properties =3D cyberbook_t116_prog1_key_props, +}; + +static const struct property_entry cyberbook_t116_prog2_key_props[] =3D { + PROPERTY_ENTRY_U32("linux,code", KEY_PROG2), + PROPERTY_ENTRY_STRING("label", "prog2_key"), + PROPERTY_ENTRY_GPIO("gpios", &cherryview_gpiochip_nodes[3], 48, GPIO_ACTI= VE_LOW), + PROPERTY_ENTRY_U32("debounce-interval", 50), + { } +}; + +static const struct software_node cyberbook_t116_prog2_key_node =3D { + .parent =3D &cyberbook_t116_gpio_keys_node, + .properties =3D cyberbook_t116_prog2_key_props, +}; + +static const struct software_node *cyberbook_t116_buttons_swnodes[] =3D { + &cyberbook_t116_gpio_keys_node, + &cyberbook_t116_prog1_key_node, + &cyberbook_t116_prog2_key_node, + NULL }; =20 const struct x86_dev_info cyberbook_t116_info __initconst =3D { - .gpio_button =3D cyberbook_t116_buttons, - .gpio_button_count =3D ARRAY_SIZE(cyberbook_t116_buttons), + .gpio_button_swnodes =3D cyberbook_t116_buttons_swnodes, + .gpiochip_type =3D X86_GPIOCHIP_CHERRYVIEW, }; =20 #define CZC_EC_EXTRA_PORT 0x68 @@ -495,22 +515,32 @@ const struct x86_dev_info nextbook_ares8a_info __init= const =3D { * This button has a WMI interface, but that is broken. Instead of trying = to * use the broken WMI interface, instantiate a gpio-keys device for this. */ -static const struct x86_gpio_button peaq_c1010_button __initconst =3D { - .button =3D { - .code =3D KEY_SOUND, - .active_low =3D true, - .desc =3D "dolby_key", - .type =3D EV_KEY, - .wakeup =3D false, - .debounce_interval =3D 50, - }, - .chip =3D "INT33FC:00", - .pin =3D 3, +static const struct software_node peaq_c1010_gpio_keys_node =3D { + .name =3D "gpio_keys", +}; + +static const struct property_entry peaq_c1010_dolby_key_props[] =3D { + PROPERTY_ENTRY_U32("linux,code", KEY_SOUND), + PROPERTY_ENTRY_STRING("label", "dolby_key"), + PROPERTY_ENTRY_GPIO("gpios", &baytrail_gpiochip_nodes[0], 3, GPIO_ACTIVE_= LOW), + PROPERTY_ENTRY_U32("debounce-interval", 50), + { } +}; + +static const struct software_node peaq_c1010_dolby_key_node =3D { + .parent =3D &peaq_c1010_gpio_keys_node, + .properties =3D peaq_c1010_dolby_key_props, +}; + +static const struct software_node *peaq_c1010_button_swnodes[] =3D { + &peaq_c1010_gpio_keys_node, + &peaq_c1010_dolby_key_node, + NULL }; =20 const struct x86_dev_info peaq_c1010_info __initconst =3D { - .gpio_button =3D &peaq_c1010_button, - .gpio_button_count =3D 1, + .gpio_button_swnodes =3D peaq_c1010_button_swnodes, + .gpiochip_type =3D X86_GPIOCHIP_BAYTRAIL, }; =20 /* diff --git a/drivers/platform/x86/x86-android-tablets/x86-android-tablets.h= b/drivers/platform/x86/x86-android-tablets/x86-android-tablets.h index d037e3962a51..f4a67a9b74ea 100644 --- a/drivers/platform/x86/x86-android-tablets/x86-android-tablets.h +++ b/drivers/platform/x86/x86-android-tablets/x86-android-tablets.h @@ -11,7 +11,6 @@ #define __PDX86_X86_ANDROID_TABLETS_H =20 #include -#include #include #include #include @@ -81,12 +80,6 @@ struct x86_serdev_info { const char *serdev_hid; }; =20 -struct x86_gpio_button { - struct gpio_keys_button button; - const char *chip; - int pin; -}; - struct x86_dev_info { const char * const *modules; const struct software_node *bat_swnode; @@ -94,12 +87,11 @@ struct x86_dev_info { const struct x86_spi_dev_info *spi_dev_info; const struct platform_device_info *pdev_info; const struct x86_serdev_info *serdev_info; - const struct x86_gpio_button *gpio_button; + const struct software_node **gpio_button_swnodes; int i2c_client_count; int spi_dev_count; int pdev_count; int serdev_count; - int gpio_button_count; int (*init)(struct device *dev); void (*exit)(void); bool use_pci; --=20 2.51.0.rc0.155.g4a0f42376b-goog