diff options
| author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2008-05-27 01:37:19 -0400 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2008-05-27 01:37:19 -0400 |
| commit | 5de4cd431db749bdca58ec88862462729f6159b2 (patch) | |
| tree | 86a4d81c487645e3bdb87c0ee31cf3ba62c9dc7e | |
| parent | ef9db4929a4d9559abf1812fd89cc3b09c56b49b (diff) | |
Input: wm97xx-core - fix race on PHY init
The chip phy_init() function must be called before the dig_enable() function
but dig_enable() is called when the device is opened and we only call
phy_init() after having reigstered the device, meaning the two can race.
Fix this by doing the phy_init() before we register the input device.
Thanks to Rodolfo Giometti <giometti@enneenne.com> for the report.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
| -rw-r--r-- | drivers/input/touchscreen/wm97xx-core.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c index 8a00918cfa46..cdc24ad314e0 100644 --- a/drivers/input/touchscreen/wm97xx-core.c +++ b/drivers/input/touchscreen/wm97xx-core.c | |||
| @@ -608,6 +608,17 @@ static int wm97xx_probe(struct device *dev) | |||
| 608 | goto alloc_err; | 608 | goto alloc_err; |
| 609 | } | 609 | } |
| 610 | 610 | ||
| 611 | /* set up physical characteristics */ | ||
| 612 | wm->codec->phy_init(wm); | ||
| 613 | |||
| 614 | /* load gpio cache */ | ||
| 615 | wm->gpio[0] = wm97xx_reg_read(wm, AC97_GPIO_CFG); | ||
| 616 | wm->gpio[1] = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); | ||
| 617 | wm->gpio[2] = wm97xx_reg_read(wm, AC97_GPIO_STICKY); | ||
| 618 | wm->gpio[3] = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); | ||
| 619 | wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS); | ||
| 620 | wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE); | ||
| 621 | |||
| 611 | wm->input_dev = input_allocate_device(); | 622 | wm->input_dev = input_allocate_device(); |
| 612 | if (wm->input_dev == NULL) { | 623 | if (wm->input_dev == NULL) { |
| 613 | ret = -ENOMEM; | 624 | ret = -ENOMEM; |
| @@ -635,17 +646,6 @@ static int wm97xx_probe(struct device *dev) | |||
| 635 | if (ret < 0) | 646 | if (ret < 0) |
| 636 | goto dev_alloc_err; | 647 | goto dev_alloc_err; |
| 637 | 648 | ||
| 638 | /* set up physical characteristics */ | ||
| 639 | wm->codec->phy_init(wm); | ||
| 640 | |||
| 641 | /* load gpio cache */ | ||
| 642 | wm->gpio[0] = wm97xx_reg_read(wm, AC97_GPIO_CFG); | ||
| 643 | wm->gpio[1] = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); | ||
| 644 | wm->gpio[2] = wm97xx_reg_read(wm, AC97_GPIO_STICKY); | ||
| 645 | wm->gpio[3] = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); | ||
| 646 | wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS); | ||
| 647 | wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE); | ||
| 648 | |||
| 649 | /* register our battery device */ | 649 | /* register our battery device */ |
| 650 | wm->battery_dev = platform_device_alloc("wm97xx-battery", -1); | 650 | wm->battery_dev = platform_device_alloc("wm97xx-battery", -1); |
| 651 | if (!wm->battery_dev) { | 651 | if (!wm->battery_dev) { |
