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:
parent
3b44af4f9f
commit
ca03042f0f
@ -28,6 +28,10 @@
|
|||||||
#define ASPEED_VUART_ADDRL 0x28
|
#define ASPEED_VUART_ADDRL 0x28
|
||||||
#define ASPEED_VUART_ADDRH 0x2c
|
#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 aspeed_vuart {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
void __iomem *regs;
|
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);
|
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)
|
static int aspeed_vuart_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct of_phandle_args sirq_polarity_sense_args;
|
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 aspeed_vuart *vuart;
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
u32 clk, prop;
|
u32 clk, prop, sirq[2];
|
||||||
int rc;
|
int rc, sirq_polarity;
|
||||||
|
|
||||||
np = pdev->dev.of_node;
|
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);
|
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_enabled(vuart, true);
|
||||||
aspeed_vuart_set_host_tx_discard(vuart, true);
|
aspeed_vuart_set_host_tx_discard(vuart, true);
|
||||||
platform_set_drvdata(pdev, vuart);
|
platform_set_drvdata(pdev, vuart);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user