From c5132c51868f4bc448ecc56431c37cb20951ea34 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sat, 15 Dec 2012 23:50:55 +0100 Subject: [PATCH] --- yaml --- r: 355349 b: refs/heads/master c: 973931ae0a2dad57e23ce0ca2fab5abed9cf0d9a h: refs/heads/master i: 355347: 4494747af44184ed9afa6a08b8bb51f92245adbd v: v3 --- [refs] | 2 +- trunk/drivers/sh/pfc/core.c | 26 +++++++++++++++++++------- trunk/drivers/sh/pfc/core.h | 2 ++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 4e5b1100e6e0..846eb6a09c72 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 40ee6fce7a0d3a2b2a1f2a14900af98a49a9ff40 +refs/heads/master: 973931ae0a2dad57e23ce0ca2fab5abed9cf0d9a diff --git a/trunk/drivers/sh/pfc/core.c b/trunk/drivers/sh/pfc/core.c index cd8f09dcea95..b2e121d927a0 100644 --- a/trunk/drivers/sh/pfc/core.c +++ b/trunk/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/trunk/drivers/sh/pfc/core.h b/trunk/drivers/sh/pfc/core.h index d6a40bc592ff..87ae5fd2a201 100644 --- a/trunk/drivers/sh/pfc/core.h +++ b/trunk/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; };