Commit c1860466 authored by Charles Keepax's avatar Charles Keepax Committed by Lee Jones

mfd: arizona: Update reset pin to use GPIOD

Now GPIOD has support for both pdata systems and for non-standard DT
bindings the Arizona reset GPIO can be converted to use it. Worth
noting gpiod_set_raw_value_cansleep is used to match the behaviour
of the old GPIOs. This is because the part is fairly widely used and
it is unknown how many DTs are correctly setting active low through
device tree, so to avoid breaking any existing users it is best to
match the previous behaviour.
Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent e03273e4
...@@ -13,13 +13,12 @@ ...@@ -13,13 +13,12 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/gpio.h> #include <linux/gpio/consumer.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
...@@ -279,7 +278,7 @@ static int arizona_wait_for_boot(struct arizona *arizona) ...@@ -279,7 +278,7 @@ static int arizona_wait_for_boot(struct arizona *arizona)
static inline void arizona_enable_reset(struct arizona *arizona) static inline void arizona_enable_reset(struct arizona *arizona)
{ {
if (arizona->pdata.reset) if (arizona->pdata.reset)
gpio_set_value_cansleep(arizona->pdata.reset, 0); gpiod_set_raw_value_cansleep(arizona->pdata.reset, 0);
} }
static void arizona_disable_reset(struct arizona *arizona) static void arizona_disable_reset(struct arizona *arizona)
...@@ -295,7 +294,7 @@ static void arizona_disable_reset(struct arizona *arizona) ...@@ -295,7 +294,7 @@ static void arizona_disable_reset(struct arizona *arizona)
break; break;
} }
gpio_set_value_cansleep(arizona->pdata.reset, 1); gpiod_set_raw_value_cansleep(arizona->pdata.reset, 1);
usleep_range(1000, 5000); usleep_range(1000, 5000);
} }
} }
...@@ -799,14 +798,27 @@ static int arizona_of_get_core_pdata(struct arizona *arizona) ...@@ -799,14 +798,27 @@ static int arizona_of_get_core_pdata(struct arizona *arizona)
struct arizona_pdata *pdata = &arizona->pdata; struct arizona_pdata *pdata = &arizona->pdata;
int ret, i; int ret, i;
pdata->reset = of_get_named_gpio(arizona->dev->of_node, "wlf,reset", 0); /* Handle old non-standard DT binding */
if (pdata->reset == -EPROBE_DEFER) { pdata->reset = devm_gpiod_get_from_of_node(arizona->dev,
return pdata->reset; arizona->dev->of_node,
} else if (pdata->reset < 0) { "wlf,reset", 0,
dev_err(arizona->dev, "Reset GPIO missing/malformed: %d\n", GPIOD_OUT_LOW,
pdata->reset); "arizona /RESET");
if (IS_ERR(pdata->reset)) {
ret = PTR_ERR(pdata->reset);
pdata->reset = 0; /*
* Reset missing will be caught when other binding is read
* but all other errors imply this binding is in use but has
* encountered a problem so should be handled.
*/
if (ret == -EPROBE_DEFER)
return ret;
else if (ret != -ENOENT && ret != -ENOSYS)
dev_err(arizona->dev, "Reset GPIO malformed: %d\n",
ret);
pdata->reset = NULL;
} }
ret = of_property_read_u32_array(arizona->dev->of_node, ret = of_property_read_u32_array(arizona->dev->of_node,
...@@ -1050,14 +1062,19 @@ int arizona_dev_init(struct arizona *arizona) ...@@ -1050,14 +1062,19 @@ int arizona_dev_init(struct arizona *arizona)
goto err_early; goto err_early;
} }
if (arizona->pdata.reset) { if (!arizona->pdata.reset) {
/* Start out with /RESET low to put the chip into reset */ /* Start out with /RESET low to put the chip into reset */
ret = devm_gpio_request_one(arizona->dev, arizona->pdata.reset, arizona->pdata.reset = devm_gpiod_get(arizona->dev, "reset",
GPIOF_DIR_OUT | GPIOF_INIT_LOW, GPIOD_OUT_LOW);
"arizona /RESET"); if (IS_ERR(arizona->pdata.reset)) {
if (ret != 0) { ret = PTR_ERR(arizona->pdata.reset);
dev_err(dev, "Failed to request /RESET: %d\n", ret); if (ret == -EPROBE_DEFER)
goto err_dcvdd; goto err_dcvdd;
dev_err(arizona->dev,
"Reset GPIO missing/malformed: %d\n", ret);
arizona->pdata.reset = NULL;
} }
} }
......
...@@ -56,6 +56,7 @@ ...@@ -56,6 +56,7 @@
#define ARIZONA_MAX_PDM_SPK 2 #define ARIZONA_MAX_PDM_SPK 2
struct regulator_init_data; struct regulator_init_data;
struct gpio_desc;
struct arizona_micbias { struct arizona_micbias {
int mV; /** Regulated voltage */ int mV; /** Regulated voltage */
...@@ -77,7 +78,7 @@ struct arizona_micd_range { ...@@ -77,7 +78,7 @@ struct arizona_micd_range {
}; };
struct arizona_pdata { struct arizona_pdata {
int reset; /** GPIO controlling /RESET, if any */ struct gpio_desc *reset; /** GPIO controlling /RESET, if any */
/** Regulator configuration for MICVDD */ /** Regulator configuration for MICVDD */
struct arizona_micsupp_pdata micvdd; struct arizona_micsupp_pdata micvdd;
......
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