From nobody Wed Apr 1 23:46:38 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D926237F72C for ; Wed, 1 Apr 2026 07:27:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775028454; cv=none; b=qVVLoc5OILA4lCi4PUN9McQmth9lFSqDJzuy6rA6Fysxqkri0bkHelP0JhKwXK6d/K0SmQGtt+MyxrmBTMS8g+pdLsyXoxQsOfoMQKi4+0qMBveheOS+69errZ86fK01/LapzKxk4A/qJdBgJtDIzThBS3r7o1gxrhszWrjdJ9A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775028454; c=relaxed/simple; bh=6Pv5TDECwfzFeKPInl1W6rcgS2uPfThpvtka1MoOwas=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ADdKxYpKKbDS7qFwoRJOhXrtoppmUbnGrZFtTAvVvsUsvl7lLBn5A9+7zz0i/T1yXJzpgd1573xcQkcHbE4x9B96VY5+/xBFBb5pNFNHWvjI2CQJTHGA8aTtr2eYJdvqHoBfcCZtwfTHS1jCfHNN6dko8cK5q/ES2ab1NukmU0c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=KvCrlkrc; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=ehf5B0jN; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="KvCrlkrc"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ehf5B0jN" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6317Eqsu4106747 for ; Wed, 1 Apr 2026 07:27:29 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 0nT0xhiRxixrMOQFGawtvOLvgX7LjDibto0r1qGl+gQ=; b=KvCrlkrcVDw2aaD8 QDx3zd2DCd2OPvj3bnas+YL5zEmKqHN9gt+XaONOmPANW6xgvFG6R0ocLIjzo2/D iA6caAcplbhaV1OKjSoZblNv3bZlQJLjrLnXhAnjxqdiKNEMu474wFYTlydiEXL0 fWp3SZ/6rKmacovo91KvYPn+JTuVmmwr6wwpj358QX1rYa8egqMv/Ho4bnr3wRQq CgieBM3k8eTmBU344S47z53OOtgByFbxmuicpLpv6Sb31VqUn9UhM130r2Slqex4 fpIWOvILKhoBLN9KN7uLwTVrvyI/DF5b3zIB9Veqhl3gxVFpsXPyLpFdEjw+TCEz 1KSrlg== Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4d8xt901t3-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 01 Apr 2026 07:27:29 +0000 (GMT) Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-50b44f7b7bbso209065411cf.3 for ; Wed, 01 Apr 2026 00:27:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1775028448; x=1775633248; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=0nT0xhiRxixrMOQFGawtvOLvgX7LjDibto0r1qGl+gQ=; b=ehf5B0jNA+868slP3QsU92QfQNjGYghSJ91HXD7KHACpm10iIFKucByNauFyouoxzm qWvnuA6MIBfCercptgqfcnOtCtrQ8c4duahAacwRPeWukg+gAE8A1y4ygni8PRqyAVk8 fKupo1fhmgGM6MldUEYRaaSvBLZr1QACtu96005h9rjoSykgOfjAiVePCOIqmwdfykXg GuS/Ydb/6ax6voykiLWXLa2afRdrLunDzADsRMM2FuFuyUJ8yEUY5bw+hDDHBLQ5USLS UZoNtT/am2+HViUMvMgwRJxB2ZnjPTKW6f7HKphkcb5SxtMtqcMlo6Z/DzjQyhGPKsj5 jV5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775028448; x=1775633248; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=0nT0xhiRxixrMOQFGawtvOLvgX7LjDibto0r1qGl+gQ=; b=TIZiYtd5iBDKJqDEPyVYhYa0qGI0HO4v2cv5sw7zYpFlthKOiAbYHIsvd98kbNXox/ Xg6Z3ttgsA/9VPNZCAQCu4U0EQoLnyR6my4IwlbgxtUjFRDs57ObYOaPAc3bXHC2vl8T fEy0YCI7Z7OoCnZdoAPadyrJHBwew8+Pn6cN3ph0WuafHcsnkNAK52h/hpq0tLehx8Aq +R2q12WOfLSmyRSHOB9xGig8daEuzrkdYvuaSa2cfAVlIEeFryGw6D1b0B2Ej6mUJsEo kV0YInXkYbrbso3cDBV276uUEbLILgk/OkhHaVJtFtOhM2yoNBPKy2Np/ATG2l5tE8fY HEgQ== X-Forwarded-Encrypted: i=1; AJvYcCWhki9F7HjFcliMv1enFUZ6+JTdlQqCNzc6Bvse3fE2dSsTbJHTt+Swe/OfQGPGqKOExE09yQxpzX7rU1Q=@vger.kernel.org X-Gm-Message-State: AOJu0Yxy3nFiN+m91GIiP7NGgS8eLFB1+8aLVM8juseYoz93zpOYeQKj jMbWhc6JWgEnasQMhHLwyanfiVNJKZdzBO+HbLKpGpetB3R9I/DLtj+2s8/eMcU3iy0H2yox0pT rtpxtqLa1amu4Lr3DrdmbO2q9qbD4O8rYIBPC2+Hw/OOo7KqaaznbopXIh8CQzPl+Adg= X-Gm-Gg: ATEYQzzAv4I1e8yYyfEuEcxQSvFqKOA/f7zP3vkzxl1uLSfRJ5QIKppEKY+mUJAfzvD U//L+KqHjBO7yMlm+KrVopIEaJNSAU2tbVM/PBlQRS6OtiGemVszVlBDnQ+Hlwj/1JOgTAg/fVq F/VbbNfkJUHqvQowMvsNEUpRYqg8lPb1BBOgmHaHkDszv7gusfl5G/MlXeu/L4j1b3nazD6WRrT +pFUUYwz0XkfsaiVATWS0WE07RX7XjMCtKsO/Hw6Op6LduKasB4kKPcWyVZ2dzOs5J1U6EX4OKn pXhFGBZAz1U7Bo47AbVl3dl77KD1W6RPCLKcX3nnMTDRySv+sOd17VY+QguIrhub3KtVS0GosUr q5PA4PFrLM9OEYrzq4EJ4AJUaX+le/qDtpFGK7bOskGSkNfzCPX45VVYT/xc/bmsAqywyEJGM13 Rl244RWGhEmL5an6NK/QH3ImajnWE4pgdBGCE= X-Received: by 2002:a05:622a:1993:b0:50b:36e4:a614 with SMTP id d75a77b69052e-50d3bb63fd8mr34301111cf.6.1775028448192; Wed, 01 Apr 2026 00:27:28 -0700 (PDT) X-Received: by 2002:a05:622a:1993:b0:50b:36e4:a614 with SMTP id d75a77b69052e-50d3bb63fd8mr34300781cf.6.1775028447739; Wed, 01 Apr 2026 00:27:27 -0700 (PDT) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-38cb9f31972sm8638421fa.12.2026.04.01.00.27.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 00:27:26 -0700 (PDT) From: Dmitry Baryshkov Date: Wed, 01 Apr 2026 10:26:38 +0300 Subject: [PATCH 19/19] gpio: add GPIO controller found on Waveshare DSI TOUCH panels 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" Content-Transfer-Encoding: quoted-printable Message-Id: <20260401-waveshare-dsi-touch-v1-19-5e9119b5a014@oss.qualcomm.com> References: <20260401-waveshare-dsi-touch-v1-0-5e9119b5a014@oss.qualcomm.com> In-Reply-To: <20260401-waveshare-dsi-touch-v1-0-5e9119b5a014@oss.qualcomm.com> To: Neil Armstrong , Jessica Zhang , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Cong Yang , Ondrej Jirman , Javier Martinez Canillas , Jagan Teki , Liam Girdwood , Mark Brown , Linus Walleij , Bartosz Golaszewski Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org X-Mailer: b4 0.15.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=8004; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=6Pv5TDECwfzFeKPInl1W6rcgS2uPfThpvtka1MoOwas=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpzMiuUWpWPOeZGuuLLQ40KhL8JtSf4hH3mDIgE y/HN7rptMSJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaczIrgAKCRCLPIo+Aiko 1cKpCACvZf2ujh7YMIYrGs/cEO+QwEsJheddWO6TLJ3bW42C8nSqwHx7I4QyizX8OzMR4rBnZ91 /3+OT/K96HNADPq8UfYTJCBB0h0a4E2jzlIejdr5Rck+6CJL+YyvRWAlN7w3ey9g0D0ZM9qUo3N wYRlf1zJ96xd528nKbOVKqkPx6h39iyHLHaEGtc9LWUYSHQLnZLAxmgpEzouFhh5XCRiLCA34Q7 yGtp20m3pWr7dG85li6LLz9HqRFDAqkGLxOM7YJ2aQVL7E/kGHTRsqBRPhIzg/TIDPn2lQTm/La sedQQFhHqenjviF59OiDVv5zRU+oTyCVG+0Hh7FGHQfe2Mb3 X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: yA254ZZdh_yoyjyJyueBk9e1IxilGEzr X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDAxMDA2NCBTYWx0ZWRfXxKqV0dPGtrXl sHa/vvu3ZMgzerS9fE37jXxtm/7O6YG3fCk8OPjKUtSRC7lEjzdRhlqBPTm9ZLq/sSqWqvkLFh7 P+ROocMYcboG74QBXNFGO8YBtqPHuXMVQGH/VusKXYZ99ncvohpH5xTa6vhvH0j8d5lfOUAXfxc 8/1AJIejeJ7L/Z8orNWfONHUYZ489EL88E/f655VhOGSRiZ1yZ638PbkcTbDYpyDE0U0WQgnnV8 8zwUgMeZVouFJmgokUsa0xfdP+3F/WnOa2TnNvYM38Utt3QMsyCnpaGz9b4DaHf4VL0O8iCY3+u bKB0iYBKy/TTnMZ/7WDcWjnwbOjAAukuNrUVoiEQ5KXgwOa3BE2wxbNAHimx5g2ujCYw572EVa2 196qVSzlJJd9uJ7ZzKPBAAhg6FUbIWDAboKZGYM2SZBW3Xv8/qqXoG2PUfEcZFoImNO5gK3avWE 9qlBlP/U5/UXdtfD0QA== X-Proofpoint-ORIG-GUID: yA254ZZdh_yoyjyJyueBk9e1IxilGEzr X-Authority-Analysis: v=2.4 cv=PoGergM3 c=1 sm=1 tr=0 ts=69ccc8e1 cx=c_pps a=EVbN6Ke/fEF3bsl7X48z0g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=EUspDBNiAAAA:8 a=BBJQNc9AFPM2Ar9AcygA:9 a=QEXdDO2ut3YA:10 a=a_PwQJl-kcHnX1M80qC6:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-01_02,2026-04-01_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 spamscore=0 suspectscore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 malwarescore=0 clxscore=1015 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2604010064 The Waveshare DSI TOUCH family of panels has separate on-board GPIO controller, which controls power supplies to the panel and the touch screen and provides reset pins for both the panel and the touchscreen. Also it provides a simple PWM controller for panel backlight. Add support for this GPIO controller. Signed-off-by: Dmitry Baryshkov --- drivers/gpio/Kconfig | 10 ++ drivers/gpio/Makefile | 1 + drivers/gpio/gpio-waveshare-dsi.c | 220 ++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 231 insertions(+) diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 4c3f6ec336c1..f0bb5cdebf9b 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -804,6 +804,16 @@ config GPIO_VISCONTI help Say yes here to support GPIO on Tohisba Visconti. =20 +config GPIO_WAVESHARE_DSI_TOUCH + tristate "Waveshare GPIO controller for DSI panels" + depends on BACKLIGHT_CLASS_DEVICE + depends on I2C + select REGMAP_I2C + help + Enable support for the GPIO and PWM controller found on Waveshare DSI + TOUCH panel kits. It provides GPIOs (used for regulator control and + resets) and backlight support. + config GPIO_WCD934X tristate "Qualcomm Technologies Inc WCD9340/WCD9341 GPIO controller drive= r" depends on MFD_WCD934X diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 20d4a57afdaa..75ce89fc3b93 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -207,6 +207,7 @@ obj-$(CONFIG_GPIO_VIRTUSER) +=3D gpio-virtuser.o obj-$(CONFIG_GPIO_VIRTIO) +=3D gpio-virtio.o obj-$(CONFIG_GPIO_VISCONTI) +=3D gpio-visconti.o obj-$(CONFIG_GPIO_VX855) +=3D gpio-vx855.o +obj-$(CONFIG_GPIO_WAVESHARE_DSI_TOUCH) +=3D gpio-waveshare-dsi.o obj-$(CONFIG_GPIO_WCD934X) +=3D gpio-wcd934x.o obj-$(CONFIG_GPIO_WHISKEY_COVE) +=3D gpio-wcove.o obj-$(CONFIG_GPIO_WINBOND) +=3D gpio-winbond.o diff --git a/drivers/gpio/gpio-waveshare-dsi.c b/drivers/gpio/gpio-waveshar= e-dsi.c new file mode 100644 index 000000000000..30fe7569c150 --- /dev/null +++ b/drivers/gpio/gpio-waveshare-dsi.c @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2024 Waveshare International Limited + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include +#include +#include +#include +#include +#include +#include + +/* I2C registers of the microcontroller. */ +#define REG_TP 0x94 +#define REG_LCD 0x95 +#define REG_PWM 0x96 +#define REG_SIZE 0x97 +#define REG_ID 0x98 +#define REG_VERSION 0x99 + +enum { + GPIO_AVDD =3D 0, + GPIO_PANEL_RESET =3D 1, + GPIO_BL_ENABLE =3D 2, + GPIO_IOVCC =3D 4, + GPIO_VCC =3D 8, + GPIO_TS_RESET =3D 9, + NUM_GPIO =3D 16, +}; + +struct waveshare_gpio { + struct mutex dir_lock; + struct mutex pwr_lock; + struct regmap *regmap; + u16 poweron_state; + + struct gpio_chip gc; +}; + +static const struct regmap_config waveshare_gpio_regmap_config =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .max_register =3D REG_PWM, +}; + +static int waveshare_gpio_get(struct waveshare_gpio *state, unsigned int o= ffset) +{ + u16 pwr_state; + + mutex_lock(&state->pwr_lock); + pwr_state =3D state->poweron_state & BIT(offset); + mutex_unlock(&state->pwr_lock); + + return !!pwr_state; +} + +static int waveshare_gpio_set(struct waveshare_gpio *state, unsigned int o= ffset, int value) +{ + u16 last_val; + + mutex_lock(&state->pwr_lock); + + last_val =3D state->poweron_state; + if (value) + last_val |=3D BIT(offset); + else + last_val &=3D ~BIT(offset); + + state->poweron_state =3D last_val; + + regmap_write(state->regmap, REG_TP, last_val >> 8); + regmap_write(state->regmap, REG_LCD, last_val & 0xff); + + mutex_unlock(&state->pwr_lock); + + return 0; +} + +static int waveshare_gpio_gpio_get_direction(struct gpio_chip *gc, unsigne= d int offset) +{ + return GPIO_LINE_DIRECTION_OUT; +} + +static int waveshare_gpio_gpio_get(struct gpio_chip *gc, unsigned int offs= et) +{ + struct waveshare_gpio *state =3D gpiochip_get_data(gc); + + return waveshare_gpio_get(state, offset); +} + +static int waveshare_gpio_gpio_set(struct gpio_chip *gc, unsigned int offs= et, int value) +{ + struct waveshare_gpio *state =3D gpiochip_get_data(gc); + + return waveshare_gpio_set(state, offset, value); +} + +static int waveshare_gpio_update_status(struct backlight_device *bl) +{ + struct waveshare_gpio *state =3D bl_get_data(bl); + int brightness =3D backlight_get_brightness(bl); + + waveshare_gpio_set(state, GPIO_BL_ENABLE, brightness); + + return regmap_write(state->regmap, REG_PWM, brightness); +} + +static const struct backlight_ops waveshare_gpio_bl =3D { + .update_status =3D waveshare_gpio_update_status, +}; + +static int waveshare_gpio_i2c_read(struct i2c_client *client, u8 reg, unsi= gned int *buf) +{ + int val; + + val =3D i2c_smbus_read_byte_data(client, reg); + if (val < 0) + return val; + + *buf =3D val; + + return 0; +} + +static int waveshare_gpio_probe(struct i2c_client *i2c) +{ + struct backlight_properties props =3D {}; + struct waveshare_gpio *state; + struct device *dev =3D &i2c->dev; + struct backlight_device *bl; + struct regmap *regmap; + unsigned int data; + int ret; + + state =3D devm_kzalloc(dev, sizeof(*state), GFP_KERNEL); + if (!state) + return -ENOMEM; + + ret =3D devm_mutex_init(dev, &state->dir_lock); + if (ret) + return ret; + + ret =3D devm_mutex_init(dev, &state->pwr_lock); + if (ret) + return ret; + + i2c_set_clientdata(i2c, state); + + regmap =3D devm_regmap_init_i2c(i2c, &waveshare_gpio_regmap_config); + if (IS_ERR(regmap)) + return dev_err_probe(dev, PTR_ERR(regmap), "Failed to allocate register = map\n"); + + ret =3D waveshare_gpio_i2c_read(i2c, REG_ID, &data); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to read register\n"); + + dev_dbg(dev, "waveshare panel hw id =3D 0x%x\n", data); + + ret =3D waveshare_gpio_i2c_read(i2c, REG_SIZE, &data); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to read register\n"); + + dev_dbg(dev, "waveshare panel size =3D %d\n", data); + + ret =3D waveshare_gpio_i2c_read(i2c, REG_VERSION, &data); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to read register\n"); + + dev_dbg(dev, "waveshare panel mcu version =3D 0x%x\n", data); + + state->poweron_state =3D BIT(GPIO_TS_RESET); + regmap_write(regmap, REG_TP, state->poweron_state >> 8); + regmap_write(regmap, REG_LCD, state->poweron_state & 0xff); + msleep(20); + + state->regmap =3D regmap; + state->gc.parent =3D dev; + state->gc.label =3D i2c->name; + state->gc.owner =3D THIS_MODULE; + state->gc.base =3D -1; + state->gc.ngpio =3D NUM_GPIO; + + /* it is output only */ + state->gc.get =3D waveshare_gpio_gpio_get; + state->gc.set =3D waveshare_gpio_gpio_set; + state->gc.get_direction =3D waveshare_gpio_gpio_get_direction; + state->gc.can_sleep =3D true; + + ret =3D devm_gpiochip_add_data(dev, &state->gc, state); + if (ret) + return dev_err_probe(dev, ret, "Failed to create gpiochip\n"); + + props.type =3D BACKLIGHT_RAW; + props.max_brightness =3D 255; + props.brightness =3D 255; + bl =3D devm_backlight_device_register(dev, dev_name(dev), dev, state, + &waveshare_gpio_bl, &props); + return PTR_ERR_OR_ZERO(bl); +} + +static const struct of_device_id waveshare_gpio_dt_ids[] =3D { + { .compatible =3D "waveshare,dsi-touch-gpio" }, + {}, +}; +MODULE_DEVICE_TABLE(of, waveshare_gpio_dt_ids); + +static struct i2c_driver waveshare_gpio_regulator_driver =3D { + .driver =3D { + .name =3D "waveshare-regulator", + .of_match_table =3D of_match_ptr(waveshare_gpio_dt_ids), + }, + .probe =3D waveshare_gpio_probe, +}; + +module_i2c_driver(waveshare_gpio_regulator_driver); + +MODULE_DESCRIPTION("GPIO controller driver for Waveshare DSI touch panels"= ); +MODULE_LICENSE("GPL"); --=20 2.47.3