diff --git a/drivers/gpio/gpio-vx855.c b/drivers/gpio/gpio-vx855.c index ef5aabd..fd24213 100644 --- a/drivers/gpio/gpio-vx855.c +++ b/drivers/gpio/gpio-vx855.c @@ -31,6 +31,7 @@ #include #include #include +#include #define MODULE_NAME "vx855_gpio" @@ -201,7 +202,27 @@ static const char *vx855gpio_names[NR_VX855_GP] = { "VX855_GPIO12", "VX855_GPIO13", "VX855_GPIO14" }; -static void vx855gpio_gpio_setup(struct vx855_gpio *vg) +static void vx855gpio_set_of_node(struct platform_device *pdev, + struct gpio_chip *c) +{ +#ifdef CONFIG_OF + struct device_node *parent_node = pdev->dev.parent->of_node; + struct device_node *child; + + if (!parent_node) + return; + + for_each_child_of_node(parent_node, child) { + if (of_device_is_compatible(child, "via,vx855-gpio")) { + c->of_node = child; + break; + } + } +#endif +} + +static void vx855gpio_gpio_setup(struct vx855_gpio *vg, + struct platform_device *pdev) { struct gpio_chip *c = &vg->gpio; @@ -216,6 +237,7 @@ static void vx855gpio_gpio_setup(struct vx855_gpio *vg) c->ngpio = NR_VX855_GP; c->can_sleep = 0; c->names = vx855gpio_names; + vx855gpio_set_of_node(pdev, c); } /* This platform device is ordinarily registered by the vx855 mfd driver */ @@ -264,7 +286,7 @@ static __devinit int vx855gpio_probe(struct platform_device *pdev) else vg->gpo_reserved = true; - vx855gpio_gpio_setup(vg); + vx855gpio_gpio_setup(vg, pdev); ret = gpiochip_add(&vg->gpio); if (ret) { diff --git a/drivers/mfd/vx855.c b/drivers/mfd/vx855.c index d698703..aee9a5f 100644 --- a/drivers/mfd/vx855.c +++ b/drivers/mfd/vx855.c @@ -30,6 +30,7 @@ #include #include #include +#include /* offset into pci config space indicating the 16bit register containing * the power management IO space base */ @@ -90,6 +91,10 @@ static __devinit int vx855_probe(struct pci_dev *pdev, goto out; } +#ifdef CONFIG_OF + pdev->dev.of_node = of_find_compatible_node(NULL, NULL, "via,vx855-isa"); +#endif + /* mask out the lowest seven bits, as they are always zero, but * hardware returns them as 0x01 */ gpio_io_offset &= 0xff80;