summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/sh/pfc/core.c26
-rw-r--r--drivers/sh/pfc/core.h2
2 files changed, 21 insertions, 7 deletions
diff --git a/drivers/sh/pfc/core.c b/drivers/sh/pfc/core.c
index cd8f09dcea95..b2e121d927a0 100644
--- a/drivers/sh/pfc/core.c
+++ b/drivers/sh/pfc/core.c
@@ -26,21 +26,33 @@
#include "core.h"
-static int sh_pfc_ioremap(struct sh_pfc *pfc)
+static int sh_pfc_ioremap(struct sh_pfc *pfc, struct platform_device *pdev)
{
+ unsigned int num_resources;
struct resource *res;
int k;
- if (!pfc->pdata->num_resources)
+ if (pdev->num_resources) {
+ num_resources = pdev->num_resources;
+ res = pdev->resource;
+ } else {
+ num_resources = pfc->pdata->num_resources;
+ res = pfc->pdata->resource;
+ }
+
+ if (num_resources == 0) {
+ pfc->num_windows = 0;
return 0;
+ }
- pfc->window = devm_kzalloc(pfc->dev, pfc->pdata->num_resources *
+ pfc->window = devm_kzalloc(pfc->dev, num_resources *
sizeof(*pfc->window), GFP_NOWAIT);
if (!pfc->window)
return -ENOMEM;
- for (k = 0; k < pfc->pdata->num_resources; k++) {
- res = pfc->pdata->resource + k;
+ pfc->num_windows = num_resources;
+
+ for (k = 0; k < num_resources; k++, res++) {
WARN_ON(resource_type(res) != IORESOURCE_MEM);
pfc->window[k].phys = res->start;
pfc->window[k].size = resource_size(res);
@@ -60,7 +72,7 @@ static void __iomem *sh_pfc_phys_to_virt(struct sh_pfc *pfc,
int k;
/* scan through physical windows and convert address */
- for (k = 0; k < pfc->pdata->num_resources; k++) {
+ for (k = 0; k < pfc->num_windows; k++) {
window = pfc->window + k;
if (address < window->phys)
@@ -498,7 +510,7 @@ static int sh_pfc_probe(struct platform_device *pdev)
pfc->pdata = pdata;
pfc->dev = &pdev->dev;
- ret = sh_pfc_ioremap(pfc);
+ ret = sh_pfc_ioremap(pfc, pdev);
if (unlikely(ret < 0))
return ret;
diff --git a/drivers/sh/pfc/core.h b/drivers/sh/pfc/core.h
index d6a40bc592ff..87ae5fd2a201 100644
--- a/drivers/sh/pfc/core.h
+++ b/drivers/sh/pfc/core.h
@@ -28,7 +28,9 @@ struct sh_pfc {
struct sh_pfc_platform_data *pdata;
spinlock_t lock;
+ unsigned int num_windows;
struct sh_pfc_window *window;
+
struct sh_pfc_chip *gpio;
struct sh_pfc_pinctrl *pinctrl;
};