|
28 | 28 | #define ASPEED_VUART_ADDRL 0x28
|
29 | 29 | #define ASPEED_VUART_ADDRH 0x2c
|
30 | 30 |
|
| 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 | + |
31 | 35 | struct aspeed_vuart {
|
32 | 36 | struct device *dev;
|
33 | 37 | void __iomem *regs;
|
@@ -386,15 +390,27 @@ static void aspeed_vuart_auto_configure_sirq_polarity(
|
386 | 390 | aspeed_vuart_set_sirq_polarity(vuart, (value & reg_mask) == 0);
|
387 | 391 | }
|
388 | 392 |
|
| 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 | + |
389 | 405 | static int aspeed_vuart_probe(struct platform_device *pdev)
|
390 | 406 | {
|
391 | 407 | struct of_phandle_args sirq_polarity_sense_args;
|
392 | 408 | struct uart_8250_port port;
|
393 | 409 | struct aspeed_vuart *vuart;
|
394 | 410 | struct device_node *np;
|
395 | 411 | struct resource *res;
|
396 |
| - u32 clk, prop; |
397 |
| - int rc; |
| 412 | + u32 clk, prop, sirq[2]; |
| 413 | + int rc, sirq_polarity; |
398 | 414 |
|
399 | 415 | np = pdev->dev.of_node;
|
400 | 416 |
|
@@ -501,6 +517,37 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
|
501 | 517 | of_node_put(sirq_polarity_sense_args.np);
|
502 | 518 | }
|
503 | 519 |
|
| 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 | + |
504 | 551 | aspeed_vuart_set_enabled(vuart, true);
|
505 | 552 | aspeed_vuart_set_host_tx_discard(vuart, true);
|
506 | 553 | platform_set_drvdata(pdev, vuart);
|
|
0 commit comments