Commit 7c946b7a authored by Tony Lindgren's avatar Tony Lindgren

Revert "twl4030-core simplification"

This reverts commit 041d1e14.

Use the updated version instead as pointed out by Dave.
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 3fe61e48
...@@ -360,128 +360,261 @@ EXPORT_SYMBOL(twl4030_i2c_read_u8); ...@@ -360,128 +360,261 @@ EXPORT_SYMBOL(twl4030_i2c_read_u8);
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
static int add_child(unsigned chip, const char *name, /*
void *pdata, unsigned pdata_len, * NOTE: We know the first 8 IRQs after pdata->base_irq are
bool can_wakeup, int irq0, int irq1) * for the PIH, and the next are for the PWR_INT SIH, since
* that's how twl_init_irq() sets things up.
*/
static int add_children(struct twl4030_platform_data *pdata)
{ {
struct platform_device *pdev; struct platform_device *pdev = NULL;
struct twl4030_client *twl = &twl4030_modules[chip]; struct twl4030_client *twl = NULL;
int status; int status = 0;
pdev = platform_device_alloc(name, -1); if (twl_has_bci() && pdata->bci) {
twl = &twl4030_modules[3];
pdev = platform_device_alloc("twl4030_bci", -1);
if (!pdev) { if (!pdev) {
dev_dbg(&twl->client->dev, "can't alloc dev\n"); pr_debug("%s: can't alloc bci dev\n", DRIVER_NAME);
status = -ENOMEM; status = -ENOMEM;
goto err; goto err;
} }
device_init_wakeup(&pdev->dev, can_wakeup); if (status == 0) {
pdev->dev.parent = &twl->client->dev; pdev->dev.parent = &twl->client->dev;
status = platform_device_add_data(pdev, pdata->bci,
if (pdata) { sizeof(*pdata->bci));
status = platform_device_add_data(pdev, pdata, pdata_len);
if (status < 0) { if (status < 0) {
dev_dbg(&pdev->dev, "can't add platform_data\n"); dev_dbg(&twl->client->dev,
"can't add bci data, %d\n",
status);
goto err; goto err;
} }
} }
if (irq0) { if (status == 0) {
struct resource r[2] = { struct resource r = {
{ .start = irq0, .flags = IORESOURCE_IRQ, }, .start = pdata->irq_base + 8 + 1,
{ .start = irq1, .flags = IORESOURCE_IRQ, }, .flags = IORESOURCE_IRQ,
}; };
status = platform_device_add_resources(pdev, r, irq1 ? 2 : 1); status = platform_device_add_resources(pdev, &r, 1);
if (status < 0) {
dev_dbg(&pdev->dev, "can't add irqs\n");
goto err;
}
} }
if (status == 0)
status = platform_device_add(pdev); status = platform_device_add(pdev);
err:
if (status < 0) { if (status < 0) {
platform_device_put(pdev); platform_device_put(pdev);
dev_err(&twl->client->dev, "can't add %s dev\n", name); dev_dbg(&twl->client->dev,
"can't create bci dev, %d\n",
status);
goto err;
}
} }
return status;
}
/* if (twl_has_gpio() && pdata->gpio) {
* NOTE: We know the first 8 IRQs after pdata->base_irq are twl = &twl4030_modules[1];
* for the PIH, and the next are for the PWR_INT SIH, since
* that's how twl_init_irq() sets things up.
*/
static int add_children(struct twl4030_platform_data *pdata) pdev = platform_device_alloc("twl4030_gpio", -1);
{ if (!pdev) {
int status; pr_debug("%s: can't alloc gpio dev\n", DRIVER_NAME);
status = -ENOMEM;
goto err;
}
if (twl_has_bci() && pdata->bci) { /* more driver model init */
status = add_child(3, "twl4030_bci", if (status == 0) {
pdata->bci, sizeof(*pdata->bci), pdev->dev.parent = &twl->client->dev;
false, /* device_init_wakeup(&pdev->dev, 1); */
/* irq0 = CHG_PRES, irq1 = BCI */
pdata->irq_base + 8 + 1, pdata->irq_base + 2); status = platform_device_add_data(pdev, pdata->gpio,
if (status < 0) sizeof(*pdata->gpio));
return status; if (status < 0) {
dev_dbg(&twl->client->dev,
"can't add gpio data, %d\n",
status);
goto err;
}
} }
if (twl_has_gpio() && pdata->gpio) { /* GPIO module IRQ */
status = add_child(1, "twl4030_gpio", if (status == 0) {
pdata->gpio, sizeof(*pdata->gpio), struct resource r = {
false, pdata->irq_base + 0, 0); .start = pdata->irq_base + 0,
if (status < 0) .flags = IORESOURCE_IRQ,
return status; };
status = platform_device_add_resources(pdev, &r, 1);
}
if (status == 0)
status = platform_device_add(pdev);
if (status < 0) {
platform_device_put(pdev);
dev_dbg(&twl->client->dev,
"can't create gpio dev, %d\n",
status);
goto err;
}
} }
if (twl_has_keypad() && pdata->keypad) { if (twl_has_keypad() && pdata->keypad) {
status = add_child(2, "twl4030_keypad", pdev = platform_device_alloc("twl4030_keypad", -1);
pdata->keypad, sizeof(*pdata->keypad), if (pdev) {
true, pdata->irq_base + 1, 0); twl = &twl4030_modules[2];
if (status < 0) pdev->dev.parent = &twl->client->dev;
return status; device_init_wakeup(&pdev->dev, 1);
status = platform_device_add_data(pdev, pdata->keypad,
sizeof(*pdata->keypad));
if (status < 0) {
dev_dbg(&twl->client->dev,
"can't add keypad data, %d\n",
status);
platform_device_put(pdev);
goto err;
}
status = platform_device_add(pdev);
if (status < 0) {
platform_device_put(pdev);
dev_dbg(&twl->client->dev,
"can't create keypad dev, %d\n",
status);
goto err;
}
} else {
pr_debug("%s: can't alloc keypad dev\n", DRIVER_NAME);
status = -ENOMEM;
goto err;
}
} }
if (twl_has_madc() && pdata->madc) { if (twl_has_madc() && pdata->madc) {
status = add_child(2, "twl4030_madc", pdev = platform_device_alloc("twl4030_madc", -1);
pdata->madc, sizeof(*pdata->madc), if (pdev) {
true, pdata->irq_base + 3, 0); twl = &twl4030_modules[2];
if (status < 0) pdev->dev.parent = &twl->client->dev;
return status; device_init_wakeup(&pdev->dev, 1);
status = platform_device_add_data(pdev, pdata->madc,
sizeof(*pdata->madc));
if (status < 0) {
platform_device_put(pdev);
dev_dbg(&twl->client->dev,
"can't add madc data, %d\n",
status);
goto err;
}
status = platform_device_add(pdev);
if (status < 0) {
platform_device_put(pdev);
dev_dbg(&twl->client->dev,
"can't create madc dev, %d\n",
status);
goto err;
}
} else {
pr_debug("%s: can't alloc madc dev\n", DRIVER_NAME);
status = -ENOMEM;
goto err;
}
} }
if (twl_has_power() && pdata->power) if (twl_has_power() && pdata->power)
twl4030_power_init(pdata->power); twl4030_power_init(pdata->power);
if (twl_has_rtc()) { if (twl_has_rtc()) {
twl = &twl4030_modules[3];
pdev = platform_device_alloc("twl4030_rtc", -1);
if (!pdev) {
pr_debug("%s: can't alloc rtc dev\n", DRIVER_NAME);
status = -ENOMEM;
} else {
pdev->dev.parent = &twl->client->dev;
device_init_wakeup(&pdev->dev, 1);
}
/* /*
* REVISIT platform_data here currently might expose the * REVISIT platform_data here currently might use of
* "msecure" line ... but for now we just expect board * "msecure" line ... but for now we just expect board
* setup to tell the chip "it's always ok to SET_TIME". * setup to tell the chip "we are secure" at all times.
* Eventually, Linux might become more aware of such * Eventually, Linux might become more aware of such
* HW security concerns, and "least privilege". * HW security concerns, and "least privilege".
*/ */
status = add_child(3, "twl4030_rtc",
NULL, 0, /* RTC module IRQ */
true, pdata->irq_base + 8 + 3, 0); if (status == 0) {
if (status < 0) struct resource r = {
return status; .start = pdata->irq_base + 8 + 3,
.flags = IORESOURCE_IRQ,
};
status = platform_device_add_resources(pdev, &r, 1);
}
if (status == 0)
status = platform_device_add(pdev);
if (status < 0) {
platform_device_put(pdev);
dev_dbg(&twl->client->dev,
"can't create rtc dev, %d\n",
status);
goto err;
}
} }
if (twl_has_usb() && pdata->usb) { if (twl_has_usb() && pdata->usb) {
status = add_child(0, "twl4030_usb", twl = &twl4030_modules[0];
pdata->usb, sizeof(*pdata->usb),
true, pdev = platform_device_alloc("twl4030_usb", -1);
/* irq0 = USB_PRES, irq1 = USB */ if (!pdev) {
pdata->irq_base + 8 + 2, pdata->irq_base + 4); pr_debug("%s: can't alloc usb dev\n", DRIVER_NAME);
if (status < 0) status = -ENOMEM;
return status; goto err;
} }
return 0; if (status == 0) {
pdev->dev.parent = &twl->client->dev;
device_init_wakeup(&pdev->dev, 1);
status = platform_device_add_data(pdev, pdata->usb,
sizeof(*pdata->usb));
if (status < 0) {
platform_device_put(pdev);
dev_dbg(&twl->client->dev,
"can't add usb data, %d\n",
status);
goto err;
}
}
if (status == 0) {
struct resource r = {
.start = pdata->irq_base + 8 + 2,
.flags = IORESOURCE_IRQ,
};
status = platform_device_add_resources(pdev, &r, 1);
}
if (status == 0)
status = platform_device_add(pdev);
if (status < 0) {
platform_device_put(pdev);
dev_dbg(&twl->client->dev,
"can't create usb dev, %d\n",
status);
}
}
err:
if (status)
pr_err("failed to add twl4030's children (status %d)\n", status);
return status;
} }
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
......
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