diff options
Diffstat (limited to 'drivers/mfd')
-rw-r--r-- | drivers/mfd/twl4030-core.c | 91 | ||||
-rw-r--r-- | drivers/mfd/ucb1x00-core.c | 1 | ||||
-rw-r--r-- | drivers/mfd/wm831x-irq.c | 3 |
3 files changed, 50 insertions, 45 deletions
diff --git a/drivers/mfd/twl4030-core.c b/drivers/mfd/twl4030-core.c index e424cf6d8e9e..a1c47ee95c0e 100644 --- a/drivers/mfd/twl4030-core.c +++ b/drivers/mfd/twl4030-core.c | |||
@@ -480,7 +480,6 @@ static int | |||
480 | add_children(struct twl4030_platform_data *pdata, unsigned long features) | 480 | add_children(struct twl4030_platform_data *pdata, unsigned long features) |
481 | { | 481 | { |
482 | struct device *child; | 482 | struct device *child; |
483 | struct device *usb_transceiver = NULL; | ||
484 | 483 | ||
485 | if (twl_has_bci() && pdata->bci && !(features & TPS_SUBSET)) { | 484 | if (twl_has_bci() && pdata->bci && !(features & TPS_SUBSET)) { |
486 | child = add_child(3, "twl4030_bci", | 485 | child = add_child(3, "twl4030_bci", |
@@ -532,16 +531,61 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features) | |||
532 | } | 531 | } |
533 | 532 | ||
534 | if (twl_has_usb() && pdata->usb) { | 533 | if (twl_has_usb() && pdata->usb) { |
534 | |||
535 | static struct regulator_consumer_supply usb1v5 = { | ||
536 | .supply = "usb1v5", | ||
537 | }; | ||
538 | static struct regulator_consumer_supply usb1v8 = { | ||
539 | .supply = "usb1v8", | ||
540 | }; | ||
541 | static struct regulator_consumer_supply usb3v1 = { | ||
542 | .supply = "usb3v1", | ||
543 | }; | ||
544 | |||
545 | /* First add the regulators so that they can be used by transceiver */ | ||
546 | if (twl_has_regulator()) { | ||
547 | /* this is a template that gets copied */ | ||
548 | struct regulator_init_data usb_fixed = { | ||
549 | .constraints.valid_modes_mask = | ||
550 | REGULATOR_MODE_NORMAL | ||
551 | | REGULATOR_MODE_STANDBY, | ||
552 | .constraints.valid_ops_mask = | ||
553 | REGULATOR_CHANGE_MODE | ||
554 | | REGULATOR_CHANGE_STATUS, | ||
555 | }; | ||
556 | |||
557 | child = add_regulator_linked(TWL4030_REG_VUSB1V5, | ||
558 | &usb_fixed, &usb1v5, 1); | ||
559 | if (IS_ERR(child)) | ||
560 | return PTR_ERR(child); | ||
561 | |||
562 | child = add_regulator_linked(TWL4030_REG_VUSB1V8, | ||
563 | &usb_fixed, &usb1v8, 1); | ||
564 | if (IS_ERR(child)) | ||
565 | return PTR_ERR(child); | ||
566 | |||
567 | child = add_regulator_linked(TWL4030_REG_VUSB3V1, | ||
568 | &usb_fixed, &usb3v1, 1); | ||
569 | if (IS_ERR(child)) | ||
570 | return PTR_ERR(child); | ||
571 | |||
572 | } | ||
573 | |||
535 | child = add_child(0, "twl4030_usb", | 574 | child = add_child(0, "twl4030_usb", |
536 | pdata->usb, sizeof(*pdata->usb), | 575 | pdata->usb, sizeof(*pdata->usb), |
537 | true, | 576 | true, |
538 | /* irq0 = USB_PRES, irq1 = USB */ | 577 | /* irq0 = USB_PRES, irq1 = USB */ |
539 | pdata->irq_base + 8 + 2, pdata->irq_base + 4); | 578 | pdata->irq_base + 8 + 2, pdata->irq_base + 4); |
579 | |||
540 | if (IS_ERR(child)) | 580 | if (IS_ERR(child)) |
541 | return PTR_ERR(child); | 581 | return PTR_ERR(child); |
542 | 582 | ||
543 | /* we need to connect regulators to this transceiver */ | 583 | /* we need to connect regulators to this transceiver */ |
544 | usb_transceiver = child; | 584 | if (twl_has_regulator() && child) { |
585 | usb1v5.dev = child; | ||
586 | usb1v8.dev = child; | ||
587 | usb3v1.dev = child; | ||
588 | } | ||
545 | } | 589 | } |
546 | 590 | ||
547 | if (twl_has_watchdog()) { | 591 | if (twl_has_watchdog()) { |
@@ -580,47 +624,6 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features) | |||
580 | return PTR_ERR(child); | 624 | return PTR_ERR(child); |
581 | } | 625 | } |
582 | 626 | ||
583 | if (twl_has_regulator() && usb_transceiver) { | ||
584 | static struct regulator_consumer_supply usb1v5 = { | ||
585 | .supply = "usb1v5", | ||
586 | }; | ||
587 | static struct regulator_consumer_supply usb1v8 = { | ||
588 | .supply = "usb1v8", | ||
589 | }; | ||
590 | static struct regulator_consumer_supply usb3v1 = { | ||
591 | .supply = "usb3v1", | ||
592 | }; | ||
593 | |||
594 | /* this is a template that gets copied */ | ||
595 | struct regulator_init_data usb_fixed = { | ||
596 | .constraints.valid_modes_mask = | ||
597 | REGULATOR_MODE_NORMAL | ||
598 | | REGULATOR_MODE_STANDBY, | ||
599 | .constraints.valid_ops_mask = | ||
600 | REGULATOR_CHANGE_MODE | ||
601 | | REGULATOR_CHANGE_STATUS, | ||
602 | }; | ||
603 | |||
604 | usb1v5.dev = usb_transceiver; | ||
605 | usb1v8.dev = usb_transceiver; | ||
606 | usb3v1.dev = usb_transceiver; | ||
607 | |||
608 | child = add_regulator_linked(TWL4030_REG_VUSB1V5, &usb_fixed, | ||
609 | &usb1v5, 1); | ||
610 | if (IS_ERR(child)) | ||
611 | return PTR_ERR(child); | ||
612 | |||
613 | child = add_regulator_linked(TWL4030_REG_VUSB1V8, &usb_fixed, | ||
614 | &usb1v8, 1); | ||
615 | if (IS_ERR(child)) | ||
616 | return PTR_ERR(child); | ||
617 | |||
618 | child = add_regulator_linked(TWL4030_REG_VUSB3V1, &usb_fixed, | ||
619 | &usb3v1, 1); | ||
620 | if (IS_ERR(child)) | ||
621 | return PTR_ERR(child); | ||
622 | } | ||
623 | |||
624 | /* maybe add LDOs that are omitted on cost-reduced parts */ | 627 | /* maybe add LDOs that are omitted on cost-reduced parts */ |
625 | if (twl_has_regulator() && !(features & TPS_SUBSET)) { | 628 | if (twl_has_regulator() && !(features & TPS_SUBSET)) { |
626 | child = add_regulator(TWL4030_REG_VPLL2, pdata->vpll2); | 629 | child = add_regulator(TWL4030_REG_VPLL2, pdata->vpll2); |
@@ -792,7 +795,7 @@ twl4030_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
792 | twl->client = i2c_new_dummy(client->adapter, | 795 | twl->client = i2c_new_dummy(client->adapter, |
793 | twl->address); | 796 | twl->address); |
794 | if (!twl->client) { | 797 | if (!twl->client) { |
795 | dev_err(&twl->client->dev, | 798 | dev_err(&client->dev, |
796 | "can't attach client %d\n", i); | 799 | "can't attach client %d\n", i); |
797 | status = -ENOMEM; | 800 | status = -ENOMEM; |
798 | goto fail; | 801 | goto fail; |
diff --git a/drivers/mfd/ucb1x00-core.c b/drivers/mfd/ucb1x00-core.c index fea9085fe52c..60c3988f3cf3 100644 --- a/drivers/mfd/ucb1x00-core.c +++ b/drivers/mfd/ucb1x00-core.c | |||
@@ -18,6 +18,7 @@ | |||
18 | */ | 18 | */ |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
21 | #include <linux/sched.h> | ||
21 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
22 | #include <linux/init.h> | 23 | #include <linux/init.h> |
23 | #include <linux/errno.h> | 24 | #include <linux/errno.h> |
diff --git a/drivers/mfd/wm831x-irq.c b/drivers/mfd/wm831x-irq.c index d3015dfb9134..ac056ea6b66e 100644 --- a/drivers/mfd/wm831x-irq.c +++ b/drivers/mfd/wm831x-irq.c | |||
@@ -507,6 +507,8 @@ int wm831x_irq_init(struct wm831x *wm831x, int irq) | |||
507 | { | 507 | { |
508 | int i, ret; | 508 | int i, ret; |
509 | 509 | ||
510 | mutex_init(&wm831x->irq_lock); | ||
511 | |||
510 | if (!irq) { | 512 | if (!irq) { |
511 | dev_warn(wm831x->dev, | 513 | dev_warn(wm831x->dev, |
512 | "No interrupt specified - functionality limited\n"); | 514 | "No interrupt specified - functionality limited\n"); |
@@ -521,7 +523,6 @@ int wm831x_irq_init(struct wm831x *wm831x, int irq) | |||
521 | } | 523 | } |
522 | 524 | ||
523 | wm831x->irq = irq; | 525 | wm831x->irq = irq; |
524 | mutex_init(&wm831x->irq_lock); | ||
525 | INIT_WORK(&wm831x->irq_work, wm831x_irq_worker); | 526 | INIT_WORK(&wm831x->irq_work, wm831x_irq_worker); |
526 | 527 | ||
527 | /* Mask the individual interrupt sources */ | 528 | /* Mask the individual interrupt sources */ |