From: Andrew Lunn <andrew-g2DYL2Zd6BY@public.gmane.org>
To: Rob Herring <robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: Andrew Lunn <andrew-g2DYL2Zd6BY@public.gmane.org>,
Jason Cooper <jason-NLaQJdtUoK4Be96aLqz0jA@public.gmane.org>,
len.brown-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
rafael.j.wysocki-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org,
linux ARM
<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>
Subject: Re: [PATCH] cpuidle: kirkwood: Move out of mach directory, add DT.
Date: Fri, 28 Dec 2012 15:35:17 +0100 [thread overview]
Message-ID: <20121228143517.GA5172@lunn.ch> (raw)
In-Reply-To: <50DDAA42.2020101-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
On Fri, Dec 28, 2012 at 08:18:42AM -0600, Rob Herring wrote:
> On 12/28/2012 06:47 AM, Andrew Lunn wrote:
> > Move the Kirkwood cpuidle driver out of arch/arm/mach-kirkwood and
> > into drivers/cpuidle. Convert the driver into a platform driver and
> > add a device tree binding. Add a DT node to instantiate the driver for
> > boards converted to DT, and a platform data for old style boards.
>
> Is this an old comment? I don't see any platform data.
There is no platform data, since all the driver needs is an address of
the DDR control register. The code to create a platform device entry
is in common.c hunk.
>
> >
> > Signed-off-by: Andrew Lunn <andrew-g2DYL2Zd6BY@public.gmane.org>
> > ---
> > .../devicetree/bindings/power/qnap-poweroff.txt | 14 +++
> > arch/arm/boot/dts/kirkwood.dtsi | 5 +
> > arch/arm/configs/kirkwood_defconfig | 1 +
> > arch/arm/mach-kirkwood/Makefile | 1 -
> > arch/arm/mach-kirkwood/common.c | 23 ++++
> > arch/arm/mach-kirkwood/cpuidle.c | 73 -------------
> > arch/arm/mach-kirkwood/include/mach/kirkwood.h | 3 +-
> > drivers/cpuidle/Kconfig | 6 ++
> > drivers/cpuidle/Makefile | 1 +
> > drivers/cpuidle/cpuidle-kirkwood.c | 114 ++++++++++++++++++++
> > 10 files changed, 166 insertions(+), 75 deletions(-)
> > create mode 100644 Documentation/devicetree/bindings/power/qnap-poweroff.txt
> > delete mode 100644 arch/arm/mach-kirkwood/cpuidle.c
> > create mode 100644 drivers/cpuidle/cpuidle-kirkwood.c
> >
> > diff --git a/Documentation/devicetree/bindings/power/qnap-poweroff.txt b/Documentation/devicetree/bindings/power/qnap-poweroff.txt
> > new file mode 100644
> > index 0000000..e15a334
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/power/qnap-poweroff.txt
> > @@ -0,0 +1,14 @@
> > +* QNAP Power Off
>
> This doesn't match the rest of the patch.
Yep, does not belong here. It should be in one of the next patches.
> > --- a/arch/arm/boot/dts/kirkwood.dtsi
> > +++ b/arch/arm/boot/dts/kirkwood.dtsi
> > @@ -23,6 +23,11 @@
> > #address-cells = <1>;
> > #size-cells = <1>;
> >
> > + cpuidle@1418 {
> > + compatible = "marvell,kirkwood-cpuidle";
> > + reg = <0x1418 0x4>;
> > + };
> > +
>
> This is describing what linux wants, not the hardware. This is a common
> problem with cpuidle drivers in that they use shared registers. I don't
> have a good solution, but this doesn't belong in DTS.
Do you have a bad solution?
I could just hard code the address, since its the same for all
kirkwood SoCs. Also, the register is not being used by any other
code on kirkwood, so its not shared.
>
> Rob
>
> > core_clk: core-clocks@10030 {
> > compatible = "marvell,kirkwood-core-clock";
> > reg = <0x10030 0x4>;
> > diff --git a/arch/arm/configs/kirkwood_defconfig b/arch/arm/configs/kirkwood_defconfig
> > index 93f3794..13482ea 100644
> > --- a/arch/arm/configs/kirkwood_defconfig
> > +++ b/arch/arm/configs/kirkwood_defconfig
> > @@ -56,6 +56,7 @@ CONFIG_AEABI=y
> > CONFIG_ZBOOT_ROM_TEXT=0x0
> > CONFIG_ZBOOT_ROM_BSS=0x0
> > CONFIG_CPU_IDLE=y
> > +CONFIG_CPU_IDLE_KIRKWOOD=y
> > CONFIG_NET=y
> > CONFIG_PACKET=y
> > CONFIG_UNIX=y
> > diff --git a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile
> > index 8d2e5a9..d665309 100644
> > --- a/arch/arm/mach-kirkwood/Makefile
> > +++ b/arch/arm/mach-kirkwood/Makefile
> > @@ -19,7 +19,6 @@ obj-$(CONFIG_MACH_NET2BIG_V2) += netxbig_v2-setup.o lacie_v2-common.o
> > obj-$(CONFIG_MACH_NET5BIG_V2) += netxbig_v2-setup.o lacie_v2-common.o
> > obj-$(CONFIG_MACH_T5325) += t5325-setup.o
> >
> > -obj-$(CONFIG_CPU_IDLE) += cpuidle.o
> > obj-$(CONFIG_ARCH_KIRKWOOD_DT) += board-dt.o
> > obj-$(CONFIG_MACH_DREAMPLUG_DT) += board-dreamplug.o
> > obj-$(CONFIG_MACH_ICONNECT_DT) += board-iconnect.o
> > diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c
> > index bac21a5..e8a2978 100644
> > --- a/arch/arm/mach-kirkwood/common.c
> > +++ b/arch/arm/mach-kirkwood/common.c
> > @@ -499,6 +499,28 @@ void __init kirkwood_wdt_init(void)
> > orion_wdt_init();
> > }
> >
> > +/*****************************************************************************
> > + * CPU idle
> > + ****************************************************************************/
> > +static struct resource kirkwood_cpuidle_resource[] = {
> > + {
> > + .flags = IORESOURCE_MEM,
> > + .start = DDR_OPERATION_BASE,
> > + .end = 3,
> > + },
> > +};
> > +
> > +static struct platform_device kirkwood_cpuidle = {
> > + .name = "kirkwood_cpuidle",
> > + .id = -1,
> > + .resource = kirkwood_cpuidle_resource,
> > + .num_resources = 1,
> > +};
> > +
> > +static void __init kirkwood_cpuidle_init(void)
> > +{
> > + platform_device_register(&kirkwood_cpuidle);
> > +}
> >
> > /*****************************************************************************
> > * Time handling
> > @@ -671,6 +693,7 @@ void __init kirkwood_init(void)
> > kirkwood_xor1_init();
> > kirkwood_crypto_init();
> >
> > + kirkwood_cpuidle_init();
> > #ifdef CONFIG_KEXEC
> > kexec_reinit = kirkwood_enable_pcie;
> > #endif
> > diff --git a/arch/arm/mach-kirkwood/cpuidle.c b/arch/arm/mach-kirkwood/cpuidle.c
> > deleted file mode 100644
> > index f730467..0000000
> > --- a/arch/arm/mach-kirkwood/cpuidle.c
> > +++ /dev/null
> > @@ -1,73 +0,0 @@
> > -/*
> > - * arch/arm/mach-kirkwood/cpuidle.c
> > - *
> > - * CPU idle Marvell Kirkwood SoCs
> > - *
> > - * This file is licensed under the terms of the GNU General Public
> > - * License version 2. This program is licensed "as is" without any
> > - * warranty of any kind, whether express or implied.
> > - *
> > - * The cpu idle uses wait-for-interrupt and DDR self refresh in order
> > - * to implement two idle states -
> > - * #1 wait-for-interrupt
> > - * #2 wait-for-interrupt and DDR self refresh
> > - */
> > -
> > -#include <linux/kernel.h>
> > -#include <linux/init.h>
> > -#include <linux/platform_device.h>
> > -#include <linux/cpuidle.h>
> > -#include <linux/io.h>
> > -#include <linux/export.h>
> > -#include <asm/proc-fns.h>
> > -#include <asm/cpuidle.h>
> > -#include <mach/kirkwood.h>
> > -
> > -#define KIRKWOOD_MAX_STATES 2
> > -
> > -/* Actual code that puts the SoC in different idle states */
> > -static int kirkwood_enter_idle(struct cpuidle_device *dev,
> > - struct cpuidle_driver *drv,
> > - int index)
> > -{
> > - writel(0x7, DDR_OPERATION_BASE);
> > - cpu_do_idle();
> > -
> > - return index;
> > -}
> > -
> > -static struct cpuidle_driver kirkwood_idle_driver = {
> > - .name = "kirkwood_idle",
> > - .owner = THIS_MODULE,
> > - .en_core_tk_irqen = 1,
> > - .states[0] = ARM_CPUIDLE_WFI_STATE,
> > - .states[1] = {
> > - .enter = kirkwood_enter_idle,
> > - .exit_latency = 10,
> > - .target_residency = 100000,
> > - .flags = CPUIDLE_FLAG_TIME_VALID,
> > - .name = "DDR SR",
> > - .desc = "WFI and DDR Self Refresh",
> > - },
> > - .state_count = KIRKWOOD_MAX_STATES,
> > -};
> > -
> > -static DEFINE_PER_CPU(struct cpuidle_device, kirkwood_cpuidle_device);
> > -
> > -/* Initialize CPU idle by registering the idle states */
> > -static int kirkwood_init_cpuidle(void)
> > -{
> > - struct cpuidle_device *device;
> > -
> > - device = &per_cpu(kirkwood_cpuidle_device, smp_processor_id());
> > - device->state_count = KIRKWOOD_MAX_STATES;
> > -
> > - cpuidle_register_driver(&kirkwood_idle_driver);
> > - if (cpuidle_register_device(device)) {
> > - pr_err("kirkwood_init_cpuidle: Failed registering\n");
> > - return -EIO;
> > - }
> > - return 0;
> > -}
> > -
> > -device_initcall(kirkwood_init_cpuidle);
> > diff --git a/arch/arm/mach-kirkwood/include/mach/kirkwood.h b/arch/arm/mach-kirkwood/include/mach/kirkwood.h
> > index 041653a..a05563a 100644
> > --- a/arch/arm/mach-kirkwood/include/mach/kirkwood.h
> > +++ b/arch/arm/mach-kirkwood/include/mach/kirkwood.h
> > @@ -60,8 +60,9 @@
> > * Register Map
> > */
> > #define DDR_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE + 0x00000)
> > +#define DDR_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE + 0x00000)
> > #define DDR_WINDOW_CPU_BASE (DDR_VIRT_BASE + 0x1500)
> > -#define DDR_OPERATION_BASE (DDR_VIRT_BASE + 0x1418)
> > +#define DDR_OPERATION_BASE (DDR_PHYS_BASE + 0x1418)
> >
> > #define DEV_BUS_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE + 0x10000)
> > #define DEV_BUS_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE + 0x10000)
> > diff --git a/drivers/cpuidle/Kconfig b/drivers/cpuidle/Kconfig
> > index c4cc27e..071e2c3 100644
> > --- a/drivers/cpuidle/Kconfig
> > +++ b/drivers/cpuidle/Kconfig
> > @@ -39,4 +39,10 @@ config CPU_IDLE_CALXEDA
> > help
> > Select this to enable cpuidle on Calxeda processors.
> >
> > +config CPU_IDLE_KIRKWOOD
> > + bool "CPU Idle Driver for Kirkwood processors"
> > + depends on ARCH_KIRKWOOD
> > + help
> > + Select this to enable cpuidle on Kirkwood processors.
> > +
> > endif
> > diff --git a/drivers/cpuidle/Makefile b/drivers/cpuidle/Makefile
> > index 03ee874..24c6e7d 100644
> > --- a/drivers/cpuidle/Makefile
> > +++ b/drivers/cpuidle/Makefile
> > @@ -6,3 +6,4 @@ obj-y += cpuidle.o driver.o governor.o sysfs.o governors/
> > obj-$(CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED) += coupled.o
> >
> > obj-$(CONFIG_CPU_IDLE_CALXEDA) += cpuidle-calxeda.o
> > +obj-$(CONFIG_CPU_IDLE_KIRKWOOD) += cpuidle-kirkwood.o
> > diff --git a/drivers/cpuidle/cpuidle-kirkwood.c b/drivers/cpuidle/cpuidle-kirkwood.c
> > new file mode 100644
> > index 0000000..2d9d5b3
> > --- /dev/null
> > +++ b/drivers/cpuidle/cpuidle-kirkwood.c
> > @@ -0,0 +1,114 @@
> > +/*
> > + * arch/arm/mach-kirkwood/cpuidle.c
> > + *
> > + * CPU idle Marvell Kirkwood SoCs
> > + *
> > + * This file is licensed under the terms of the GNU General Public
> > + * License version 2. This program is licensed "as is" without any
> > + * warranty of any kind, whether express or implied.
> > + *
> > + * The cpu idle uses wait-for-interrupt and DDR self refresh in order
> > + * to implement two idle states -
> > + * #1 wait-for-interrupt
> > + * #2 wait-for-interrupt and DDR self refresh
> > + */
> > +
> > +#include <linux/kernel.h>
> > +#include <linux/module.h>
> > +#include <linux/init.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/cpuidle.h>
> > +#include <linux/io.h>
> > +#include <linux/export.h>
> > +#include <linux/of.h>
> > +#include <asm/proc-fns.h>
> > +#include <asm/cpuidle.h>
> > +
> > +#define KIRKWOOD_MAX_STATES 2
> > +
> > +static void __iomem *ddr_operation_base;
> > +
> > +/* Actual code that puts the SoC in different idle states */
> > +static int kirkwood_enter_idle(struct cpuidle_device *dev,
> > + struct cpuidle_driver *drv,
> > + int index)
> > +{
> > + writel(0x7, ddr_operation_base);
> > + cpu_do_idle();
> > +
> > + return index;
> > +}
> > +
> > +static struct cpuidle_driver kirkwood_idle_driver = {
> > + .name = "kirkwood_idle",
> > + .owner = THIS_MODULE,
> > + .en_core_tk_irqen = 1,
> > + .states[0] = ARM_CPUIDLE_WFI_STATE,
> > + .states[1] = {
> > + .enter = kirkwood_enter_idle,
> > + .exit_latency = 10,
> > + .target_residency = 100000,
> > + .flags = CPUIDLE_FLAG_TIME_VALID,
> > + .name = "DDR SR",
> > + .desc = "WFI and DDR Self Refresh",
> > + },
> > + .state_count = KIRKWOOD_MAX_STATES,
> > +};
> > +static struct cpuidle_device *device;
> > +
> > +static DEFINE_PER_CPU(struct cpuidle_device, kirkwood_cpuidle_device);
> > +
> > +/* Initialize CPU idle by registering the idle states */
> > +static int kirkwood_cpuidle_probe(struct platform_device *pdev)
> > +{
> > + struct resource *res;
> > +
> > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > + if (res == NULL)
> > + return -EINVAL;
> > +
> > + ddr_operation_base = devm_ioremap(&pdev->dev, res->start,
> > + resource_size(res));
> > + if (ddr_operation_base == NULL)
> > + return -EINVAL;
> > +
> > + device = &per_cpu(kirkwood_cpuidle_device, smp_processor_id());
> > + device->state_count = KIRKWOOD_MAX_STATES;
> > +
> > + cpuidle_register_driver(&kirkwood_idle_driver);
> > + if (cpuidle_register_device(device)) {
> > + pr_err("kirkwood_init_cpuidle: Failed registering\n");
> > + return -EIO;
> > + }
> > + return 0;
> > +}
> > +
> > +int kirkwood_cpuidle_remove(struct platform_device *pdev)
> > +{
> > + cpuidle_unregister_device(device);
> > + cpuidle_unregister_driver(&kirkwood_idle_driver);
> > +
> > + return 0;
> > +}
> > +
> > +static const struct of_device_id of_kirkwood_cpuidle_match[] = {
> > + { .compatible = "marvell,kirkwood-cpuidle", },
> > + {},
> > +};
> > +
> > +static struct platform_driver kirkwood_cpuidle_driver = {
> > + .probe = kirkwood_cpuidle_probe,
> > + .remove = __devexit_p(kirkwood_cpuidle_remove),
> > + .driver = {
> > + .name = "kirkwood_cpuidle",
> > + .owner = THIS_MODULE,
> > + .of_match_table = of_kirkwood_cpuidle_match,
> > + },
> > +};
> > +
> > +module_platform_driver(kirkwood_cpuidle_driver);
> > +
> > +MODULE_AUTHOR("Andrew Lunn <andrew-g2DYL2Zd6BY@public.gmane.org>");
> > +MODULE_DESCRIPTION("Kirkwood cpu idle driver");
> > +MODULE_LICENSE("GPLv2");
> > +MODULE_ALIAS("platform:kirkwood-cpuidle");
> >
>
next prev parent reply other threads:[~2012-12-28 14:35 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-28 12:47 [PATCH] cpuidle: kirkwood: Move out of mach directory, add DT Andrew Lunn
2012-12-28 14:32 ` Florian Fainelli
[not found] ` <50DDAD68.4090704-p3rKhJxN3npAfugRpC6u6w@public.gmane.org>
2012-12-28 14:37 ` Andrew Lunn
[not found] ` <1356698844-4220-1-git-send-email-andrew-g2DYL2Zd6BY@public.gmane.org>
2012-12-28 14:18 ` Rob Herring
[not found] ` <50DDAA42.2020101-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2012-12-28 14:35 ` Andrew Lunn [this message]
[not found] ` <20121228143517.GA5172-g2DYL2Zd6BY@public.gmane.org>
2012-12-28 14:55 ` Rob Herring
[not found] ` <50DDB2E3.103-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2012-12-28 15:49 ` Andrew Lunn
[not found] ` <20121228154927.GC5172-g2DYL2Zd6BY@public.gmane.org>
2012-12-28 16:14 ` Rob Herring
[not found] ` <50DDC54A.3020509-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2012-12-28 16:38 ` Andrew Lunn
[not found] ` <20121228163815.GD5172-g2DYL2Zd6BY@public.gmane.org>
2012-12-28 16:59 ` Rob Herring
2012-12-28 16:56 ` Santosh Shilimkar
[not found] ` <50DDCF47.1030305-l0cyMroinI0@public.gmane.org>
2012-12-28 17:28 ` Andrew Lunn
[not found] ` <20121228172807.GA7578-g2DYL2Zd6BY@public.gmane.org>
2012-12-28 17:50 ` Santosh Shilimkar
[not found] ` <50DDDBEB.3000002-l0cyMroinI0@public.gmane.org>
2012-12-28 17:56 ` Andrew Lunn
[not found] ` <20121228175618.GC7578-g2DYL2Zd6BY@public.gmane.org>
2012-12-28 18:02 ` Santosh Shilimkar
2013-02-08 21:34 ` Grant Likely
2013-02-10 18:58 ` Andrew Lunn
2013-02-11 11:41 ` Grant Likely
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121228143517.GA5172@lunn.ch \
--to=andrew-g2dyl2zd6by@public.gmane.org \
--cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
--cc=jason-NLaQJdtUoK4Be96aLqz0jA@public.gmane.org \
--cc=len.brown-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=rafael.j.wysocki-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).