Re: [PATCH 3/3] soc: fsl: add RCPM driver
On Tue, Oct 22, 2019 at 9:52 AM Ran Wang wrote: > > The NXP's QorIQ Processors based on ARM Core have RCPM module > (Run Control and Power Management), which performs system level > tasks associated with power management such as wakeup source control. > > This driver depends on PM wakeup source framework which help to > collect wake information. > > Signed-off-by: Ran Wang > --- > Change in v8: > - Adjust related API usage to meet wakeup.c's update in patch 1/3. > - Add sanity checking for the case of ws->dev or ws->dev->parent > is null. > > Change in v7: > - Replace 'ws->dev' with 'ws->dev->parent' to get aligned with > c8377adfa781 ("PM / wakeup: Show wakeup sources stats in sysfs") > - Remove '+obj-y += ftm_alarm.o' since it is wrong. > - Cosmetic work. > > Change in v6: > - Adjust related API usage to meet wakeup.c's update in patch 1/3. > > Change in v5: > - Fix v4 regression of the return value of wakeup_source_get_next() > didn't pass to ws in while loop. > - Rename wakeup_source member 'attached_dev' to 'dev'. > - Rename property 'fsl,#rcpm-wakeup-cells' to > '#fsl,rcpm-wakeup-cells'. > please see https://lore.kernel.org/patchwork/patch/1101022/ > > Change in v4: > - Remove extra ',' in author line of rcpm.c > - Update usage of wakeup_source_get_next() to be less confusing to the > reader, code logic remain the same. > > Change in v3: > - Some whitespace ajdustment. > > Change in v2: > - Rebase Kconfig and Makefile update to latest mainline. > > drivers/soc/fsl/Kconfig | 8 +++ > drivers/soc/fsl/Makefile | 1 + > drivers/soc/fsl/rcpm.c | 133 > +++ > 3 files changed, 142 insertions(+) > create mode 100644 drivers/soc/fsl/rcpm.c > > diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig > index f9ad8ad..4918856 100644 > --- a/drivers/soc/fsl/Kconfig > +++ b/drivers/soc/fsl/Kconfig > @@ -40,4 +40,12 @@ config DPAA2_CONSOLE > /dev/dpaa2_mc_console and /dev/dpaa2_aiop_console, > which can be used to dump the Management Complex and AIOP > firmware logs. > + > +config FSL_RCPM > + bool "Freescale RCPM support" > + depends on PM_SLEEP > + help > + The NXP QorIQ Processors based on ARM Core have RCPM module > + (Run Control and Power Management), which performs all device-level > + tasks associated with power management, such as wakeup source > control. > endmenu > diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile > index 71dee8d..906f1cd 100644 > --- a/drivers/soc/fsl/Makefile > +++ b/drivers/soc/fsl/Makefile > @@ -6,6 +6,7 @@ > obj-$(CONFIG_FSL_DPAA) += qbman/ > obj-$(CONFIG_QUICC_ENGINE) += qe/ > obj-$(CONFIG_CPM) += qe/ > +obj-$(CONFIG_FSL_RCPM) += rcpm.o > obj-$(CONFIG_FSL_GUTS) += guts.o > obj-$(CONFIG_FSL_MC_DPIO) += dpio/ > obj-$(CONFIG_DPAA2_CONSOLE)+= dpaa2-console.o > diff --git a/drivers/soc/fsl/rcpm.c b/drivers/soc/fsl/rcpm.c > new file mode 100644 > index 000..3ed135e > --- /dev/null > +++ b/drivers/soc/fsl/rcpm.c > @@ -0,0 +1,133 @@ > +// SPDX-License-Identifier: GPL-2.0 > +// > +// rcpm.c - Freescale QorIQ RCPM driver > +// > +// Copyright 2019 NXP > +// > +// Author: Ran Wang > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define RCPM_WAKEUP_CELL_MAX_SIZE 7 > + > +struct rcpm { > + unsigned intwakeup_cells; > + void __iomem*ippdexpcr_base; > + boollittle_endian; > +}; > + Please add a kerneldoc comment describing this routine. > +static int rcpm_pm_prepare(struct device *dev) > +{ > + int i, ret, idx; > + void __iomem *base; > + struct wakeup_source*ws; > + struct rcpm *rcpm; > + struct device_node *np = dev->of_node; > + u32 value[RCPM_WAKEUP_CELL_MAX_SIZE + 1], tmp; > + > + rcpm = dev_get_drvdata(dev); > + if (!rcpm) > + return -EINVAL; > + > + base = rcpm->ippdexpcr_base; > + idx = wakeup_sources_read_lock(); > + > + /* Begin with first registered wakeup source */ > + for_each_wakeup_source(ws) { > + > + /* skip object which is not attached to device */ > + if (!ws->dev || !ws->dev->parent) > + continue; > + > + ret = device_property_read_u32_array(ws->dev->parent, > + "fsl,rcpm-wakeup", value, > + rcpm->wakeup_cells + 1); > + > + /* Wakeup source should refer to current rcpm device */ > + if (ret || (np->phandle != value[0])) { > + dev_info(dev, "%s doesn't refer to this rcpm\n", > +
[PATCH 3/3] soc: fsl: add RCPM driver
The NXP's QorIQ Processors based on ARM Core have RCPM module (Run Control and Power Management), which performs system level tasks associated with power management such as wakeup source control. This driver depends on PM wakeup source framework which help to collect wake information. Signed-off-by: Ran Wang --- Change in v8: - Adjust related API usage to meet wakeup.c's update in patch 1/3. - Add sanity checking for the case of ws->dev or ws->dev->parent is null. Change in v7: - Replace 'ws->dev' with 'ws->dev->parent' to get aligned with c8377adfa781 ("PM / wakeup: Show wakeup sources stats in sysfs") - Remove '+obj-y += ftm_alarm.o' since it is wrong. - Cosmetic work. Change in v6: - Adjust related API usage to meet wakeup.c's update in patch 1/3. Change in v5: - Fix v4 regression of the return value of wakeup_source_get_next() didn't pass to ws in while loop. - Rename wakeup_source member 'attached_dev' to 'dev'. - Rename property 'fsl,#rcpm-wakeup-cells' to '#fsl,rcpm-wakeup-cells'. please see https://lore.kernel.org/patchwork/patch/1101022/ Change in v4: - Remove extra ',' in author line of rcpm.c - Update usage of wakeup_source_get_next() to be less confusing to the reader, code logic remain the same. Change in v3: - Some whitespace ajdustment. Change in v2: - Rebase Kconfig and Makefile update to latest mainline. drivers/soc/fsl/Kconfig | 8 +++ drivers/soc/fsl/Makefile | 1 + drivers/soc/fsl/rcpm.c | 133 +++ 3 files changed, 142 insertions(+) create mode 100644 drivers/soc/fsl/rcpm.c diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig index f9ad8ad..4918856 100644 --- a/drivers/soc/fsl/Kconfig +++ b/drivers/soc/fsl/Kconfig @@ -40,4 +40,12 @@ config DPAA2_CONSOLE /dev/dpaa2_mc_console and /dev/dpaa2_aiop_console, which can be used to dump the Management Complex and AIOP firmware logs. + +config FSL_RCPM + bool "Freescale RCPM support" + depends on PM_SLEEP + help + The NXP QorIQ Processors based on ARM Core have RCPM module + (Run Control and Power Management), which performs all device-level + tasks associated with power management, such as wakeup source control. endmenu diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile index 71dee8d..906f1cd 100644 --- a/drivers/soc/fsl/Makefile +++ b/drivers/soc/fsl/Makefile @@ -6,6 +6,7 @@ obj-$(CONFIG_FSL_DPAA) += qbman/ obj-$(CONFIG_QUICC_ENGINE) += qe/ obj-$(CONFIG_CPM) += qe/ +obj-$(CONFIG_FSL_RCPM) += rcpm.o obj-$(CONFIG_FSL_GUTS) += guts.o obj-$(CONFIG_FSL_MC_DPIO) += dpio/ obj-$(CONFIG_DPAA2_CONSOLE)+= dpaa2-console.o diff --git a/drivers/soc/fsl/rcpm.c b/drivers/soc/fsl/rcpm.c new file mode 100644 index 000..3ed135e --- /dev/null +++ b/drivers/soc/fsl/rcpm.c @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// rcpm.c - Freescale QorIQ RCPM driver +// +// Copyright 2019 NXP +// +// Author: Ran Wang + +#include +#include +#include +#include +#include +#include +#include + +#define RCPM_WAKEUP_CELL_MAX_SIZE 7 + +struct rcpm { + unsigned intwakeup_cells; + void __iomem*ippdexpcr_base; + boollittle_endian; +}; + +static int rcpm_pm_prepare(struct device *dev) +{ + int i, ret, idx; + void __iomem *base; + struct wakeup_source*ws; + struct rcpm *rcpm; + struct device_node *np = dev->of_node; + u32 value[RCPM_WAKEUP_CELL_MAX_SIZE + 1], tmp; + + rcpm = dev_get_drvdata(dev); + if (!rcpm) + return -EINVAL; + + base = rcpm->ippdexpcr_base; + idx = wakeup_sources_read_lock(); + + /* Begin with first registered wakeup source */ + for_each_wakeup_source(ws) { + + /* skip object which is not attached to device */ + if (!ws->dev || !ws->dev->parent) + continue; + + ret = device_property_read_u32_array(ws->dev->parent, + "fsl,rcpm-wakeup", value, + rcpm->wakeup_cells + 1); + + /* Wakeup source should refer to current rcpm device */ + if (ret || (np->phandle != value[0])) { + dev_info(dev, "%s doesn't refer to this rcpm\n", + ws->name); + continue; + } + + for (i = 0; i < rcpm->wakeup_cells; i++) { + /* We can only OR related bits */ + if (value[i + 1]) { + if (rcpm->little_endian) { + tmp = ioread32(base + i * 4); +
[PATCH 3/3] soc: fsl: add RCPM driver
The NXP's QorIQ Processors based on ARM Core have RCPM module (Run Control and Power Management), which performs all device-level tasks associated with power management such as wakeup source control. This driver depends on PM wakeup source framework which help to collect wake information. Signed-off-by: Ran Wang --- drivers/soc/fsl/Kconfig |8 +++ drivers/soc/fsl/Makefile |1 + drivers/soc/fsl/rcpm.c | 124 ++ 3 files changed, 133 insertions(+), 0 deletions(-) create mode 100644 drivers/soc/fsl/rcpm.c diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig index 3b85e18..a25e05b 100644 --- a/drivers/soc/fsl/Kconfig +++ b/drivers/soc/fsl/Kconfig @@ -50,4 +50,12 @@ config FSL_SLEEP_FSM if ARM || ARM64 source "drivers/soc/fsl/Kconfig.arm" endif + +config FSL_RCPM + bool "Freescale RCPM support" + depends on PM_SLEEP + help + The NXP's QorIQ Processors based on ARM Core have RCPM module + (Run Control and Power Management), which performs all device-level + tasks associated with power management, such as wakeup source control. endmenu diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile index db7b09b..aab9f9b 100644 --- a/drivers/soc/fsl/Makefile +++ b/drivers/soc/fsl/Makefile @@ -11,3 +11,4 @@ obj-$(CONFIG_FSL_MC_DPIO) += dpio/ obj-$(CONFIG_FSL_LS2_CONSOLE) += ls2-console/ obj-$(CONFIG_LS_SOC_DRIVERS) += layerscape/ obj-$(CONFIG_FSL_SLEEP_FSM)+= sleep_fsm.o +obj-$(CONFIG_FSL_RCPM) += rcpm.o diff --git a/drivers/soc/fsl/rcpm.c b/drivers/soc/fsl/rcpm.c new file mode 100644 index 000..b817319 --- /dev/null +++ b/drivers/soc/fsl/rcpm.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// rcpm.c - Freescale QorIQ RCPM driver +// +// Copyright 2019 NXP +// +// Author: Ran Wang , + +#include +#include +#include +#include +#include +#include +#include + +#define RCPM_WAKEUP_CELL_MAX_SIZE 7 + +struct rcpm { + unsigned int wakeup_cells; + void __iomem *ippdexpcr_base; + boollittle_endian; +}; + +static int rcpm_pm_prepare(struct device *dev) +{ + struct device_node *np = dev->of_node; + struct wakeup_source *ws; + struct rcpm *rcpm; + u32 value[RCPM_WAKEUP_CELL_MAX_SIZE + 1], tmp; + int i, ret; + + rcpm = dev_get_drvdata(dev); + if (!rcpm) + return -EINVAL; + + /* Begin with first registered wakeup source */ + ws = wakeup_source_get_next(NULL); + while (ws) { + ret = device_property_read_u32_array(ws->attached_dev, + "fsl,rcpm-wakeup", value, rcpm->wakeup_cells + 1); + + /* Wakeup source should refer to current rcpm device */ + if (ret || (np->phandle != value[0])) { + dev_info(dev, "%s doesn't refer to this rcpm\n", + ws->name); + ws = wakeup_source_get_next(ws); + continue; + } + + for (i = 0; i < rcpm->wakeup_cells; i++) { + /* We can only OR related bits */ + if (value[i + 1]) { + if (rcpm->little_endian) { + tmp = ioread32(rcpm->ippdexpcr_base + i * 4); + tmp |= value[i + 1]; + iowrite32(tmp, rcpm->ippdexpcr_base + i * 4); + } else { + tmp = ioread32be(rcpm->ippdexpcr_base + i * 4); + tmp |= value[i + 1]; + iowrite32be(tmp, rcpm->ippdexpcr_base + i * 4); + } + } + } + ws = wakeup_source_get_next(ws); + } + + return 0; +} + +static const struct dev_pm_ops rcpm_pm_ops = { + .prepare = rcpm_pm_prepare, +}; + +static int rcpm_probe(struct platform_device *pdev) +{ + struct device *dev = >dev; + struct resource *r; + struct rcpm *rcpm; + int ret; + + rcpm = devm_kzalloc(dev, sizeof(*rcpm), GFP_KERNEL); + if (!rcpm) + return -ENOMEM; + + r = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!r) + return -ENODEV; + + rcpm->ippdexpcr_base = devm_ioremap_resource(>dev, r); + if (IS_ERR(rcpm->ippdexpcr_base)) { + ret = PTR_ERR(rcpm->ippdexpcr_base); + return ret; + } + + rcpm->little_endian = device_property_read_bool( + >dev, "little-endian"); + + ret = device_property_read_u32(>dev, + "fsl,#rcpm-wakeup-cells", >wakeup_cells); + if (ret) + return ret; + + dev_set_drvdata(>dev, rcpm); +
RE: [PATCH 3/3] soc: fsl: add RCPM driver
Hi Scott, On 2018/9/8 18:16, Scott Wood wrote: > > On Fri, 2018-08-31 at 11:52 +0800, Ran Wang wrote: > > The NXP's QorIQ Processors based on ARM Core have RCPM module (Run > > Control and Power Management), which performs all device-level tasks > > associated with power management such as wakeup source control. > > > > This driver depends on FSL platform PM driver framework which help to > > isolate user and PM service provider (such as RCPM driver). > > > > Signed-off-by: Chenhui Zhao > > Signed-off-by: Ying Zhang > > Signed-off-by: Ran Wang > > --- > > drivers/soc/fsl/Kconfig |6 ++ > > drivers/soc/fsl/Makefile |1 + > > drivers/soc/fsl/ls-rcpm.c | 153 > > + > > 3 files changed, 160 insertions(+), 0 deletions(-) create mode > > 100644 drivers/soc/fsl/ls-rcpm.c > > Is there a reason why this is LS-specific, or could it be used with PPC RCPM > blocks? They have different SW arch design on low power operation: PPC RCPM driver has taken care of most things of suspend enter & exit. And LS RCPM driver will only handle wakeup source configure and left rest work to system firmware to do. So you might be aware that LS RCPM will only get call whenever plat_pm driver API is called rather than system suspend begin where. > > > diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig index > > 6517412..882330d 100644 > > --- a/drivers/soc/fsl/Kconfig > > +++ b/drivers/soc/fsl/Kconfig > > @@ -30,3 +30,9 @@ config FSL_PLAT_PM > > have to know the implement details of wakeup function it require. > > Besides, it is also easy for service side to upgrade its logic > > when > > design changed and remain user side unchanged. > > + > > +config LS_RCPM > > + bool "Freescale RCPM support" > > + depends on (FSL_PLAT_PM) > > Why is this parenthesized? Because we'd like to decouple RCPM driver and its user. Benefit is that will allow user doesn't have to know who will serve it for some PM features (such as wake up source control), and provide some kind of flexibility when either RCMP or user driver evolve in the future. So I add a plat_pm driver to prevent wake up IP knowing any information of RCPM. Regards, Ran > > -Scott
RE: [PATCH 3/3] soc: fsl: add RCPM driver
Hi Leo, On 2018/9/7 4:51, Yang Li wrote: > > On Fri, Sep 7, 2018 at 4:51 AM Ran Wang wrote: > > > > Hi Leo, > > > > On September 05, 2018 at 11:22 Yang Li wrote: > > > -Original Message- > > > From: Li Yang > > > Sent: Wednesday, September 05, 2018 11:22 > > > To: dongsheng.w...@hxt-semitech.com > > > Cc: Ran Wang ; Rob Herring > ; > > > Mark Rutland ; open list:OPEN FIRMWARE AND > > > FLATTENED DEVICE TREE BINDINGS ; > > > linuxppc- dev ; lkml > > > ; moderated list:ARM/FREESCALE IMX / > > > MXC ARM ARCHITECTURE > > > Subject: Re: [PATCH 3/3] soc: fsl: add RCPM driver > > > > > > On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng > > > semitech.com> wrote: > > > > > > > > Please change your comments style. > > > > > > Although this doesn't get into the Linux kernel coding style > > > documentation yet, Linus seems changed his mind to prefer // than /* > > > */ comment style now. > > > https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fl > > > > kml .org%2Flkml%2F2017%2F11%2F25%2F133data=02%7C01%7Cran.w > ang_ > > > > 1%40nxp.com%7Cc0d88e6690384e02b95108d612dec235%7C686ea1d3bc2b4c > > > > 6fa92cd99c5c301635%7C0%7C0%7C636717145285126200sdata=JIoCZp > > > > WhRyW76EqgSflfTDA1f0gMQGKa%2FcbvSc5CO%2Fw%3Dreserved=0 > > > So the > > > // style should be acceptable for now. > > > > > > > > > > > On 2018/8/31 11:56, Ran Wang wrote: > > > > > The NXP's QorIQ Processors based on ARM Core have RCPM module > > > > > (Run Control and Power Management), which performs all > > > > > device-level tasks associated with power management such as > wakeup source control. > > > > > > > > > > This driver depends on FSL platform PM driver framework which > > > > > help to isolate user and PM service provider (such as RCPM driver). > > > > > > > > > > Signed-off-by: Chenhui Zhao > > > > > Signed-off-by: Ying Zhang > > > > > Signed-off-by: Ran Wang > > > > > --- > > > > > drivers/soc/fsl/Kconfig |6 ++ > > > > > drivers/soc/fsl/Makefile |1 + > > > > > drivers/soc/fsl/ls-rcpm.c | 153 > > > > > + > > > > > 3 files changed, 160 insertions(+), 0 deletions(-) create mode > > > > > 100644 drivers/soc/fsl/ls-rcpm.c > > > > > > > > > > diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig > > > > > index 6517412..882330d 100644 > > > > > --- a/drivers/soc/fsl/Kconfig > > > > > +++ b/drivers/soc/fsl/Kconfig > > > > > @@ -30,3 +30,9 @@ config FSL_PLAT_PM > > > > > have to know the implement details of wakeup function it > require. > > > > > Besides, it is also easy for service side to upgrade its > > > > > logic when > > > > > design changed and remain user side unchanged. > > > > > + > > > > > +config LS_RCPM > > > > > + bool "Freescale RCPM support" > > > > > + depends on (FSL_PLAT_PM) > > > > > + help > > > > > + This feature is to enable specified wakeup source for system > sleep. > > > > > diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile > > > > > index 8f9db23..43ff71a 100644 > > > > > --- a/drivers/soc/fsl/Makefile > > > > > +++ b/drivers/soc/fsl/Makefile > > > > > @@ -7,3 +7,4 @@ obj-$(CONFIG_QUICC_ENGINE)+= qe/ > > > > > obj-$(CONFIG_CPM)+= qe/ > > > > > obj-$(CONFIG_FSL_GUTS) += guts.o > > > > > obj-$(CONFIG_FSL_PLAT_PM)+= plat_pm.o > > > > > +obj-$(CONFIG_LS_RCPM)+= ls-rcpm.o > > > > > > Probably use "_" instead of "-" for alignment. > > > > OK, will update in next version > > > > > > > diff --git a/drivers/soc/fsl/ls-rcpm.c > > > > > b/drivers/soc/fsl/ls-rcpm.c new file mode 100644 index > > > > > 000..b0feb88 > > > > > --- /dev/null > > > > > +++ b/drivers/soc/fsl/ls-rcpm.c > > > > > @@ -0,0 +1,153 @@ > > > > > +// SPDX-License-Identifier: GPL-2.0 // // plat_
Re: [PATCH 3/3] soc: fsl: add RCPM driver
On Fri, 2018-08-31 at 11:52 +0800, Ran Wang wrote: > The NXP's QorIQ Processors based on ARM Core have RCPM module (Run > Control and Power Management), which performs all device-level > tasks associated with power management such as wakeup source control. > > This driver depends on FSL platform PM driver framework which help to > isolate user and PM service provider (such as RCPM driver). > > Signed-off-by: Chenhui Zhao > Signed-off-by: Ying Zhang > Signed-off-by: Ran Wang > --- > drivers/soc/fsl/Kconfig |6 ++ > drivers/soc/fsl/Makefile |1 + > drivers/soc/fsl/ls-rcpm.c | 153 > + > 3 files changed, 160 insertions(+), 0 deletions(-) > create mode 100644 drivers/soc/fsl/ls-rcpm.c Is there a reason why this is LS-specific, or could it be used with PPC RCPM blocks? > diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig > index 6517412..882330d 100644 > --- a/drivers/soc/fsl/Kconfig > +++ b/drivers/soc/fsl/Kconfig > @@ -30,3 +30,9 @@ config FSL_PLAT_PM > have to know the implement details of wakeup function it require. > Besides, it is also easy for service side to upgrade its logic > when > design changed and remain user side unchanged. > + > +config LS_RCPM > + bool "Freescale RCPM support" > + depends on (FSL_PLAT_PM) Why is this parenthesized? -Scott
RE: [PATCH 3/3] soc: fsl: add RCPM driver
Hi Leo, On September 05, 2018 at 11:22 Yang Li wrote: > -Original Message- > From: Li Yang > Sent: Wednesday, September 05, 2018 11:22 > To: dongsheng.w...@hxt-semitech.com > Cc: Ran Wang ; Rob Herring ; > Mark Rutland ; open list:OPEN FIRMWARE AND > FLATTENED DEVICE TREE BINDINGS ; linuxppc- > dev ; lkml ; > moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE ker...@lists.infradead.org> > Subject: Re: [PATCH 3/3] soc: fsl: add RCPM driver > > On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng semitech.com> wrote: > > > > Please change your comments style. > > Although this doesn't get into the Linux kernel coding style documentation > yet, Linus seems changed his mind to prefer // than /* > */ comment style now. > https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flkml > .org%2Flkml%2F2017%2F11%2F25%2F133data=02%7C01%7Cran.wang_ > 1%40nxp.com%7Cc0d88e6690384e02b95108d612dec235%7C686ea1d3bc2b4c > 6fa92cd99c5c301635%7C0%7C0%7C636717145285126200sdata=JIoCZp > WhRyW76EqgSflfTDA1f0gMQGKa%2FcbvSc5CO%2Fw%3Dreserved=0 > So the > // style should be acceptable for now. > > > > > On 2018/8/31 11:56, Ran Wang wrote: > > > The NXP's QorIQ Processors based on ARM Core have RCPM module (Run > > > Control and Power Management), which performs all device-level tasks > > > associated with power management such as wakeup source control. > > > > > > This driver depends on FSL platform PM driver framework which help > > > to isolate user and PM service provider (such as RCPM driver). > > > > > > Signed-off-by: Chenhui Zhao > > > Signed-off-by: Ying Zhang > > > Signed-off-by: Ran Wang > > > --- > > > drivers/soc/fsl/Kconfig |6 ++ > > > drivers/soc/fsl/Makefile |1 + > > > drivers/soc/fsl/ls-rcpm.c | 153 > > > + > > > 3 files changed, 160 insertions(+), 0 deletions(-) create mode > > > 100644 drivers/soc/fsl/ls-rcpm.c > > > > > > diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig index > > > 6517412..882330d 100644 > > > --- a/drivers/soc/fsl/Kconfig > > > +++ b/drivers/soc/fsl/Kconfig > > > @@ -30,3 +30,9 @@ config FSL_PLAT_PM > > > have to know the implement details of wakeup function it require. > > > Besides, it is also easy for service side to upgrade its logic > > > when > > > design changed and remain user side unchanged. > > > + > > > +config LS_RCPM > > > + bool "Freescale RCPM support" > > > + depends on (FSL_PLAT_PM) > > > + help > > > + This feature is to enable specified wakeup source for system > > > sleep. > > > diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile > > > index 8f9db23..43ff71a 100644 > > > --- a/drivers/soc/fsl/Makefile > > > +++ b/drivers/soc/fsl/Makefile > > > @@ -7,3 +7,4 @@ obj-$(CONFIG_QUICC_ENGINE)+= qe/ > > > obj-$(CONFIG_CPM)+= qe/ > > > obj-$(CONFIG_FSL_GUTS) += guts.o > > > obj-$(CONFIG_FSL_PLAT_PM)+= plat_pm.o > > > +obj-$(CONFIG_LS_RCPM)+= ls-rcpm.o > > Probably use "_" instead of "-" for alignment. OK, will update in next version > > > diff --git a/drivers/soc/fsl/ls-rcpm.c b/drivers/soc/fsl/ls-rcpm.c > > > new file mode 100644 index 000..b0feb88 > > > --- /dev/null > > > +++ b/drivers/soc/fsl/ls-rcpm.c > > > @@ -0,0 +1,153 @@ > > > +// SPDX-License-Identifier: GPL-2.0 // // plat_pm.c - Freescale > > > +Layerscape RCPM driver > > The file name here is not the same as the real file name. Got it, will correct it. > > > +// > > > +// Copyright 2018 NXP > > > +// > > > +// Author: Ran Wang , > > Where do you need the comma in the end? My bad, will remove comma in next version. > > > + > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > + > > > +#define MAX_COMPATIBLE_NUM 10 > > > + > > > +struct rcpm_t { > > > + struct device *dev; > > > + void __iomem *ippdexpcr_addr; > > > + bool big_endian;/* Big/Little endian of RCPM module */ > > > +}; > > > + > > > +// rcpm_handle - Configure RCPM reg according to wake up source > > > +request // @user_dev: pointer to user's device s
RE: [PATCH 3/3] soc: fsl: add RCPM driver
Hi Dongsheng, On 2018/9/5 10:58, Dongsheng Wang wrote: > > Please change your comments style. > > On 2018/8/31 11:56, Ran Wang wrote: > > The NXP's QorIQ Processors based on ARM Core have RCPM module (Run > > Control and Power Management), which performs all device-level tasks > > associated with power management such as wakeup source control. > > > > This driver depends on FSL platform PM driver framework which help to > > isolate user and PM service provider (such as RCPM driver). > > > > Signed-off-by: Chenhui Zhao > > Signed-off-by: Ying Zhang > > Signed-off-by: Ran Wang > > --- > > drivers/soc/fsl/Kconfig |6 ++ > > drivers/soc/fsl/Makefile |1 + > > drivers/soc/fsl/ls-rcpm.c | 153 > > + > > 3 files changed, 160 insertions(+), 0 deletions(-) create mode > > 100644 drivers/soc/fsl/ls-rcpm.c > > > > diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig index > > 6517412..882330d 100644 > > --- a/drivers/soc/fsl/Kconfig > > +++ b/drivers/soc/fsl/Kconfig > > @@ -30,3 +30,9 @@ config FSL_PLAT_PM > > have to know the implement details of wakeup function it require. > > Besides, it is also easy for service side to upgrade its logic when > > design changed and remain user side unchanged. > > + > > +config LS_RCPM > > + bool "Freescale RCPM support" > > + depends on (FSL_PLAT_PM) > > + help > > + This feature is to enable specified wakeup source for system sleep. > > diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile index > > 8f9db23..43ff71a 100644 > > --- a/drivers/soc/fsl/Makefile > > +++ b/drivers/soc/fsl/Makefile > > @@ -7,3 +7,4 @@ obj-$(CONFIG_QUICC_ENGINE) += qe/ > > obj-$(CONFIG_CPM) += qe/ > > obj-$(CONFIG_FSL_GUTS) += guts.o > > obj-$(CONFIG_FSL_PLAT_PM) += plat_pm.o > > +obj-$(CONFIG_LS_RCPM) += ls-rcpm.o > > diff --git a/drivers/soc/fsl/ls-rcpm.c b/drivers/soc/fsl/ls-rcpm.c new > > file mode 100644 index 000..b0feb88 > > --- /dev/null > > +++ b/drivers/soc/fsl/ls-rcpm.c > > @@ -0,0 +1,153 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +// > > +// plat_pm.c - Freescale Layerscape RCPM driver // // Copyright 2018 > > +NXP // // Author: Ran Wang , > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#define MAX_COMPATIBLE_NUM 10 > > + > > +struct rcpm_t { > > + struct device *dev; > > + void __iomem *ippdexpcr_addr; > > + bool big_endian;/* Big/Little endian of RCPM module */ > > +}; > > + > > +// rcpm_handle - Configure RCPM reg according to wake up source > > +request // @user_dev: pointer to user's device struct // @flag: to > > +enable(true) or disable(false) wakeup source // @handle_priv: pointer > > +to struct rcpm_t instance // // Return 0 on success other negative > > +errno static int rcpm_handle(struct device *user_dev, bool flag, void > > +*handle_priv) { > > + struct rcpm_t *rcpm; > > + bool big_endian; > > + const char *dev_compatible_array[MAX_COMPATIBLE_NUM]; > > + void __iomem *ippdexpcr_addr; > > + u32 ippdexpcr; > > + u32 set_bit; > > + int ret, num, i; > > + > > + rcpm = handle_priv; > > + big_endian = rcpm->big_endian; > > + ippdexpcr_addr = rcpm->ippdexpcr_addr; > > + > > + num = device_property_read_string_array(user_dev, "compatible", > > + dev_compatible_array, MAX_COMPATIBLE_NUM); > > + if (num < 0) > > + return num; > > + > > + for (i = 0; i < num; i++) { > > + if (!device_property_present(rcpm->dev, > > + dev_compatible_array[i])) > > + continue; > > + else { > Remove this else. Got it! Will update in next version. > > + ret = device_property_read_u32(rcpm->dev, > > + dev_compatible_array[i], _bit); > > + if (ret) > > + return ret; > > + > > + if (!device_property_present(rcpm->dev, > > + dev_compatible_array[i])) > This has been checked. Continue ? or return ENODEV? Yes, this checking is not necessary, will remove in next version > > + return -ENODEV; > > + else { > Remove this else. OK > > + ret = device_property_read_u32(rcpm->dev, > > + dev_compatible_array[i], > _bit); > > + if (ret) > > + return ret; > > + > > + if (big_endian) > > + ippdexpcr = > ioread32be(ippdexpcr_addr); > > + else > > + ippdexpcr = > ioread32(ippdexpcr_addr); > > + > > + if (flag) > > + ippdexpcr |= set_bit; > > +
Re: [PATCH 3/3] soc: fsl: add RCPM driver
On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng wrote: > > Please change your comments style. Although this doesn't get into the Linux kernel coding style documentation yet, Linus seems changed his mind to prefer // than /* */ comment style now. https://lkml.org/lkml/2017/11/25/133 So the // style should be acceptable for now. > > On 2018/8/31 11:56, Ran Wang wrote: > > The NXP's QorIQ Processors based on ARM Core have RCPM module (Run > > Control and Power Management), which performs all device-level > > tasks associated with power management such as wakeup source control. > > > > This driver depends on FSL platform PM driver framework which help to > > isolate user and PM service provider (such as RCPM driver). > > > > Signed-off-by: Chenhui Zhao > > Signed-off-by: Ying Zhang > > Signed-off-by: Ran Wang > > --- > > drivers/soc/fsl/Kconfig |6 ++ > > drivers/soc/fsl/Makefile |1 + > > drivers/soc/fsl/ls-rcpm.c | 153 > > + > > 3 files changed, 160 insertions(+), 0 deletions(-) > > create mode 100644 drivers/soc/fsl/ls-rcpm.c > > > > diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig > > index 6517412..882330d 100644 > > --- a/drivers/soc/fsl/Kconfig > > +++ b/drivers/soc/fsl/Kconfig > > @@ -30,3 +30,9 @@ config FSL_PLAT_PM > > have to know the implement details of wakeup function it require. > > Besides, it is also easy for service side to upgrade its logic when > > design changed and remain user side unchanged. > > + > > +config LS_RCPM > > + bool "Freescale RCPM support" > > + depends on (FSL_PLAT_PM) > > + help > > + This feature is to enable specified wakeup source for system sleep. > > diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile > > index 8f9db23..43ff71a 100644 > > --- a/drivers/soc/fsl/Makefile > > +++ b/drivers/soc/fsl/Makefile > > @@ -7,3 +7,4 @@ obj-$(CONFIG_QUICC_ENGINE)+= qe/ > > obj-$(CONFIG_CPM)+= qe/ > > obj-$(CONFIG_FSL_GUTS) += guts.o > > obj-$(CONFIG_FSL_PLAT_PM)+= plat_pm.o > > +obj-$(CONFIG_LS_RCPM)+= ls-rcpm.o Probably use "_" instead of "-" for alignment. > > diff --git a/drivers/soc/fsl/ls-rcpm.c b/drivers/soc/fsl/ls-rcpm.c > > new file mode 100644 > > index 000..b0feb88 > > --- /dev/null > > +++ b/drivers/soc/fsl/ls-rcpm.c > > @@ -0,0 +1,153 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +// > > +// plat_pm.c - Freescale Layerscape RCPM driver The file name here is not the same as the real file name. > > +// > > +// Copyright 2018 NXP > > +// > > +// Author: Ran Wang , Where do you need the comma in the end? > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#define MAX_COMPATIBLE_NUM 10 > > + > > +struct rcpm_t { > > + struct device *dev; > > + void __iomem *ippdexpcr_addr; > > + bool big_endian;/* Big/Little endian of RCPM module */ > > +}; > > + > > +// rcpm_handle - Configure RCPM reg according to wake up source request > > +// @user_dev: pointer to user's device struct > > +// @flag: to enable(true) or disable(false) wakeup source > > +// @handle_priv: pointer to struct rcpm_t instance > > +// > > +// Return 0 on success other negative errno Although Linus preferred this // comment style. I'm not sure if this will be handled correctly by the kernel-doc compiler. https://www.kernel.org/doc/html/v4.18/doc-guide/kernel-doc.html > > +static int rcpm_handle(struct device *user_dev, bool flag, void > > *handle_priv) > > +{ > > + struct rcpm_t *rcpm; > > + bool big_endian; > > + const char *dev_compatible_array[MAX_COMPATIBLE_NUM]; > > + void __iomem *ippdexpcr_addr; > > + u32 ippdexpcr; > > + u32 set_bit; > > + int ret, num, i; > > + > > + rcpm = handle_priv; > > + big_endian = rcpm->big_endian; > > + ippdexpcr_addr = rcpm->ippdexpcr_addr; > > + > > + num = device_property_read_string_array(user_dev, "compatible", > > + dev_compatible_array, MAX_COMPATIBLE_NUM); > > + if (num < 0) > > + return num; > > + > > + for (i = 0; i < num; i++) { > > + if (!device_property_present(rcpm->dev, > > + dev_compatible_array[i])) > > + continue; > > + else { > Remove this else. > > + ret = device_property_read_u32(rcpm->dev, > > + dev_compatible_array[i], _bit); > > + if (ret) > > + return ret; > > + > > + if (!device_property_present(rcpm->dev, > > + dev_compatible_array[i])) > This has been checked. Continue ? or return ENODEV? > > + return -ENODEV; > > + else { > Remove this else. > > +
Re: [PATCH 3/3] soc: fsl: add RCPM driver
Please change your comments style. On 2018/8/31 11:56, Ran Wang wrote: > The NXP's QorIQ Processors based on ARM Core have RCPM module (Run > Control and Power Management), which performs all device-level > tasks associated with power management such as wakeup source control. > > This driver depends on FSL platform PM driver framework which help to > isolate user and PM service provider (such as RCPM driver). > > Signed-off-by: Chenhui Zhao > Signed-off-by: Ying Zhang > Signed-off-by: Ran Wang > --- > drivers/soc/fsl/Kconfig |6 ++ > drivers/soc/fsl/Makefile |1 + > drivers/soc/fsl/ls-rcpm.c | 153 > + > 3 files changed, 160 insertions(+), 0 deletions(-) > create mode 100644 drivers/soc/fsl/ls-rcpm.c > > diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig > index 6517412..882330d 100644 > --- a/drivers/soc/fsl/Kconfig > +++ b/drivers/soc/fsl/Kconfig > @@ -30,3 +30,9 @@ config FSL_PLAT_PM > have to know the implement details of wakeup function it require. > Besides, it is also easy for service side to upgrade its logic when > design changed and remain user side unchanged. > + > +config LS_RCPM > + bool "Freescale RCPM support" > + depends on (FSL_PLAT_PM) > + help > + This feature is to enable specified wakeup source for system sleep. > diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile > index 8f9db23..43ff71a 100644 > --- a/drivers/soc/fsl/Makefile > +++ b/drivers/soc/fsl/Makefile > @@ -7,3 +7,4 @@ obj-$(CONFIG_QUICC_ENGINE)+= qe/ > obj-$(CONFIG_CPM)+= qe/ > obj-$(CONFIG_FSL_GUTS) += guts.o > obj-$(CONFIG_FSL_PLAT_PM)+= plat_pm.o > +obj-$(CONFIG_LS_RCPM)+= ls-rcpm.o > diff --git a/drivers/soc/fsl/ls-rcpm.c b/drivers/soc/fsl/ls-rcpm.c > new file mode 100644 > index 000..b0feb88 > --- /dev/null > +++ b/drivers/soc/fsl/ls-rcpm.c > @@ -0,0 +1,153 @@ > +// SPDX-License-Identifier: GPL-2.0 > +// > +// plat_pm.c - Freescale Layerscape RCPM driver > +// > +// Copyright 2018 NXP > +// > +// Author: Ran Wang , > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define MAX_COMPATIBLE_NUM 10 > + > +struct rcpm_t { > + struct device *dev; > + void __iomem *ippdexpcr_addr; > + bool big_endian;/* Big/Little endian of RCPM module */ > +}; > + > +// rcpm_handle - Configure RCPM reg according to wake up source request > +// @user_dev: pointer to user's device struct > +// @flag: to enable(true) or disable(false) wakeup source > +// @handle_priv: pointer to struct rcpm_t instance > +// > +// Return 0 on success other negative errno > +static int rcpm_handle(struct device *user_dev, bool flag, void *handle_priv) > +{ > + struct rcpm_t *rcpm; > + bool big_endian; > + const char *dev_compatible_array[MAX_COMPATIBLE_NUM]; > + void __iomem *ippdexpcr_addr; > + u32 ippdexpcr; > + u32 set_bit; > + int ret, num, i; > + > + rcpm = handle_priv; > + big_endian = rcpm->big_endian; > + ippdexpcr_addr = rcpm->ippdexpcr_addr; > + > + num = device_property_read_string_array(user_dev, "compatible", > + dev_compatible_array, MAX_COMPATIBLE_NUM); > + if (num < 0) > + return num; > + > + for (i = 0; i < num; i++) { > + if (!device_property_present(rcpm->dev, > + dev_compatible_array[i])) > + continue; > + else { Remove this else. > + ret = device_property_read_u32(rcpm->dev, > + dev_compatible_array[i], _bit); > + if (ret) > + return ret; > + > + if (!device_property_present(rcpm->dev, > + dev_compatible_array[i])) This has been checked. Continue ? or return ENODEV? > + return -ENODEV; > + else { Remove this else. > + ret = device_property_read_u32(rcpm->dev, > + dev_compatible_array[i], > _bit); > + if (ret) > + return ret; > + > + if (big_endian) > + ippdexpcr = ioread32be(ippdexpcr_addr); > + else > + ippdexpcr = ioread32(ippdexpcr_addr); > + > + if (flag) > + ippdexpcr |= set_bit; > + else > + ippdexpcr &= ~set_bit; > + > + if (big_endian) { > + iowrite32be(ippdexpcr, ippdexpcr_addr); > + ippdexpcr =
[PATCH 3/3] soc: fsl: add RCPM driver
The NXP's QorIQ Processors based on ARM Core have RCPM module (Run Control and Power Management), which performs all device-level tasks associated with power management such as wakeup source control. This driver depends on FSL platform PM driver framework which help to isolate user and PM service provider (such as RCPM driver). Signed-off-by: Chenhui Zhao Signed-off-by: Ying Zhang Signed-off-by: Ran Wang --- drivers/soc/fsl/Kconfig |6 ++ drivers/soc/fsl/Makefile |1 + drivers/soc/fsl/ls-rcpm.c | 153 + 3 files changed, 160 insertions(+), 0 deletions(-) create mode 100644 drivers/soc/fsl/ls-rcpm.c diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig index 6517412..882330d 100644 --- a/drivers/soc/fsl/Kconfig +++ b/drivers/soc/fsl/Kconfig @@ -30,3 +30,9 @@ config FSL_PLAT_PM have to know the implement details of wakeup function it require. Besides, it is also easy for service side to upgrade its logic when design changed and remain user side unchanged. + +config LS_RCPM + bool "Freescale RCPM support" + depends on (FSL_PLAT_PM) + help + This feature is to enable specified wakeup source for system sleep. diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile index 8f9db23..43ff71a 100644 --- a/drivers/soc/fsl/Makefile +++ b/drivers/soc/fsl/Makefile @@ -7,3 +7,4 @@ obj-$(CONFIG_QUICC_ENGINE) += qe/ obj-$(CONFIG_CPM) += qe/ obj-$(CONFIG_FSL_GUTS) += guts.o obj-$(CONFIG_FSL_PLAT_PM) += plat_pm.o +obj-$(CONFIG_LS_RCPM) += ls-rcpm.o diff --git a/drivers/soc/fsl/ls-rcpm.c b/drivers/soc/fsl/ls-rcpm.c new file mode 100644 index 000..b0feb88 --- /dev/null +++ b/drivers/soc/fsl/ls-rcpm.c @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// plat_pm.c - Freescale Layerscape RCPM driver +// +// Copyright 2018 NXP +// +// Author: Ran Wang , + +#include +#include +#include +#include +#include +#include + +#define MAX_COMPATIBLE_NUM 10 + +struct rcpm_t { + struct device *dev; + void __iomem *ippdexpcr_addr; + bool big_endian;/* Big/Little endian of RCPM module */ +}; + +// rcpm_handle - Configure RCPM reg according to wake up source request +// @user_dev: pointer to user's device struct +// @flag: to enable(true) or disable(false) wakeup source +// @handle_priv: pointer to struct rcpm_t instance +// +// Return 0 on success other negative errno +static int rcpm_handle(struct device *user_dev, bool flag, void *handle_priv) +{ + struct rcpm_t *rcpm; + bool big_endian; + const char *dev_compatible_array[MAX_COMPATIBLE_NUM]; + void __iomem *ippdexpcr_addr; + u32 ippdexpcr; + u32 set_bit; + int ret, num, i; + + rcpm = handle_priv; + big_endian = rcpm->big_endian; + ippdexpcr_addr = rcpm->ippdexpcr_addr; + + num = device_property_read_string_array(user_dev, "compatible", + dev_compatible_array, MAX_COMPATIBLE_NUM); + if (num < 0) + return num; + + for (i = 0; i < num; i++) { + if (!device_property_present(rcpm->dev, + dev_compatible_array[i])) + continue; + else { + ret = device_property_read_u32(rcpm->dev, + dev_compatible_array[i], _bit); + if (ret) + return ret; + + if (!device_property_present(rcpm->dev, + dev_compatible_array[i])) + return -ENODEV; + else { + ret = device_property_read_u32(rcpm->dev, + dev_compatible_array[i], _bit); + if (ret) + return ret; + + if (big_endian) + ippdexpcr = ioread32be(ippdexpcr_addr); + else + ippdexpcr = ioread32(ippdexpcr_addr); + + if (flag) + ippdexpcr |= set_bit; + else + ippdexpcr &= ~set_bit; + + if (big_endian) { + iowrite32be(ippdexpcr, ippdexpcr_addr); + ippdexpcr = ioread32be(ippdexpcr_addr); + } else + iowrite32(ippdexpcr, ippdexpcr_addr); + + return 0; + } + } + } + + return -ENODEV; +} + +static int ls_rcpm_probe(struct platform_device *pdev)