Commit ca03042f authored by Zev Weiss's avatar Zev Weiss Committed by Greg Kroah-Hartman
Browse files

serial: 8250_aspeed_vuart: add aspeed, lpc-io-reg and aspeed, lpc-interrupts DT properties



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.

Reviewed-by: default avatarAndrew Jeffery <andrew@aj.id.au>
Signed-off-by: default avatarZev Weiss <zev@bewilderbeest.net>
Link: https://lore.kernel.org/r/20210412034712.16778-4-zev@bewilderbeest.net


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3b44af4f
Loading
Loading
Loading
Loading
+49 −2
Original line number Diff line number Diff line
@@ -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);