From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933283AbbD1KtA (ORCPT ); Tue, 28 Apr 2015 06:49:00 -0400 Received: from mailout2.samsung.com ([203.254.224.25]:27827 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932686AbbD1Ks5 (ORCPT ); Tue, 28 Apr 2015 06:48:57 -0400 X-AuditID: cbfee690-f796f6d000005054-c7-553f6596b656 Message-id: <553F65D3.7040104@samsung.com> Date: Tue, 28 Apr 2015 16:19:55 +0530 From: Pankaj Dubey User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 MIME-version: 1.0 To: Philipp Zabel , Samuel Ortiz , Lee Jones , Arnd Bergmann Cc: Alexander Shiyan , Pawel Moll , Wolfram Sang , Peter Seiderer , Tushar Behera , linux-kernel@vger.kernel.org, kernel@pengutronix.de Subject: Re: [PATCH] mfd: syscon: allow to register syscon with a device References: <1426587872-30923-1-git-send-email-p.zabel@pengutronix.de> <1429864326.3174.21.camel@pengutronix.de> In-reply-to: <1429864326.3174.21.camel@pengutronix.de> Content-type: text/plain; charset=utf-8; format=flowed Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrFIsWRmVeSWpSXmKPExsWyRsSkTndaqn2owcNOG4u/k46xW6yaupPF 4v7Xo4wWl3fNYbO4e+8Ei8WE6WtZLKZumMhscbqb1WLSDimL9r972SxWnpjF7MDtsWbeGkaP 378mMXos3rSfzePOtT1sHvNOBnpMmXuE1aP/r4HHyVNPWDw+b5IL4IzisklJzcksSy3St0vg ylj8dCtzwRKdisZ3bewNjO+Uuxg5OSQETCQOzbjOAmGLSVy4t56ti5GLQ0hgKaNEz4L7bDBF Pecns0AkFjFK7N7yD8r5zihx7P5lRpAqXgEtie8X2sA6WARUJT59OswMYrMJ6Eo8eT8XzBYV iJD4sOorG0S9oMSPyffABokITGWU2LbuMjuIwyzwmVHixd7NYB3CAh4Sj7YdBesQEiiS2PC5 A2wbp4CZxJXF+9lBbGYg+8vLw6wQtrzE5jVvmUEGSQh0ckjsbNgDdZKAxLfJh4DWcQAlZCU2 HWCG+E1S4uCKGywTGMVmITlqFpKxs5CMXcDIvIpRNLUguaA4Kb3IRK84Mbe4NC9dLzk/dxMj MIpP/3s2YQfjvQPWhxgFOBiVeHgn3LYLFWJNLCuuzD3EaAp0xURmKdHkfGCqyCuJNzQ2M7Iw NTE1NjK3NFMS530t9TNYSCA9sSQ1OzW1ILUovqg0J7X4ECMTB6dUA+OieY8NzNvqnikleDTb n1RXOXJLxG9uRv6LurmCma+udfK7MHOnG33JClysUsPis31OGL/Wt10FD5s1PrwPv5Eyo+4K /6v8Xzp5HI1sxke+7k+bnHbE6tnMqYW18TfrHSZz6weaJdY9e3L3cK/oXI/Z5VnmveX/uN/4 8c5MfZDZ8Sp+lvq9WCWW4oxEQy3mouJEAM/KRDfdAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprCKsWRmVeSWpSXmKPExsVy+t9jAd1pqfahBs8bjS3+TjrGbrFq6k4W i/tfjzJaXN41h83i7r0TLBYTpq9lsZi6YSKzxeluVotJO6Qs2v/uZbNYeWIWswO3x5p5axg9 fv+axOixeNN+No871/awecw7GegxZe4RVo/+vwYeJ089YfH4vEkugDOqgdEmIzUxJbVIITUv OT8lMy/dVsk7ON453tTMwFDX0NLCXEkhLzE31VbJxSdA1y0zB+hWJYWyxJxSoFBAYnGxkr4d pgmhIW66FjCNEbq+IUFwPUYGaCBhDWPG4qdbmQuW6FQ0vmtjb2B8p9zFyMkhIWAi0XN+MguE LSZx4d56ti5GLg4hgUWMEru3/GOBcL4zShy7f5kRpIpXQEvi+4U2NhCbRUBV4tOnw8wgNpuA rsST93PBbFGBCIkPq76yQdQLSvyYfA9skIjAVEaJbesus4M4zAKfGSVe7N0M1iEs4CHxaNtR sA4hgSKJDZ87wLZxCphJXFm8nx3EZgayv7w8zAphy0tsXvOWeQKjwCwkS2YhKZuFpGwBI/Mq RtHUguSC4qT0XEO94sTc4tK8dL3k/NxNjOAU8UxqB+PKBotDjAIcjEo8vBNv24UKsSaWFVfm HmKU4GBWEuENSLYPFeJNSaysSi3Kjy8qzUktPsRoCgyDicxSosn5wPSVVxJvaGxibmpsamli YWJmqSTOO0dXLlRIID2xJDU7NbUgtQimj4mDU6qB8YBu59upj4J3XWCfJcV92zrnR7Ws9pPD XFWTnwZtMgr58VhO5bwjQ8i0fXcupz280b1fufaKIXdlyFIb/gPWZt5LnrwqWcF72WWVu/fL h9tndj7cu/CF1B+Pr2fuf9j368KfRYe21HFkMR+a2hS9qs/rpWBJwheHQ+rHnf7WBIX+nnH/ 6JrzLAlKLMUZiYZazEXFiQBMlRNgJwMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org +To: Arnd Bergmann Hi Philipp, On Friday 24 April 2015 02:02 PM, Philipp Zabel wrote: > Am Dienstag, den 17.03.2015, 11:24 +0100 schrieb Philipp Zabel: >> Commit bdb0066df96e ("mfd: syscon: Decouple syscon interface from platform devices") >> added the possibility to register syscon devices without associated platform >> device. This also removed regmap debugfs facilities, which don't work without a >> device. Since there is no replacement, this patch allows again to register >> syscon regions with an associated device where that this device exists anyway. > > Hi, > > any comments on this? > Verified patch on Exynos5250 based SMDK5250 board. Although it's not breaking Exynos PMU probing or S2R for me. I am still not very sure about the approach, because as I mentioned earlier, Arnd was against [1] adding any such registration exported function in syscon. So including Arnd in this loop. [1]: https://lkml.org/lkml/2014/6/18/311 > best regards > Philipp > >> [fixed max_register parameter in case of device register] >> Signed-off-by: Peter Seiderer >> Signed-off-by: Philipp Zabel >> --- >> drivers/mfd/syscon.c | 29 +++++++++++++++++++++-------- >> include/linux/mfd/syscon.h | 10 ++++++++++ >> 2 files changed, 31 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c >> index 176bf0f..af0f899 100644 >> --- a/drivers/mfd/syscon.c >> +++ b/drivers/mfd/syscon.c >> @@ -36,19 +36,20 @@ struct syscon { >> struct list_head list; >> }; >> >> -static struct regmap_config syscon_regmap_config = { >> +static const struct regmap_config syscon_regmap_config = { >> .reg_bits = 32, >> .val_bits = 32, >> .reg_stride = 4, >> }; >> >> -static struct syscon *of_syscon_register(struct device_node *np) >> +struct syscon *syscon_register(struct device *dev, struct device_node *np) >> { >> struct syscon *syscon; >> struct regmap *regmap; >> void __iomem *base; >> int ret; >> struct regmap_config syscon_config = syscon_regmap_config; >> + struct resource res; >> >> if (!of_device_is_compatible(np, "syscon")) >> return ERR_PTR(-EINVAL); >> @@ -57,7 +58,12 @@ static struct syscon *of_syscon_register(struct device_node *np) >> if (!syscon) >> return ERR_PTR(-ENOMEM); >> >> - base = of_iomap(np, 0); >> + if (of_address_to_resource(np, 0, &res)) { >> + ret = -ENOMEM; >> + goto err_map; >> + } >> + >> + base = ioremap(res.start, resource_size(&res)); >> if (!base) { >> ret = -ENOMEM; >> goto err_map; >> @@ -69,7 +75,8 @@ static struct syscon *of_syscon_register(struct device_node *np) >> else if (of_property_read_bool(np, "little-endian")) >> syscon_config.val_format_endian = REGMAP_ENDIAN_LITTLE; >> >> - regmap = regmap_init_mmio(NULL, base, &syscon_config); >> + syscon_config.max_register = res.end - res.start - 3; >> + regmap = regmap_init_mmio(dev, base, &syscon_config); >> if (IS_ERR(regmap)) { >> pr_err("regmap init failed\n"); >> ret = PTR_ERR(regmap); >> @@ -91,6 +98,12 @@ err_map: >> kfree(syscon); >> return ERR_PTR(ret); >> } >> +EXPORT_SYMBOL_GPL(syscon_register); >> + >> +static struct syscon *of_syscon_register(struct device_node *np) >> +{ >> + return syscon_register(NULL, np); >> +} >> >> struct regmap *syscon_node_to_regmap(struct device_node *np) >> { >> @@ -179,6 +192,7 @@ static int syscon_probe(struct platform_device *pdev) >> struct device *dev = &pdev->dev; >> struct syscon_platform_data *pdata = dev_get_platdata(dev); >> struct syscon *syscon; >> + struct regmap_config syscon_config = syscon_regmap_config; >> struct resource *res; >> void __iomem *base; >> >> @@ -194,11 +208,10 @@ static int syscon_probe(struct platform_device *pdev) >> if (!base) >> return -ENOMEM; >> >> - syscon_regmap_config.max_register = res->end - res->start - 3; >> + syscon_config.max_register = res->end - res->start - 3; >> if (pdata) >> - syscon_regmap_config.name = pdata->label; >> - syscon->regmap = devm_regmap_init_mmio(dev, base, >> - &syscon_regmap_config); >> + syscon_config.name = pdata->label; >> + syscon->regmap = devm_regmap_init_mmio(dev, base, &syscon_config); >> if (IS_ERR(syscon->regmap)) { >> dev_err(dev, "regmap init failed\n"); >> return PTR_ERR(syscon->regmap); >> diff --git a/include/linux/mfd/syscon.h b/include/linux/mfd/syscon.h >> index 75e543b..e0c4a86 100644 >> --- a/include/linux/mfd/syscon.h >> +++ b/include/linux/mfd/syscon.h >> @@ -17,10 +17,14 @@ >> >> #include >> >> +struct device; >> struct device_node; >> +struct syscon; >> >> #ifdef CONFIG_MFD_SYSCON >> extern struct regmap *syscon_node_to_regmap(struct device_node *np); >> +extern struct syscon *syscon_register(struct device *dev, >> + struct device_node *np); >> extern struct regmap *syscon_regmap_lookup_by_compatible(const char *s); >> extern struct regmap *syscon_regmap_lookup_by_pdevname(const char *s); >> extern struct regmap *syscon_regmap_lookup_by_phandle( >> @@ -32,6 +36,12 @@ static inline struct regmap *syscon_node_to_regmap(struct device_node *np) >> return ERR_PTR(-ENOSYS); >> } >> >> +static struct syscon *syscon_register(struct device *dev, >> + struct device_node *np) >> +{ >> + return ERR_PTR(-ENOSYS); >> +} >> + >> static inline struct regmap *syscon_regmap_lookup_by_compatible(const char *s) >> { >> return ERR_PTR(-ENOSYS); > Thanks, Pankaj Dubey