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: Andrew Jeffery <andrew@aj.id.au>
Signed-off-by: Zev Weiss <zev@bewilderbeest.net>
Link: https://lore.kernel.org/r/20210412034712.16778-4-zev@bewilderbeest.net
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Zev Weiss 2021-04-11 22:47:11 -05:00 коммит произвёл Greg Kroah-Hartman
Родитель 3b44af4f9f
Коммит ca03042f0f
1 изменённых файлов: 49 добавлений и 2 удалений

Просмотреть файл

@ -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);