Skip to content

Commit ca03042

Browse files
zevweissgregkh
authored andcommitted
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>
1 parent 3b44af4 commit ca03042

File tree

1 file changed

+49
-2
lines changed

1 file changed

+49
-2
lines changed

drivers/tty/serial/8250/8250_aspeed_vuart.c

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828
#define ASPEED_VUART_ADDRL 0x28
2929
#define ASPEED_VUART_ADDRH 0x2c
3030

31+
#define ASPEED_VUART_DEFAULT_LPC_ADDR 0x3f8
32+
#define ASPEED_VUART_DEFAULT_SIRQ 4
33+
#define ASPEED_VUART_DEFAULT_SIRQ_POLARITY IRQ_TYPE_LEVEL_LOW
34+
3135
struct aspeed_vuart {
3236
struct device *dev;
3337
void __iomem *regs;
@@ -386,15 +390,27 @@ static void aspeed_vuart_auto_configure_sirq_polarity(
386390
aspeed_vuart_set_sirq_polarity(vuart, (value & reg_mask) == 0);
387391
}
388392

393+
static int aspeed_vuart_map_irq_polarity(u32 dt)
394+
{
395+
switch (dt) {
396+
case IRQ_TYPE_LEVEL_LOW:
397+
return 0;
398+
case IRQ_TYPE_LEVEL_HIGH:
399+
return 1;
400+
default:
401+
return -EINVAL;
402+
}
403+
}
404+
389405
static int aspeed_vuart_probe(struct platform_device *pdev)
390406
{
391407
struct of_phandle_args sirq_polarity_sense_args;
392408
struct uart_8250_port port;
393409
struct aspeed_vuart *vuart;
394410
struct device_node *np;
395411
struct resource *res;
396-
u32 clk, prop;
397-
int rc;
412+
u32 clk, prop, sirq[2];
413+
int rc, sirq_polarity;
398414

399415
np = pdev->dev.of_node;
400416

@@ -501,6 +517,37 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
501517
of_node_put(sirq_polarity_sense_args.np);
502518
}
503519

520+
rc = of_property_read_u32(np, "aspeed,lpc-io-reg", &prop);
521+
if (rc < 0)
522+
prop = ASPEED_VUART_DEFAULT_LPC_ADDR;
523+
524+
rc = aspeed_vuart_set_lpc_address(vuart, prop);
525+
if (rc < 0) {
526+
dev_err(&pdev->dev, "invalid value in aspeed,lpc-io-reg property\n");
527+
goto err_clk_disable;
528+
}
529+
530+
rc = of_property_read_u32_array(np, "aspeed,lpc-interrupts", sirq, 2);
531+
if (rc < 0) {
532+
sirq[0] = ASPEED_VUART_DEFAULT_SIRQ;
533+
sirq[1] = ASPEED_VUART_DEFAULT_SIRQ_POLARITY;
534+
}
535+
536+
rc = aspeed_vuart_set_sirq(vuart, sirq[0]);
537+
if (rc < 0) {
538+
dev_err(&pdev->dev, "invalid sirq number in aspeed,lpc-interrupts property\n");
539+
goto err_clk_disable;
540+
}
541+
542+
sirq_polarity = aspeed_vuart_map_irq_polarity(sirq[1]);
543+
if (sirq_polarity < 0) {
544+
dev_err(&pdev->dev, "invalid sirq polarity in aspeed,lpc-interrupts property\n");
545+
rc = sirq_polarity;
546+
goto err_clk_disable;
547+
}
548+
549+
aspeed_vuart_set_sirq_polarity(vuart, sirq_polarity);
550+
504551
aspeed_vuart_set_enabled(vuart, true);
505552
aspeed_vuart_set_host_tx_discard(vuart, true);
506553
platform_set_drvdata(pdev, vuart);

0 commit comments

Comments
 (0)