| From dd2a9129a4feabc31814a5d2416997f8c642233f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 1 Sep 2019 12:54:10 +0200 |
| Subject: iio: adc: meson_saradc: Fix memory allocation order |
| |
| From: Remi Pommarel <repk@triplefau.lt> |
| |
| [ Upstream commit de10ac47597e7a3596b27631d0d5ce5f48d2c099 ] |
| |
| meson_saradc's irq handler uses priv->regmap so make sure that it is |
| allocated before the irq get enabled. |
| |
| This also fixes crash when CONFIG_DEBUG_SHIRQ is enabled, as device |
| managed resources are freed in the inverted order they had been |
| allocated, priv->regmap was freed before the spurious fake irq that |
| CONFIG_DEBUG_SHIRQ adds called the handler. |
| |
| Fixes: 3af109131b7eb8 ("iio: adc: meson-saradc: switch from polling to interrupt mode") |
| Reported-by: Elie Roudninski <xademax@gmail.com> |
| Signed-off-by: Remi Pommarel <repk@triplefau.lt> |
| Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> |
| Tested-by: Elie ROUDNINSKI <xademax@gmail.com> |
| Reviewed-by: Kevin Hilman <khilman@baylibre.com> |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/iio/adc/meson_saradc.c | 10 +++++----- |
| 1 file changed, 5 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/iio/adc/meson_saradc.c b/drivers/iio/adc/meson_saradc.c |
| index 2515badf8b280..9b2121f249263 100644 |
| --- a/drivers/iio/adc/meson_saradc.c |
| +++ b/drivers/iio/adc/meson_saradc.c |
| @@ -976,6 +976,11 @@ static int meson_sar_adc_probe(struct platform_device *pdev) |
| if (IS_ERR(base)) |
| return PTR_ERR(base); |
| |
| + priv->regmap = devm_regmap_init_mmio(&pdev->dev, base, |
| + priv->data->regmap_config); |
| + if (IS_ERR(priv->regmap)) |
| + return PTR_ERR(priv->regmap); |
| + |
| irq = irq_of_parse_and_map(pdev->dev.of_node, 0); |
| if (!irq) |
| return -EINVAL; |
| @@ -985,11 +990,6 @@ static int meson_sar_adc_probe(struct platform_device *pdev) |
| if (ret) |
| return ret; |
| |
| - priv->regmap = devm_regmap_init_mmio(&pdev->dev, base, |
| - priv->data->regmap_config); |
| - if (IS_ERR(priv->regmap)) |
| - return PTR_ERR(priv->regmap); |
| - |
| priv->clkin = devm_clk_get(&pdev->dev, "clkin"); |
| if (IS_ERR(priv->clkin)) { |
| dev_err(&pdev->dev, "failed to get clkin\n"); |
| -- |
| 2.20.1 |
| |