瀏覽代碼

mfd: arizona: Handle probe deferral for reset GPIO

The Arizona CODECs will generally function correctly without a reset line
although it is strongly advised to have one, as such we do allow the system
to boot if the reset gpio is missing or incorrectly specified.  However
we should fail probe if we get a probe deferral request, this patch adds
handling for this case.

Reported-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Charles Keepax 9 年之前
父節點
當前提交
b8d336ed90
共有 1 個文件被更改,包括 9 次插入4 次删除
  1. 9 4
      drivers/mfd/arizona-core.c

+ 9 - 4
drivers/mfd/arizona-core.c

@@ -814,7 +814,9 @@ static int arizona_of_get_core_pdata(struct arizona *arizona)
 	int count = 0;
 	int count = 0;
 
 
 	pdata->reset = of_get_named_gpio(arizona->dev->of_node, "wlf,reset", 0);
 	pdata->reset = of_get_named_gpio(arizona->dev->of_node, "wlf,reset", 0);
-	if (pdata->reset < 0) {
+	if (pdata->reset == -EPROBE_DEFER) {
+		return pdata->reset;
+	} else if (pdata->reset < 0) {
 		dev_err(arizona->dev, "Reset GPIO missing/malformed: %d\n",
 		dev_err(arizona->dev, "Reset GPIO missing/malformed: %d\n",
 			pdata->reset);
 			pdata->reset);
 
 
@@ -1041,11 +1043,14 @@ int arizona_dev_init(struct arizona *arizona)
 	dev_set_drvdata(arizona->dev, arizona);
 	dev_set_drvdata(arizona->dev, arizona);
 	mutex_init(&arizona->clk_lock);
 	mutex_init(&arizona->clk_lock);
 
 
-	if (dev_get_platdata(arizona->dev))
+	if (dev_get_platdata(arizona->dev)) {
 		memcpy(&arizona->pdata, dev_get_platdata(arizona->dev),
 		memcpy(&arizona->pdata, dev_get_platdata(arizona->dev),
 		       sizeof(arizona->pdata));
 		       sizeof(arizona->pdata));
-	else
-		arizona_of_get_core_pdata(arizona);
+	} else {
+		ret = arizona_of_get_core_pdata(arizona);
+		if (ret < 0)
+			return ret;
+	}
 
 
 	BUILD_BUG_ON(ARRAY_SIZE(arizona->mclk) != ARRAY_SIZE(mclk_name));
 	BUILD_BUG_ON(ARRAY_SIZE(arizona->mclk) != ARRAY_SIZE(mclk_name));
 	for (i = 0; i < ARRAY_SIZE(arizona->mclk); i++) {
 	for (i = 0; i < ARRAY_SIZE(arizona->mclk); i++) {