* [PATCH v6 1/4] dt-bindings: serial: 8250: deprecate aspeed,sirq-polarity-sense
2021-04-12 3:47 [PATCH v6 0/4] serial: 8250_aspeed_vuart: generalized DT properties Zev Weiss
@ 2021-04-12 3:47 ` Zev Weiss
2021-04-12 3:47 ` [PATCH v6 2/4] serial: 8250_aspeed_vuart: refactor sirq and lpc address setting code Zev Weiss
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Zev Weiss @ 2021-04-12 3:47 UTC (permalink / raw)
To: Joel Stanley
Cc: openbmc, linux-arm-kernel, linux-aspeed, linux-kernel,
Andrew Jeffery, Zev Weiss, Rob Herring, Greg Kroah-Hartman,
Rob Herring, Lubomir Rintel, -,
linux-serial
This property ties SIRQ polarity to SCU register bits that don't
necessarily have any direct relationship to it; the only use of it was
removed in commit c82bf6e133d3 ("ARM: aspeed: g5: Do not set sirq
polarity").
Signed-off-by: Zev Weiss <zev@bewilderbeest.net>
Reviewed-by: Joel Stanley <joel@jms.id.au>
Acked-by: Rob Herring <robh@kernel.org>
---
Documentation/devicetree/bindings/serial/8250.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/serial/8250.yaml b/Documentation/devicetree/bindings/serial/8250.yaml
index f54cae9ff7b2..491b9297432d 100644
--- a/Documentation/devicetree/bindings/serial/8250.yaml
+++ b/Documentation/devicetree/bindings/serial/8250.yaml
@@ -188,6 +188,7 @@ properties:
offset and bit number to identify how the SIRQ polarity should be
configured. One possible data source is the LPC/eSPI mode bit. Only
applicable to aspeed,ast2500-vuart.
+ deprecated: true
required:
- reg
--
2.31.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v6 2/4] serial: 8250_aspeed_vuart: refactor sirq and lpc address setting code
2021-04-12 3:47 [PATCH v6 0/4] serial: 8250_aspeed_vuart: generalized DT properties Zev Weiss
2021-04-12 3:47 ` [PATCH v6 1/4] dt-bindings: serial: 8250: deprecate aspeed,sirq-polarity-sense Zev Weiss
@ 2021-04-12 3:47 ` Zev Weiss
2021-04-12 3:47 ` [PATCH v6 3/4] serial: 8250_aspeed_vuart: add aspeed,lpc-io-reg and aspeed,lpc-interrupts DT properties Zev Weiss
2021-04-12 3:47 ` [PATCH v6 4/4] dt-bindings: serial: 8250: add aspeed,lpc-io-reg and aspeed,lpc-interrupts Zev Weiss
3 siblings, 0 replies; 7+ messages in thread
From: Zev Weiss @ 2021-04-12 3:47 UTC (permalink / raw)
To: Joel Stanley
Cc: openbmc, linux-arm-kernel, linux-aspeed, linux-kernel,
Andrew Jeffery, Zev Weiss, Greg Kroah-Hartman, Jiri Slaby,
linux-serial
This splits dedicated aspeed_vuart_set_{sirq,lpc_address}() functions
out of the sysfs store functions in preparation for adding DT
properties that will be poking the same registers. While we're at it,
these functions now provide some basic bounds-checking on their
arguments.
Signed-off-by: Zev Weiss <zev@bewilderbeest.net>
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
---
drivers/tty/serial/8250/8250_aspeed_vuart.c | 51 ++++++++++++++-------
1 file changed, 35 insertions(+), 16 deletions(-)
diff --git a/drivers/tty/serial/8250/8250_aspeed_vuart.c b/drivers/tty/serial/8250/8250_aspeed_vuart.c
index c33e02cbde93..8433f8dbb186 100644
--- a/drivers/tty/serial/8250/8250_aspeed_vuart.c
+++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c
@@ -72,22 +72,31 @@ static ssize_t lpc_address_show(struct device *dev,
return snprintf(buf, PAGE_SIZE - 1, "0x%x\n", addr);
}
+static int aspeed_vuart_set_lpc_address(struct aspeed_vuart *vuart, u32 addr)
+{
+ if (addr > U16_MAX)
+ return -EINVAL;
+
+ writeb(addr >> 8, vuart->regs + ASPEED_VUART_ADDRH);
+ writeb(addr >> 0, vuart->regs + ASPEED_VUART_ADDRL);
+
+ return 0;
+}
+
static ssize_t lpc_address_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct aspeed_vuart *vuart = dev_get_drvdata(dev);
- unsigned long val;
+ u32 val;
int err;
- err = kstrtoul(buf, 0, &val);
+ err = kstrtou32(buf, 0, &val);
if (err)
return err;
- writeb(val >> 8, vuart->regs + ASPEED_VUART_ADDRH);
- writeb(val >> 0, vuart->regs + ASPEED_VUART_ADDRL);
-
- return count;
+ err = aspeed_vuart_set_lpc_address(vuart, val);
+ return err ? : count;
}
static DEVICE_ATTR_RW(lpc_address);
@@ -105,27 +114,37 @@ static ssize_t sirq_show(struct device *dev,
return snprintf(buf, PAGE_SIZE - 1, "%u\n", reg);
}
+static int aspeed_vuart_set_sirq(struct aspeed_vuart *vuart, u32 sirq)
+{
+ u8 reg;
+
+ if (sirq > (ASPEED_VUART_GCRB_HOST_SIRQ_MASK >> ASPEED_VUART_GCRB_HOST_SIRQ_SHIFT))
+ return -EINVAL;
+
+ sirq <<= ASPEED_VUART_GCRB_HOST_SIRQ_SHIFT;
+ sirq &= ASPEED_VUART_GCRB_HOST_SIRQ_MASK;
+
+ reg = readb(vuart->regs + ASPEED_VUART_GCRB);
+ reg &= ~ASPEED_VUART_GCRB_HOST_SIRQ_MASK;
+ reg |= sirq;
+ writeb(reg, vuart->regs + ASPEED_VUART_GCRB);
+
+ return 0;
+}
+
static ssize_t sirq_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
struct aspeed_vuart *vuart = dev_get_drvdata(dev);
unsigned long val;
int err;
- u8 reg;
err = kstrtoul(buf, 0, &val);
if (err)
return err;
- val <<= ASPEED_VUART_GCRB_HOST_SIRQ_SHIFT;
- val &= ASPEED_VUART_GCRB_HOST_SIRQ_MASK;
-
- reg = readb(vuart->regs + ASPEED_VUART_GCRB);
- reg &= ~ASPEED_VUART_GCRB_HOST_SIRQ_MASK;
- reg |= val;
- writeb(reg, vuart->regs + ASPEED_VUART_GCRB);
-
- return count;
+ err = aspeed_vuart_set_sirq(vuart, val);
+ return err ? : count;
}
static DEVICE_ATTR_RW(sirq);
--
2.31.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v6 3/4] serial: 8250_aspeed_vuart: add aspeed,lpc-io-reg and aspeed,lpc-interrupts DT properties
2021-04-12 3:47 [PATCH v6 0/4] serial: 8250_aspeed_vuart: generalized DT properties Zev Weiss
2021-04-12 3:47 ` [PATCH v6 1/4] dt-bindings: serial: 8250: deprecate aspeed,sirq-polarity-sense Zev Weiss
2021-04-12 3:47 ` [PATCH v6 2/4] serial: 8250_aspeed_vuart: refactor sirq and lpc address setting code Zev Weiss
@ 2021-04-12 3:47 ` Zev Weiss
2021-04-12 23:37 ` Andrew Jeffery
2021-04-15 10:46 ` Andy Shevchenko
2021-04-12 3:47 ` [PATCH v6 4/4] dt-bindings: serial: 8250: add aspeed,lpc-io-reg and aspeed,lpc-interrupts Zev Weiss
3 siblings, 2 replies; 7+ messages in thread
From: Zev Weiss @ 2021-04-12 3:47 UTC (permalink / raw)
To: Joel Stanley
Cc: openbmc, linux-arm-kernel, linux-aspeed, linux-kernel,
Andrew Jeffery, Zev Weiss, Greg Kroah-Hartman, Jiri Slaby,
linux-serial
These allow describing all the Aspeed VUART attributes currently
available via sysfs. aspeed,lpc-interrupts provides a replacement for
the deprecated aspeed,sirq-polarity-sense property.
Signed-off-by: Zev Weiss <zev@bewilderbeest.net>
---
drivers/tty/serial/8250/8250_aspeed_vuart.c | 51 ++++++++++++++++++++-
1 file changed, 49 insertions(+), 2 deletions(-)
diff --git a/drivers/tty/serial/8250/8250_aspeed_vuart.c b/drivers/tty/serial/8250/8250_aspeed_vuart.c
index 8433f8dbb186..3c239d98747f 100644
--- a/drivers/tty/serial/8250/8250_aspeed_vuart.c
+++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c
@@ -28,6 +28,10 @@
#define ASPEED_VUART_ADDRL 0x28
#define ASPEED_VUART_ADDRH 0x2c
+#define ASPEED_VUART_DEFAULT_LPC_ADDR 0x3f8
+#define ASPEED_VUART_DEFAULT_SIRQ 4
+#define ASPEED_VUART_DEFAULT_SIRQ_POLARITY IRQ_TYPE_LEVEL_LOW
+
struct aspeed_vuart {
struct device *dev;
void __iomem *regs;
@@ -386,6 +390,18 @@ static void aspeed_vuart_auto_configure_sirq_polarity(
aspeed_vuart_set_sirq_polarity(vuart, (value & reg_mask) == 0);
}
+static int aspeed_vuart_map_irq_polarity(u32 dt)
+{
+ switch (dt) {
+ case IRQ_TYPE_LEVEL_LOW:
+ return 0;
+ case IRQ_TYPE_LEVEL_HIGH:
+ return 1;
+ default:
+ return -EINVAL;
+ }
+}
+
static int aspeed_vuart_probe(struct platform_device *pdev)
{
struct of_phandle_args sirq_polarity_sense_args;
@@ -393,8 +409,8 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
struct aspeed_vuart *vuart;
struct device_node *np;
struct resource *res;
- u32 clk, prop;
- int rc;
+ u32 clk, prop, sirq[2];
+ int rc, sirq_polarity;
np = pdev->dev.of_node;
@@ -501,6 +517,37 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
of_node_put(sirq_polarity_sense_args.np);
}
+ rc = of_property_read_u32(np, "aspeed,lpc-io-reg", &prop);
+ if (rc < 0)
+ prop = ASPEED_VUART_DEFAULT_LPC_ADDR;
+
+ rc = aspeed_vuart_set_lpc_address(vuart, prop);
+ if (rc < 0) {
+ dev_err(&pdev->dev, "invalid value in aspeed,lpc-io-reg property\n");
+ goto err_clk_disable;
+ }
+
+ rc = of_property_read_u32_array(np, "aspeed,lpc-interrupts", sirq, 2);
+ if (rc < 0) {
+ sirq[0] = ASPEED_VUART_DEFAULT_SIRQ;
+ sirq[1] = ASPEED_VUART_DEFAULT_SIRQ_POLARITY;
+ }
+
+ rc = aspeed_vuart_set_sirq(vuart, sirq[0]);
+ if (rc < 0) {
+ dev_err(&pdev->dev, "invalid sirq number in aspeed,lpc-interrupts property\n");
+ goto err_clk_disable;
+ }
+
+ sirq_polarity = aspeed_vuart_map_irq_polarity(sirq[1]);
+ if (sirq_polarity < 0) {
+ dev_err(&pdev->dev, "invalid sirq polarity in aspeed,lpc-interrupts property\n");
+ rc = sirq_polarity;
+ goto err_clk_disable;
+ }
+
+ aspeed_vuart_set_sirq_polarity(vuart, sirq_polarity);
+
aspeed_vuart_set_enabled(vuart, true);
aspeed_vuart_set_host_tx_discard(vuart, true);
platform_set_drvdata(pdev, vuart);
--
2.31.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v6 3/4] serial: 8250_aspeed_vuart: add aspeed,lpc-io-reg and aspeed,lpc-interrupts DT properties
2021-04-12 3:47 ` [PATCH v6 3/4] serial: 8250_aspeed_vuart: add aspeed,lpc-io-reg and aspeed,lpc-interrupts DT properties Zev Weiss
@ 2021-04-12 23:37 ` Andrew Jeffery
2021-04-15 10:46 ` Andy Shevchenko
1 sibling, 0 replies; 7+ messages in thread
From: Andrew Jeffery @ 2021-04-12 23:37 UTC (permalink / raw)
To: Zev Weiss, Joel Stanley
Cc: openbmc, linux-arm-kernel, linux-aspeed, linux-kernel,
Greg Kroah-Hartman, Jiri Slaby, linux-serial
On Mon, 12 Apr 2021, at 13:17, Zev Weiss wrote:
> These allow describing all the Aspeed VUART attributes currently
> available via sysfs. aspeed,lpc-interrupts provides a replacement for
> the deprecated aspeed,sirq-polarity-sense property.
>
> Signed-off-by: Zev Weiss <zev@bewilderbeest.net>
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v6 3/4] serial: 8250_aspeed_vuart: add aspeed,lpc-io-reg and aspeed,lpc-interrupts DT properties
2021-04-12 3:47 ` [PATCH v6 3/4] serial: 8250_aspeed_vuart: add aspeed,lpc-io-reg and aspeed,lpc-interrupts DT properties Zev Weiss
2021-04-12 23:37 ` Andrew Jeffery
@ 2021-04-15 10:46 ` Andy Shevchenko
1 sibling, 0 replies; 7+ messages in thread
From: Andy Shevchenko @ 2021-04-15 10:46 UTC (permalink / raw)
To: Zev Weiss
Cc: Joel Stanley, OpenBMC Maillist, linux-arm Mailing List,
moderated list:ARM/ASPEED MACHINE SUPPORT,
Linux Kernel Mailing List, Andrew Jeffery, Greg Kroah-Hartman,
Jiri Slaby, open list:SERIAL DRIVERS
On Mon, Apr 12, 2021 at 7:05 AM Zev Weiss <zev@bewilderbeest.net> wrote:
>
> These allow describing all the Aspeed VUART attributes currently
> available via sysfs. aspeed,lpc-interrupts provides a replacement for
> the deprecated aspeed,sirq-polarity-sense property.
One nit-pick below.
In any case it's fine.
> Signed-off-by: Zev Weiss <zev@bewilderbeest.net>
> ---
> drivers/tty/serial/8250/8250_aspeed_vuart.c | 51 ++++++++++++++++++++-
> 1 file changed, 49 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tty/serial/8250/8250_aspeed_vuart.c b/drivers/tty/serial/8250/8250_aspeed_vuart.c
> index 8433f8dbb186..3c239d98747f 100644
> --- a/drivers/tty/serial/8250/8250_aspeed_vuart.c
> +++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c
> @@ -28,6 +28,10 @@
> #define ASPEED_VUART_ADDRL 0x28
> #define ASPEED_VUART_ADDRH 0x2c
>
> +#define ASPEED_VUART_DEFAULT_LPC_ADDR 0x3f8
> +#define ASPEED_VUART_DEFAULT_SIRQ 4
> +#define ASPEED_VUART_DEFAULT_SIRQ_POLARITY IRQ_TYPE_LEVEL_LOW
> +
> struct aspeed_vuart {
> struct device *dev;
> void __iomem *regs;
> @@ -386,6 +390,18 @@ static void aspeed_vuart_auto_configure_sirq_polarity(
> aspeed_vuart_set_sirq_polarity(vuart, (value & reg_mask) == 0);
> }
>
> +static int aspeed_vuart_map_irq_polarity(u32 dt)
> +{
> + switch (dt) {
> + case IRQ_TYPE_LEVEL_LOW:
> + return 0;
> + case IRQ_TYPE_LEVEL_HIGH:
> + return 1;
> + default:
> + return -EINVAL;
> + }
> +}
> +
> static int aspeed_vuart_probe(struct platform_device *pdev)
> {
> struct of_phandle_args sirq_polarity_sense_args;
> @@ -393,8 +409,8 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
> struct aspeed_vuart *vuart;
> struct device_node *np;
> struct resource *res;
> - u32 clk, prop;
> - int rc;
> + u32 clk, prop, sirq[2];
> + int rc, sirq_polarity;
>
> np = pdev->dev.of_node;
>
> @@ -501,6 +517,37 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
> of_node_put(sirq_polarity_sense_args.np);
> }
>
> + rc = of_property_read_u32(np, "aspeed,lpc-io-reg", &prop);
> + if (rc < 0)
> + prop = ASPEED_VUART_DEFAULT_LPC_ADDR;
> +
> + rc = aspeed_vuart_set_lpc_address(vuart, prop);
> + if (rc < 0) {
> + dev_err(&pdev->dev, "invalid value in aspeed,lpc-io-reg property\n");
> + goto err_clk_disable;
> + }
> +
> + rc = of_property_read_u32_array(np, "aspeed,lpc-interrupts", sirq, 2);
> + if (rc < 0) {
> + sirq[0] = ASPEED_VUART_DEFAULT_SIRQ;
> + sirq[1] = ASPEED_VUART_DEFAULT_SIRQ_POLARITY;
> + }
> +
> + rc = aspeed_vuart_set_sirq(vuart, sirq[0]);
> + if (rc < 0) {
> + dev_err(&pdev->dev, "invalid sirq number in aspeed,lpc-interrupts property\n");
> + goto err_clk_disable;
> + }
> +
> + sirq_polarity = aspeed_vuart_map_irq_polarity(sirq[1]);
> + if (sirq_polarity < 0) {
> + dev_err(&pdev->dev, "invalid sirq polarity in aspeed,lpc-interrupts property\n");
> + rc = sirq_polarity;
> + goto err_clk_disable;
> + }
Why not to use the same pattern as above, i.e.
rc = aspeed_vuart_map_irq_polarity(sirq[1]);
if (rc < 0) {
dev_err(&pdev->dev, "invalid sirq polarity in
aspeed,lpc-interrupts property\n");
goto err_clk_disable;
}
sirq_polarity = rc;
?
> + aspeed_vuart_set_sirq_polarity(vuart, sirq_polarity);
> +
> aspeed_vuart_set_enabled(vuart, true);
> aspeed_vuart_set_host_tx_discard(vuart, true);
> platform_set_drvdata(pdev, vuart);
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v6 4/4] dt-bindings: serial: 8250: add aspeed,lpc-io-reg and aspeed,lpc-interrupts
2021-04-12 3:47 [PATCH v6 0/4] serial: 8250_aspeed_vuart: generalized DT properties Zev Weiss
` (2 preceding siblings ...)
2021-04-12 3:47 ` [PATCH v6 3/4] serial: 8250_aspeed_vuart: add aspeed,lpc-io-reg and aspeed,lpc-interrupts DT properties Zev Weiss
@ 2021-04-12 3:47 ` Zev Weiss
3 siblings, 0 replies; 7+ messages in thread
From: Zev Weiss @ 2021-04-12 3:47 UTC (permalink / raw)
To: Joel Stanley
Cc: openbmc, linux-arm-kernel, linux-aspeed, linux-kernel,
Andrew Jeffery, Zev Weiss, Rob Herring, Greg Kroah-Hartman,
Rob Herring, Lubomir Rintel, -,
linux-serial
These correspond to the existing lpc_address, sirq, and sirq_polarity
sysfs attributes; the second element of aspeed,lpc-interrupts provides
a replacement for the deprecated aspeed,sirq-polarity-sense property.
Signed-off-by: Zev Weiss <zev@bewilderbeest.net>
Reviewed-by: Rob Herring <robh@kernel.org>
---
.../devicetree/bindings/serial/8250.yaml | 27 ++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/serial/8250.yaml b/Documentation/devicetree/bindings/serial/8250.yaml
index 491b9297432d..0e82b076e199 100644
--- a/Documentation/devicetree/bindings/serial/8250.yaml
+++ b/Documentation/devicetree/bindings/serial/8250.yaml
@@ -12,8 +12,13 @@ maintainers:
allOf:
- $ref: /schemas/serial.yaml#
- if:
- required:
- - aspeed,sirq-polarity-sense
+ anyOf:
+ - required:
+ - aspeed,lpc-io-reg
+ - required:
+ - aspeed,lpc-interrupts
+ - required:
+ - aspeed,sirq-polarity-sense
then:
properties:
compatible:
@@ -190,6 +195,20 @@ properties:
applicable to aspeed,ast2500-vuart.
deprecated: true
+ aspeed,lpc-io-reg:
+ $ref: '/schemas/types.yaml#/definitions/uint32'
+ description: |
+ The VUART LPC address. Only applicable to aspeed,ast2500-vuart.
+
+ aspeed,lpc-interrupts:
+ $ref: "/schemas/types.yaml#/definitions/uint32-array"
+ minItems: 2
+ maxItems: 2
+ description: |
+ A 2-cell property describing the VUART SIRQ number and SIRQ
+ polarity (IRQ_TYPE_LEVEL_LOW or IRQ_TYPE_LEVEL_HIGH). Only
+ applicable to aspeed,ast2500-vuart.
+
required:
- reg
- interrupts
@@ -221,6 +240,7 @@ examples:
};
- |
#include <dt-bindings/clock/aspeed-clock.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
serial@1e787000 {
compatible = "aspeed,ast2500-vuart";
reg = <0x1e787000 0x40>;
@@ -228,7 +248,8 @@ examples:
interrupts = <8>;
clocks = <&syscon ASPEED_CLK_APB>;
no-loopback-test;
- aspeed,sirq-polarity-sense = <&syscon 0x70 25>;
+ aspeed,lpc-io-reg = <0x3f8>;
+ aspeed,lpc-interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
};
...
--
2.31.1
^ permalink raw reply related [flat|nested] 7+ messages in thread