Skip to content

Commit

Permalink
mfd: Enable the STMPE MFD for Device Tree
Browse files Browse the repository at this point in the history
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: Arnd Bergmann <arnd@arndb.de>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
  • Loading branch information
Lee Jones authored and Samuel Ortiz committed Nov 11, 2012
1 parent 5204e51 commit 909582c
Showing 1 changed file with 42 additions and 6 deletions.
48 changes: 42 additions & 6 deletions drivers/mfd/stmpe.c
Original file line number Diff line number Diff line change
Expand Up @@ -885,18 +885,19 @@ static struct irq_domain_ops stmpe_irq_ops = {
.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 num_irqs = stmpe->variant->num_irqs;

if (base) {
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 {
stmpe->domain = irq_domain_add_linear(
NULL, num_irqs, &stmpe_irq_ops, stmpe);
np, num_irqs, &stmpe_irq_ops, stmpe);
}

if (!stmpe->domain) {
Expand Down Expand Up @@ -1016,15 +1017,50 @@ static int __devinit stmpe_devices_init(struct stmpe *stmpe)
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 */
int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum)
{
struct stmpe_platform_data *pdata = dev_get_platdata(ci->dev);
struct device_node *np = ci->dev->of_node;
struct stmpe *stmpe;
int ret;

if (!pdata)
return -EINVAL;
if (!pdata) {
if (np) {
pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
if (!pdata)
return -ENOMEM;

stmpe_of_probe(pdata, np);
} else
return -EINVAL;
}

stmpe = kzalloc(sizeof(struct stmpe), GFP_KERNEL);
if (!stmpe)
Expand Down Expand Up @@ -1080,7 +1116,7 @@ int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum)
goto free_gpio;

if (stmpe->irq >= 0) {
ret = stmpe_irq_init(stmpe);
ret = stmpe_irq_init(stmpe, np);
if (ret)
goto free_gpio;

Expand Down

0 comments on commit 909582c

Please sign in to comment.