Commit 909582ca authored by Lee Jones's avatar Lee Jones Committed by Samuel Ortiz

mfd: Enable the STMPE MFD for Device Tree

This patch allows the STMPE Multi-Functional Device to be correctly
initialised when booting with Device Tree support enabled. Its
children are specified by the addition of subordinate devices to the
STMPE node in the Device Tree file.
Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 5204e51d
...@@ -885,18 +885,19 @@ static struct irq_domain_ops stmpe_irq_ops = { ...@@ -885,18 +885,19 @@ static struct irq_domain_ops stmpe_irq_ops = {
.xlate = irq_domain_xlate_twocell, .xlate = irq_domain_xlate_twocell,
}; };
static int __devinit stmpe_irq_init(struct stmpe *stmpe) static int __devinit stmpe_irq_init(struct stmpe *stmpe,
struct device_node *np)
{ {
int base = stmpe->irq_base; int base = stmpe->irq_base;
int num_irqs = stmpe->variant->num_irqs; int num_irqs = stmpe->variant->num_irqs;
if (base) { if (base) {
stmpe->domain = irq_domain_add_legacy( stmpe->domain = irq_domain_add_legacy(
NULL, num_irqs, base, 0, &stmpe_irq_ops, stmpe); np, num_irqs, base, 0, &stmpe_irq_ops, stmpe);
} }
else { else {
stmpe->domain = irq_domain_add_linear( stmpe->domain = irq_domain_add_linear(
NULL, num_irqs, &stmpe_irq_ops, stmpe); np, num_irqs, &stmpe_irq_ops, stmpe);
} }
if (!stmpe->domain) { if (!stmpe->domain) {
...@@ -1016,15 +1017,50 @@ static int __devinit stmpe_devices_init(struct stmpe *stmpe) ...@@ -1016,15 +1017,50 @@ static int __devinit stmpe_devices_init(struct stmpe *stmpe)
return ret; return ret;
} }
void __devinit stmpe_of_probe(struct stmpe_platform_data *pdata,
struct device_node *np)
{
struct device_node *child;
of_property_read_u32(np, "st,autosleep-timeout",
&pdata->autosleep_timeout);
pdata->autosleep = (pdata->autosleep_timeout) ? true : false;
for_each_child_of_node(np, child) {
if (!strcmp(child->name, "stmpe_gpio")) {
pdata->blocks |= STMPE_BLOCK_GPIO;
}
if (!strcmp(child->name, "stmpe_keypad")) {
pdata->blocks |= STMPE_BLOCK_KEYPAD;
}
if (!strcmp(child->name, "stmpe_touchscreen")) {
pdata->blocks |= STMPE_BLOCK_TOUCHSCREEN;
}
if (!strcmp(child->name, "stmpe_adc")) {
pdata->blocks |= STMPE_BLOCK_ADC;
}
}
}
/* Called from client specific probe routines */ /* Called from client specific probe routines */
int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum) int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum)
{ {
struct stmpe_platform_data *pdata = dev_get_platdata(ci->dev); struct stmpe_platform_data *pdata = dev_get_platdata(ci->dev);
struct device_node *np = ci->dev->of_node;
struct stmpe *stmpe; struct stmpe *stmpe;
int ret; int ret;
if (!pdata) {
if (np) {
pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
if (!pdata) if (!pdata)
return -ENOMEM;
stmpe_of_probe(pdata, np);
} else
return -EINVAL; return -EINVAL;
}
stmpe = kzalloc(sizeof(struct stmpe), GFP_KERNEL); stmpe = kzalloc(sizeof(struct stmpe), GFP_KERNEL);
if (!stmpe) if (!stmpe)
...@@ -1080,7 +1116,7 @@ int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum) ...@@ -1080,7 +1116,7 @@ int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum)
goto free_gpio; goto free_gpio;
if (stmpe->irq >= 0) { if (stmpe->irq >= 0) {
ret = stmpe_irq_init(stmpe); ret = stmpe_irq_init(stmpe, np);
if (ret) if (ret)
goto free_gpio; goto free_gpio;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment