From nobody Mon Feb 9 09:17:32 2026 Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) (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 40E0A21A92F; Tue, 6 Jan 2026 03:09:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=140.211.166.183 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767668997; cv=none; b=IZ21MbKK+dKp2zSVOLmU26LcUFE5ahtgN3qoBHOE+vP03jMU+iROqjDNiuLaFp8/GCsLqn9jNfqHlJJA2FzHizQXzPEHI+GqEPkUOhpwfksuU5Dbccl8mfH3tkAzADZqeiqr0qfVktHoVf4WAefx+vaGKXko+FEq218ZkOKzPqY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767668997; c=relaxed/simple; bh=dQLEa7ecvgpS7Ee7d4NqYI+6qr0ttpGStWj+q/XjdRI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GMZho/loRoxV6lHqQlNAjTZA0NakuVJ4RDchOsYB2GBR+55thRIcBHiqbeGcX0XzTAvzbcRwczp7yKcpb8gQ9Uuvk4Uhjb/7bIb1HXZSxkBN5Z39gttb4Tc03fRPRYzNUAsbwS5FQ0dwRfeV4reLu5daIT+gghSRzu1kCHY9zn0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gentoo.org; spf=pass smtp.mailfrom=gentoo.org; arc=none smtp.client-ip=140.211.166.183 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gentoo.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gentoo.org Received: from [127.0.0.1] (unknown [116.232.18.222]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: dlan) by smtp.gentoo.org (Postfix) with ESMTPSA id 4F85E340EDE; Tue, 06 Jan 2026 03:09:52 +0000 (UTC) From: Yixun Lan Date: Tue, 06 Jan 2026 11:09:32 +0800 Subject: [PATCH v3 1/2] dt-bindings: gpio: spacemit: add compatible name for K3 SoC 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: <20260106-02-k3-gpio-v3-1-4800c214810b@gentoo.org> References: <20260106-02-k3-gpio-v3-0-4800c214810b@gentoo.org> In-Reply-To: <20260106-02-k3-gpio-v3-0-4800c214810b@gentoo.org> To: Bartosz Golaszewski , Linus Walleij , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, Yixun Lan , Krzysztof Kozlowski X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=850; i=dlan@gentoo.org; h=from:subject:message-id; bh=dQLEa7ecvgpS7Ee7d4NqYI+6qr0ttpGStWj+q/XjdRI=; b=kA0DAAoBMarqR1lNu+0ByyZiAGlcfPWiy8NgN1lhlSPSdjwYwFCYtvfH/5DNrT2W/69OX8ofR YkCrwQAAQoAmRYhBLW6uMnDG3EVZwIj3DGq6kdZTbvtBQJpXHz1GxSAAAAAAAQADm1hbnUyLDIu NSsxLjExLDIsMl8UgAAAAAAuAChpc3N1ZXItZnByQG5vdGF0aW9ucy5vcGVucGdwLmZpZnRoaG9 yc2VtYW4ubmV0QjVCQUI4QzlDMzFCNzExNTY3MDIyM0RDMzFBQUVBNDc1OTREQkJFRAAKCRAxqu pHWU277RixD/9RsZ4ahmHy3L2ndFBEy1vVFcQAtmJGnq0gTXtHFrWPd65233Xe3XCsKJbnkHq/v fH6/xL9qxBqVfclJgdN1NNHYRX6lk2sIJ4U+e4ZUj4O7eeEmj98mLz/pYj6yhI8AjfZUtxf8a6H ydknlqYSc+HGBpackCa0wgkpy40N4KMf5nY/3RyoElzbmI4Rw9OfuuD9OENFWlyXd7kf5YC9jTl qwgdmCnIQMTCLNusDVqPNk8eeLpzAbYiXIJ+KCI2bv3dK+9nTDlkZsLLZhOvyG6/lDI4VmxIxs8 EcXHRc7is1kFXe2KvGkkucIBmtkRqFQ67xEORW07cMXn23GsCDJuKzm5CIOU4oWD0cWwp7tAXyl uA7jUBH2AqYwogH4BCeTZvilcsf4rAlpaD0QdX5t+Q9jFP9h7q0zmrDI5XdH9G2jr7Eg5BXfOYK SuEWbVjoZPxYjwY/a2iiUbaXI9e+RG1qNBOrQ/hAnU1BbxZCPY3vpJfzSWSP2iSrh2IyXh2njNE s+pqz9l6L429B4XnPy8GjlkMDXY2m0Wv/eQXFxQ+1eBu5X+yibGqd+EhfoqkYR4q0e9ZXiceQXy 0d7taRhVSErRAi0hJ/2EXKbiRH3KlU68LcVreCz2I5uD0I+z67triiyeFyVIsXSUEF28EYhZXJM E/HuANwew1L8Cz4zp+4Eg== X-Developer-Key: i=dlan@gentoo.org; a=openpgp; fpr=50B03A1A5CBCD33576EF8CD7920C0DBCAABEFD55 Add new compatible string for SpacemiT K3 SoC's GPIO controller. Acked-by: Krzysztof Kozlowski Signed-off-by: Yixun Lan --- Documentation/devicetree/bindings/gpio/spacemit,k1-gpio.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/gpio/spacemit,k1-gpio.yaml b= /Documentation/devicetree/bindings/gpio/spacemit,k1-gpio.yaml index 83e0b2d14c9f..24d22d95665f 100644 --- a/Documentation/devicetree/bindings/gpio/spacemit,k1-gpio.yaml +++ b/Documentation/devicetree/bindings/gpio/spacemit,k1-gpio.yaml @@ -19,7 +19,9 @@ properties: pattern: "^gpio@[0-9a-f]+$" =20 compatible: - const: spacemit,k1-gpio + enum: + - spacemit,k1-gpio + - spacemit,k3-gpio =20 reg: maxItems: 1 --=20 2.52.0 From nobody Mon Feb 9 09:17:32 2026 Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) (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 2825220A5E5; Tue, 6 Jan 2026 03:09:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=140.211.166.183 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767669003; cv=none; b=FuZE9a5Esy0g+E/fAFt5SXAY4msDPIRfa95vXRsBZrUYpwTCUkF2u7Zw2OJJeccD7v5InJVM1eCXUMROZRcRipCsO3zQY8fV+QZK6wrPKpypzIsZxLRhg7PWzV7QKj9Ifji2BuFqXe0oQhuTp3G8XW3ueyV/zxZ2vnqBQnVek0E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767669003; c=relaxed/simple; bh=0nb3jxQTRtcOKvtrQjjeKH+5pJa7gVxQM42DMiqMS04=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=caxZ+s+3n08Ustc1i2mFEn9AWXKQtbvjZamzcAQegmp5aobiNQNh69zRQ8p4jTqXM5umOR1Ob9xQ/qa6vG1lUns+1mQhU3tJP8T5momGbZeNHhe9Yc3gDOwepPS9ZL8OSu21iHbUNPEN/Beqg4RyQeTYPwnSiIGiQTfWEIboNws= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gentoo.org; spf=pass smtp.mailfrom=gentoo.org; arc=none smtp.client-ip=140.211.166.183 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gentoo.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gentoo.org Received: from [127.0.0.1] (unknown [116.232.18.222]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: dlan) by smtp.gentoo.org (Postfix) with ESMTPSA id 622093411D3; Tue, 06 Jan 2026 03:09:56 +0000 (UTC) From: Yixun Lan Date: Tue, 06 Jan 2026 11:09:33 +0800 Subject: [PATCH v3 2/2] gpio: spacemit: Add GPIO support for K3 SoC 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: <20260106-02-k3-gpio-v3-2-4800c214810b@gentoo.org> References: <20260106-02-k3-gpio-v3-0-4800c214810b@gentoo.org> In-Reply-To: <20260106-02-k3-gpio-v3-0-4800c214810b@gentoo.org> To: Bartosz Golaszewski , Linus Walleij , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, Yixun Lan X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=10786; i=dlan@gentoo.org; h=from:subject:message-id; bh=0nb3jxQTRtcOKvtrQjjeKH+5pJa7gVxQM42DMiqMS04=; b=owEB6QIW/ZANAwAKATGq6kdZTbvtAcsmYgBpXHz49OLs6pRoGXnCwpKrwyvxmvmWPq35QPXqz O9zo8bbdc6JAq8EAAEKAJkWIQS1urjJwxtxFWcCI9wxqupHWU277QUCaVx8+BsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDJfFIAAAAAALgAoaXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5 maWZ0aGhvcnNlbWFuLm5ldEI1QkFCOEM5QzMxQjcxMTU2NzAyMjNEQzMxQUFFQTQ3NTk0REJCRU QACgkQMarqR1lNu+0yaw/9GbHQlTeHeBWoCnKp6Q11VdBicEEaJpiIzBhGQ24a3NkVYt4llHc/K zY8Xw31FmeZBoYU+esCzXWA6LnutwN5mEJd31IqjZO2CUkmmiws7pbiITWkgFBMzhQEUVzKwoWR uzvbV9n+ky2nc9NupbXPtgPjr3yj6TPUxqOZC9DkNWwOuQeBohKbOvYiYAhYVxnf7lZVq2MVRgl +MmyJOhJPrc2Ca79k+P+1VvFtbTlzj15zi4HrG8DrUxnbVXQZx0WUo7/Bg5l1cUWIXSxw3HLxKC RrPHq3kxvh3MT2HDhGXEQ/izXVCu6K2pfHiVuDDjZaJSZMehHF/6a11nl78OzZuyWu+GoB4FfoT UrjS7DUnpDN1QyUi1cuHGLpLgnjxy7IUNx07t5Ppm9kKPKlK+M0pIubExuo3xiBHpt6sdBrSjv4 2zvpklpNzn3YhfqG6UFBbeeuTlpecp84fUncB28CsVvpZPJ7ZSXfrf/5sdYomYvgveY1xV3qEet zEbB9/8wLSyJz6tv39HbcIP2q+qlgocWUzs8AphCwhQTs+33KOEznAI5jO9nT+rWQDc5+TbxhYs e/t319dQ0GHzjIpn2j8AthleO7qhpKQm2QlQMuky3TRBv/7ZbAyPu2QzIA/+32VyAIBNaK15w3k PEAKbK4SCJzO8F5W+VA/igrAYWQt/E= X-Developer-Key: i=dlan@gentoo.org; a=openpgp; fpr=50B03A1A5CBCD33576EF8CD7920C0DBCAABEFD55 SpacemiT K3 SoC has changed gpio register layout while comparing with previous generation, the register offset and bank offset need to be adjusted, introduce a compatible data to extend the driver to support this. Signed-off-by: Yixun Lan --- drivers/gpio/gpio-spacemit-k1.c | 163 ++++++++++++++++++++++++++++--------= ---- 1 file changed, 117 insertions(+), 46 deletions(-) diff --git a/drivers/gpio/gpio-spacemit-k1.c b/drivers/gpio/gpio-spacemit-k= 1.c index eb66a15c002f..8f570a1a4894 100644 --- a/drivers/gpio/gpio-spacemit-k1.c +++ b/drivers/gpio/gpio-spacemit-k1.c @@ -15,29 +15,37 @@ #include #include =20 -/* register offset */ -#define SPACEMIT_GPLR 0x00 /* port level - R */ -#define SPACEMIT_GPDR 0x0c /* port direction - R/W */ -#define SPACEMIT_GPSR 0x18 /* port set - W */ -#define SPACEMIT_GPCR 0x24 /* port clear - W */ -#define SPACEMIT_GRER 0x30 /* port rising edge R/W */ -#define SPACEMIT_GFER 0x3c /* port falling edge R/W */ -#define SPACEMIT_GEDR 0x48 /* edge detect status - R/W1C */ -#define SPACEMIT_GSDR 0x54 /* (set) direction - W */ -#define SPACEMIT_GCDR 0x60 /* (clear) direction - W */ -#define SPACEMIT_GSRER 0x6c /* (set) rising edge detect enable - W */ -#define SPACEMIT_GCRER 0x78 /* (clear) rising edge detect enable - W */ -#define SPACEMIT_GSFER 0x84 /* (set) falling edge detect enable - W */ -#define SPACEMIT_GCFER 0x90 /* (clear) falling edge detect enable - W */ -#define SPACEMIT_GAPMASK 0x9c /* interrupt mask , 0 disable, 1 enable - R/= W */ - #define SPACEMIT_NR_BANKS 4 #define SPACEMIT_NR_GPIOS_PER_BANK 32 =20 #define to_spacemit_gpio_bank(x) container_of((x), struct spacemit_gpio_ba= nk, gc) +#define to_spacemit_gpio_regs(gb) ((gb)->sg->data->offsets) + +enum spacemit_gpio_registers { + SPACEMIT_GPLR, /* port level - R */ + SPACEMIT_GPDR, /* port direction - R/W */ + SPACEMIT_GPSR, /* port set - W */ + SPACEMIT_GPCR, /* port clear - W */ + SPACEMIT_GRER, /* port rising edge R/W */ + SPACEMIT_GFER, /* port falling edge R/W */ + SPACEMIT_GEDR, /* edge detect status - R/W1C */ + SPACEMIT_GSDR, /* (set) direction - W */ + SPACEMIT_GCDR, /* (clear) direction - W */ + SPACEMIT_GSRER, /* (set) rising edge detect enable - W */ + SPACEMIT_GCRER, /* (clear) rising edge detect enable - W */ + SPACEMIT_GSFER, /* (set) falling edge detect enable - W */ + SPACEMIT_GCFER, /* (clear) falling edge detect enable - W */ + SPACEMIT_GAPMASK, /* interrupt mask , 0 disable, 1 enable - R/W */ + SPACEMIT_GCPMASK, /* interrupt mask for K3 */ +}; =20 struct spacemit_gpio; =20 +struct spacemit_gpio_data { + const unsigned int *offsets; + u32 bank_offsets[SPACEMIT_NR_BANKS]; +}; + struct spacemit_gpio_bank { struct gpio_generic_chip chip; struct spacemit_gpio *sg; @@ -49,9 +57,22 @@ struct spacemit_gpio_bank { =20 struct spacemit_gpio { struct device *dev; + const struct spacemit_gpio_data *data; struct spacemit_gpio_bank sgb[SPACEMIT_NR_BANKS]; }; =20 +static u32 spacemit_gpio_read(struct spacemit_gpio_bank *gb, + enum spacemit_gpio_registers reg) +{ + return readl(gb->base + to_spacemit_gpio_regs(gb)[reg]); +} + +static void spacemit_gpio_write(struct spacemit_gpio_bank *gb, + enum spacemit_gpio_registers reg, u32 val) +{ + writel(val, gb->base + to_spacemit_gpio_regs(gb)[reg]); +} + static u32 spacemit_gpio_bank_index(struct spacemit_gpio_bank *gb) { return (u32)(gb - gb->sg->sgb); @@ -63,10 +84,10 @@ static irqreturn_t spacemit_gpio_irq_handler(int irq, v= oid *dev_id) unsigned long pending; u32 n, gedr; =20 - gedr =3D readl(gb->base + SPACEMIT_GEDR); + gedr =3D spacemit_gpio_read(gb, SPACEMIT_GEDR); if (!gedr) return IRQ_NONE; - writel(gedr, gb->base + SPACEMIT_GEDR); + spacemit_gpio_write(gb, SPACEMIT_GEDR, gedr); =20 pending =3D gedr & gb->irq_mask; if (!pending) @@ -82,7 +103,7 @@ static void spacemit_gpio_irq_ack(struct irq_data *d) { struct spacemit_gpio_bank *gb =3D irq_data_get_irq_chip_data(d); =20 - writel(BIT(irqd_to_hwirq(d)), gb->base + SPACEMIT_GEDR); + spacemit_gpio_write(gb, SPACEMIT_GEDR, BIT(irqd_to_hwirq(d))); } =20 static void spacemit_gpio_irq_mask(struct irq_data *d) @@ -91,13 +112,13 @@ static void spacemit_gpio_irq_mask(struct irq_data *d) u32 bit =3D BIT(irqd_to_hwirq(d)); =20 gb->irq_mask &=3D ~bit; - writel(gb->irq_mask, gb->base + SPACEMIT_GAPMASK); + spacemit_gpio_write(gb, SPACEMIT_GAPMASK, gb->irq_mask); =20 if (bit & gb->irq_rising_edge) - writel(bit, gb->base + SPACEMIT_GCRER); + spacemit_gpio_write(gb, SPACEMIT_GCRER, bit); =20 if (bit & gb->irq_falling_edge) - writel(bit, gb->base + SPACEMIT_GCFER); + spacemit_gpio_write(gb, SPACEMIT_GCFER, bit); } =20 static void spacemit_gpio_irq_unmask(struct irq_data *d) @@ -108,12 +129,12 @@ static void spacemit_gpio_irq_unmask(struct irq_data = *d) gb->irq_mask |=3D bit; =20 if (bit & gb->irq_rising_edge) - writel(bit, gb->base + SPACEMIT_GSRER); + spacemit_gpio_write(gb, SPACEMIT_GSRER, bit); =20 if (bit & gb->irq_falling_edge) - writel(bit, gb->base + SPACEMIT_GSFER); + spacemit_gpio_write(gb, SPACEMIT_GSFER, bit); =20 - writel(gb->irq_mask, gb->base + SPACEMIT_GAPMASK); + spacemit_gpio_write(gb, SPACEMIT_GAPMASK, gb->irq_mask); } =20 static int spacemit_gpio_irq_set_type(struct irq_data *d, unsigned int typ= e) @@ -123,18 +144,18 @@ static int spacemit_gpio_irq_set_type(struct irq_data= *d, unsigned int type) =20 if (type & IRQ_TYPE_EDGE_RISING) { gb->irq_rising_edge |=3D bit; - writel(bit, gb->base + SPACEMIT_GSRER); + spacemit_gpio_write(gb, SPACEMIT_GSRER, bit); } else { gb->irq_rising_edge &=3D ~bit; - writel(bit, gb->base + SPACEMIT_GCRER); + spacemit_gpio_write(gb, SPACEMIT_GCRER, bit); } =20 if (type & IRQ_TYPE_EDGE_FALLING) { gb->irq_falling_edge |=3D bit; - writel(bit, gb->base + SPACEMIT_GSFER); + spacemit_gpio_write(gb, SPACEMIT_GSFER, bit); } else { gb->irq_falling_edge &=3D ~bit; - writel(bit, gb->base + SPACEMIT_GCFER); + spacemit_gpio_write(gb, SPACEMIT_GCFER, bit); } =20 return 0; @@ -179,15 +200,16 @@ static int spacemit_gpio_add_bank(struct spacemit_gpi= o *sg, struct device *dev =3D sg->dev; struct gpio_irq_chip *girq; void __iomem *dat, *set, *clr, *dirin, *dirout; - int ret, bank_base[] =3D { 0x0, 0x4, 0x8, 0x100 }; + int ret; =20 - gb->base =3D regs + bank_base[index]; + gb->base =3D regs + sg->data->bank_offsets[index]; + gb->sg =3D sg; =20 - dat =3D gb->base + SPACEMIT_GPLR; - set =3D gb->base + SPACEMIT_GPSR; - clr =3D gb->base + SPACEMIT_GPCR; - dirin =3D gb->base + SPACEMIT_GCDR; - dirout =3D gb->base + SPACEMIT_GSDR; + dat =3D gb->base + to_spacemit_gpio_regs(gb)[SPACEMIT_GPLR]; + set =3D gb->base + to_spacemit_gpio_regs(gb)[SPACEMIT_GPSR]; + clr =3D gb->base + to_spacemit_gpio_regs(gb)[SPACEMIT_GPCR]; + dirin =3D gb->base + to_spacemit_gpio_regs(gb)[SPACEMIT_GCDR]; + dirout =3D gb->base + to_spacemit_gpio_regs(gb)[SPACEMIT_GSDR]; =20 config =3D (struct gpio_generic_chip_config) { .dev =3D dev, @@ -206,8 +228,6 @@ static int spacemit_gpio_add_bank(struct spacemit_gpio = *sg, if (ret) return dev_err_probe(dev, ret, "failed to init gpio chip\n"); =20 - gb->sg =3D sg; - gc->label =3D dev_name(dev); gc->request =3D gpiochip_generic_request; gc->free =3D gpiochip_generic_free; @@ -223,13 +243,13 @@ static int spacemit_gpio_add_bank(struct spacemit_gpi= o *sg, gpio_irq_chip_set_chip(girq, &spacemit_gpio_chip); =20 /* Disable Interrupt */ - writel(0, gb->base + SPACEMIT_GAPMASK); + spacemit_gpio_write(gb, SPACEMIT_GAPMASK, 0); /* Disable Edge Detection Settings */ - writel(0x0, gb->base + SPACEMIT_GRER); - writel(0x0, gb->base + SPACEMIT_GFER); + spacemit_gpio_write(gb, SPACEMIT_GRER, 0x0); + spacemit_gpio_write(gb, SPACEMIT_GFER, 0x0); /* Clear Interrupt */ - writel(0xffffffff, gb->base + SPACEMIT_GCRER); - writel(0xffffffff, gb->base + SPACEMIT_GCFER); + spacemit_gpio_write(gb, SPACEMIT_GCRER, 0xffffffff); + spacemit_gpio_write(gb, SPACEMIT_GCFER, 0xffffffff); =20 ret =3D devm_request_threaded_irq(dev, irq, NULL, spacemit_gpio_irq_handler, @@ -260,6 +280,10 @@ static int spacemit_gpio_probe(struct platform_device = *pdev) if (!sg) return -ENOMEM; =20 + sg->data =3D of_device_get_match_data(dev); + if (!sg->data) + return dev_err_probe(dev, -EINVAL, "No available compatible data."); + regs =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(regs)) return PTR_ERR(regs); @@ -287,8 +311,55 @@ static int spacemit_gpio_probe(struct platform_device = *pdev) return 0; } =20 +static const unsigned int spacemit_gpio_k1_offsets[] =3D { + [SPACEMIT_GPLR] =3D 0x00, + [SPACEMIT_GPDR] =3D 0x0c, + [SPACEMIT_GPSR] =3D 0x18, + [SPACEMIT_GPCR] =3D 0x24, + [SPACEMIT_GRER] =3D 0x30, + [SPACEMIT_GFER] =3D 0x3c, + [SPACEMIT_GEDR] =3D 0x48, + [SPACEMIT_GSDR] =3D 0x54, + [SPACEMIT_GCDR] =3D 0x60, + [SPACEMIT_GSRER] =3D 0x6c, + [SPACEMIT_GCRER] =3D 0x78, + [SPACEMIT_GSFER] =3D 0x84, + [SPACEMIT_GCFER] =3D 0x90, + [SPACEMIT_GAPMASK] =3D 0x9c, + [SPACEMIT_GCPMASK] =3D 0xA8, +}; + +static const unsigned int spacemit_gpio_k3_offsets[] =3D { + [SPACEMIT_GPLR] =3D 0x0, + [SPACEMIT_GPDR] =3D 0x4, + [SPACEMIT_GPSR] =3D 0x8, + [SPACEMIT_GPCR] =3D 0xc, + [SPACEMIT_GRER] =3D 0x10, + [SPACEMIT_GFER] =3D 0x14, + [SPACEMIT_GEDR] =3D 0x18, + [SPACEMIT_GSDR] =3D 0x1c, + [SPACEMIT_GCDR] =3D 0x20, + [SPACEMIT_GSRER] =3D 0x24, + [SPACEMIT_GCRER] =3D 0x28, + [SPACEMIT_GSFER] =3D 0x2c, + [SPACEMIT_GCFER] =3D 0x30, + [SPACEMIT_GAPMASK] =3D 0x34, + [SPACEMIT_GCPMASK] =3D 0x38, +}; + +static const struct spacemit_gpio_data k1_gpio_data =3D { + .offsets =3D spacemit_gpio_k1_offsets, + .bank_offsets =3D { 0x0, 0x4, 0x8, 0x100 }, +}; + +static const struct spacemit_gpio_data k3_gpio_data =3D { + .offsets =3D spacemit_gpio_k3_offsets, + .bank_offsets =3D { 0x0, 0x40, 0x80, 0x100 }, +}; + static const struct of_device_id spacemit_gpio_dt_ids[] =3D { - { .compatible =3D "spacemit,k1-gpio" }, + { .compatible =3D "spacemit,k1-gpio", .data =3D &k1_gpio_data }, + { .compatible =3D "spacemit,k3-gpio", .data =3D &k3_gpio_data }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, spacemit_gpio_dt_ids); @@ -296,12 +367,12 @@ MODULE_DEVICE_TABLE(of, spacemit_gpio_dt_ids); static struct platform_driver spacemit_gpio_driver =3D { .probe =3D spacemit_gpio_probe, .driver =3D { - .name =3D "k1-gpio", + .name =3D "spacemit-gpio", .of_match_table =3D spacemit_gpio_dt_ids, }, }; module_platform_driver(spacemit_gpio_driver); =20 MODULE_AUTHOR("Yixun Lan "); -MODULE_DESCRIPTION("GPIO driver for SpacemiT K1 SoC"); +MODULE_DESCRIPTION("GPIO driver for SpacemiT K1/K3 SoC"); MODULE_LICENSE("GPL"); --=20 2.52.0