|
@@ -87,6 +87,15 @@ static int brcmstb_gpio_remove(struct platform_device *pdev)
|
|
|
struct brcmstb_gpio_bank *bank;
|
|
|
int ret = 0;
|
|
|
|
|
|
+ if (!priv) {
|
|
|
+ dev_err(&pdev->dev, "called %s without drvdata!\n", __func__);
|
|
|
+ return -EFAULT;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * You can lose return values below, but we report all errors, and it's
|
|
|
+ * more important to actually perform all of the steps.
|
|
|
+ */
|
|
|
list_for_each(pos, &priv->bank_list) {
|
|
|
bank = list_entry(pos, struct brcmstb_gpio_bank, node);
|
|
|
ret = bgpio_remove(&bank->bgc);
|
|
@@ -143,6 +152,8 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
|
|
|
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
|
|
if (!priv)
|
|
|
return -ENOMEM;
|
|
|
+ platform_set_drvdata(pdev, priv);
|
|
|
+ INIT_LIST_HEAD(&priv->bank_list);
|
|
|
|
|
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
reg_base = devm_ioremap_resource(dev, res);
|
|
@@ -153,7 +164,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
|
|
|
priv->reg_base = reg_base;
|
|
|
priv->pdev = pdev;
|
|
|
|
|
|
- INIT_LIST_HEAD(&priv->bank_list);
|
|
|
if (brcmstb_gpio_sanity_check_banks(dev, np, res))
|
|
|
return -EINVAL;
|
|
|
|
|
@@ -221,8 +231,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
|
|
|
dev_info(dev, "Registered %d banks (GPIO(s): %d-%d)\n",
|
|
|
priv->num_banks, priv->gpio_base, gpio_base - 1);
|
|
|
|
|
|
- platform_set_drvdata(pdev, priv);
|
|
|
-
|
|
|
return 0;
|
|
|
|
|
|
fail:
|