Message ID | 1628e048220f066204b8ac27f3cedf7f3cc02963.1645427180.git.edwinchiu0505tw@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v5] cpuidle: sunplus: Create cpuidle driver for sunplus sp7021 | expand |
> -----Original Message----- > From: Sudeep Holla <sudeep.holla@arm.com> > Sent: Monday, February 21, 2022 6:52 PM > To: Edwin Chiu <edwinchiu0505tw@gmail.com> > Cc: Edwin Chiu 邱垂峰 <edwin.chiu@sunplus.com>; robh+dt@kernel.org; devicetree@vger.kernel.org; > linux-kernel@vger.kernel.org; rafael@kernel.org; Sudeep Holla <sudeep.holla@arm.com>; > daniel.lezcano@linaro.org; linux-pm@vger.kernel.org > Subject: Re: [PATCH v5] cpuidle: sunplus: Create cpuidle driver for sunplus sp7021 > > On Mon, Feb 21, 2022 at 03:26:18PM +0800, Edwin Chiu wrote: > > Create cpuidle driver for sunplus sp7021 chip > > > > Signed-off-by: Edwin Chiu <edwinchiu0505tw@gmail.com> > > --- > > Changes in v3 > > - Rearrangement #include sequence > > - Change remark style to /*~*/ > > - Align author email address to same as sob > > - Optimal code > > Changes in v4 > > - According Rob Herringrobh's comment > > There is no need for this binding. > > Just wanting a different driver is not a reason > > for a duplicate schema. > > So remove yaml file and submit driver again. > > Changes in v5 > > - According Krzysztof's comment > > You either use appropriate compatible in DT > > or add your compatible to cpuidle-arm. > > Even if this did not work, then the solution is to > > use common parts, not to duplicate entire driver. > > According Sudeep's comment > > In short NACK for any dedicated driver for this platform, > > use the generic cpuidle-arm driver with appropriate platform hooks > > Create cpuidle-sunplus.c in arch/arm/mach-sunplus/ > > for hook generic cpuidle-arm driver > > > > MAINTAINERS | 6 ++ > > arch/arm/mach-sunplus/cpuidle-sunplus.c | 88 +++++++++++++++++ > > include/linux/platform_data/cpuidle-sunplus.h | 12 ++++ > > 3 files changed, 106 insertions(+) > > create mode 100644 arch/arm/mach-sunplus/cpuidle-sunplus.c > > create mode 100644 include/linux/platform_data/cpuidle-sunplus.h > > > > diff --git a/MAINTAINERS b/MAINTAINERS index e0dca8f..5c96428 100644 > > --- a/MAINTAINERS > > +++ b/MAINTAINERS > > @@ -18252,6 +18252,12 @@ L: netdev@vger.kernel.org > > S: Maintained > > F: drivers/net/ethernet/dlink/sundance.c > > > > +SUNPLUS CPUIDLE DRIVER > > +M: Edwin Chiu <edwinchiu0505tw@gmail.com> > > +S: Maintained > > +F: arch/arm/mach-sunplus/cpuidle-sunplus.c > > +F: include/linux/platform_data/cpuidle-sunplus.h > > + > > SUPERH > > M: Yoshinori Sato <ysato@users.sourceforge.jp> > > M: Rich Felker <dalias@libc.org> > > diff --git a/arch/arm/mach-sunplus/cpuidle-sunplus.c > > b/arch/arm/mach-sunplus/cpuidle-sunplus.c > > new file mode 100644 > > index 0000000..e9d9738 > > --- /dev/null > > +++ b/arch/arm/mach-sunplus/cpuidle-sunplus.c > > @@ -0,0 +1,88 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * SP7021 cpu idle Driver. > > + * Copyright (C) Sunplus Tech / Tibbo Tech. > > + */ > > +#define pr_fmt(fmt) "CPUidle arm: " fmt > > + > > +#include <linux/cpuidle.h> > > +#include <linux/of_device.h> > > +#include <linux/platform_data/cpuidle-sunplus.h> > > + > > +#include <asm/cpuidle.h> > > + > > +typedef int (*idle_fn)(void); > > + > > +static DEFINE_PER_CPU(idle_fn*, sp7021_idle_ops); > > + > > +static int sp7021_cpuidle_enter(unsigned long index) { > > + return __this_cpu_read(sp7021_idle_ops)[index](); > > +} > > +static int sp7021_cpu_spc(void) > > +{ > > + cpu_v7_do_idle(); /* idle to WFI */ > > + return 0; > > +} > > You really don't need a cpuidle driver to just WFI for any states. > Add the driver when you have something non WFI in the suspend function. > > > +static const struct of_device_id sp7021_idle_state_match[] = { > > + { .compatible = "arm,idle-state", .data = sp7021_cpu_spc }, > > + { }, > > +}; > > This is better than adding new driver like you did in previous version. > > I did a quick check but couldn't figure out. How do cpus get switched ON or OFF on this platform(for > example during CPU hotplug) ? > > -- > Regards, > Sudeep In this patch, I just want to submit cpuidle function. So there have no cpu hotplug function now. 邱垂峰 EdwinChiu 智能運算專案 T: +886-3-5786005 ext.2590 edwin.chiu@sunplus.com 300 新竹科學園區創新一路19號
> -----Original Message----- > From: Krzysztof Kozlowski <krzk@kernel.org> > Sent: Tuesday, February 22, 2022 12:48 AM > To: Edwin Chiu <edwinchiu0505tw@gmail.com>; Edwin Chiu 邱垂峰 <edwin.chiu@sunplus.com>; > robh+dt@kernel.org; devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; rafael@kernel.org; > daniel.lezcano@linaro.org; linux-pm@vger.kernel.org > Subject: Re: [PATCH v5] cpuidle: sunplus: Create cpuidle driver for sunplus sp7021 > > On 21/02/2022 08:26, Edwin Chiu wrote: > > Create cpuidle driver for sunplus sp7021 chip > > > > Signed-off-by: Edwin Chiu <edwinchiu0505tw@gmail.com> > > --- > > Changes in v3 > > - Rearrangement #include sequence > > - Change remark style to /*~*/ > > - Align author email address to same as sob > > - Optimal code > > Changes in v4 > > - According Rob Herringrobh's comment > > There is no need for this binding. > > Just wanting a different driver is not a reason > > for a duplicate schema. > > So remove yaml file and submit driver again. > > Changes in v5 > > - According Krzysztof's comment > > You either use appropriate compatible in DT > > or add your compatible to cpuidle-arm. > > Even if this did not work, then the solution is to > > use common parts, not to duplicate entire driver. > > According Sudeep's comment > > In short NACK for any dedicated driver for this platform, > > use the generic cpuidle-arm driver with appropriate platform hooks > > Create cpuidle-sunplus.c in arch/arm/mach-sunplus/ > > for hook generic cpuidle-arm driver > > > > MAINTAINERS | 6 ++ > > arch/arm/mach-sunplus/cpuidle-sunplus.c | 88 +++++++++++++++++ > > include/linux/platform_data/cpuidle-sunplus.h | 12 ++++ > > 3 files changed, 106 insertions(+) > > create mode 100644 arch/arm/mach-sunplus/cpuidle-sunplus.c > > create mode 100644 include/linux/platform_data/cpuidle-sunplus.h > > > > diff --git a/MAINTAINERS b/MAINTAINERS index e0dca8f..5c96428 100644 > > --- a/MAINTAINERS > > +++ b/MAINTAINERS > > @@ -18252,6 +18252,12 @@ L: netdev@vger.kernel.org > > S: Maintained > > F: drivers/net/ethernet/dlink/sundance.c > > > > +SUNPLUS CPUIDLE DRIVER > > +M: Edwin Chiu <edwinchiu0505tw@gmail.com> > > +S: Maintained > > +F: arch/arm/mach-sunplus/cpuidle-sunplus.c > > +F: include/linux/platform_data/cpuidle-sunplus.h > > + > > SUPERH > > M: Yoshinori Sato <ysato@users.sourceforge.jp> > > M: Rich Felker <dalias@libc.org> > > diff --git a/arch/arm/mach-sunplus/cpuidle-sunplus.c > > b/arch/arm/mach-sunplus/cpuidle-sunplus.c > > new file mode 100644 > > index 0000000..e9d9738 > > --- /dev/null > > +++ b/arch/arm/mach-sunplus/cpuidle-sunplus.c > > @@ -0,0 +1,88 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * SP7021 cpu idle Driver. > > + * Copyright (C) Sunplus Tech / Tibbo Tech. > > + */ > > +#define pr_fmt(fmt) "CPUidle arm: " fmt > > + > > +#include <linux/cpuidle.h> > > +#include <linux/of_device.h> > > +#include <linux/platform_data/cpuidle-sunplus.h> > > + > > +#include <asm/cpuidle.h> > > + > > +typedef int (*idle_fn)(void); > > + > > +static DEFINE_PER_CPU(idle_fn*, sp7021_idle_ops); > > + > > +static int sp7021_cpuidle_enter(unsigned long index) { > > + return __this_cpu_read(sp7021_idle_ops)[index](); > > +} > > +static int sp7021_cpu_spc(void) > > +{ > > + cpu_v7_do_idle(); /* idle to WFI */ > > + return 0; > > +} > > +static const struct of_device_id sp7021_idle_state_match[] = { > > + { .compatible = "arm,idle-state", .data = sp7021_cpu_spc }, > > + { }, > > +}; > > This is confusing. You want to have two drivers to bind to the same compatible? As I wrote in the > previous messages, you should simply use arm,idle-state just like few other architectures. > > > Best regards, > Krzysztof The patch v5 implemented according your comment. Used common part of arm,idle-state. Create new enable-method for cpuidle.ops function. It only have arm cpuidle driver exist now, no two drivers to bind to the same compatible. What do you mean " simply use arm,idle-state just like few other architectures "? 邱垂峰 EdwinChiu 智能運算專案 T: +886-3-5786005 ext.2590 edwin.chiu@sunplus.com 300 新竹科學園區創新一路19號
On 01/03/2022 10:30, Edwin Chiu 邱垂峰 wrote: > > >> -----Original Message----- >> From: Krzysztof Kozlowski <krzk@kernel.org> >> Sent: Tuesday, February 22, 2022 12:48 AM >> To: Edwin Chiu <edwinchiu0505tw@gmail.com>; Edwin Chiu 邱垂峰 <edwin.chiu@sunplus.com>; >> robh+dt@kernel.org; devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; rafael@kernel.org; >> daniel.lezcano@linaro.org; linux-pm@vger.kernel.org >> Subject: Re: [PATCH v5] cpuidle: sunplus: Create cpuidle driver for sunplus sp7021 >> >> On 21/02/2022 08:26, Edwin Chiu wrote: >>> Create cpuidle driver for sunplus sp7021 chip >>> >>> Signed-off-by: Edwin Chiu <edwinchiu0505tw@gmail.com> >>> --- >>> Changes in v3 >>> - Rearrangement #include sequence >>> - Change remark style to /*~*/ >>> - Align author email address to same as sob >>> - Optimal code >>> Changes in v4 >>> - According Rob Herringrobh's comment >>> There is no need for this binding. >>> Just wanting a different driver is not a reason >>> for a duplicate schema. >>> So remove yaml file and submit driver again. >>> Changes in v5 >>> - According Krzysztof's comment >>> You either use appropriate compatible in DT >>> or add your compatible to cpuidle-arm. >>> Even if this did not work, then the solution is to >>> use common parts, not to duplicate entire driver. >>> According Sudeep's comment >>> In short NACK for any dedicated driver for this platform, >>> use the generic cpuidle-arm driver with appropriate platform hooks >>> Create cpuidle-sunplus.c in arch/arm/mach-sunplus/ >>> for hook generic cpuidle-arm driver >>> >>> MAINTAINERS | 6 ++ >>> arch/arm/mach-sunplus/cpuidle-sunplus.c | 88 +++++++++++++++++ >>> include/linux/platform_data/cpuidle-sunplus.h | 12 ++++ >>> 3 files changed, 106 insertions(+) >>> create mode 100644 arch/arm/mach-sunplus/cpuidle-sunplus.c >>> create mode 100644 include/linux/platform_data/cpuidle-sunplus.h >>> >>> diff --git a/MAINTAINERS b/MAINTAINERS index e0dca8f..5c96428 100644 >>> --- a/MAINTAINERS >>> +++ b/MAINTAINERS >>> @@ -18252,6 +18252,12 @@ L: netdev@vger.kernel.org >>> S: Maintained >>> F: drivers/net/ethernet/dlink/sundance.c >>> >>> +SUNPLUS CPUIDLE DRIVER >>> +M: Edwin Chiu <edwinchiu0505tw@gmail.com> >>> +S: Maintained >>> +F: arch/arm/mach-sunplus/cpuidle-sunplus.c >>> +F: include/linux/platform_data/cpuidle-sunplus.h >>> + >>> SUPERH >>> M: Yoshinori Sato <ysato@users.sourceforge.jp> >>> M: Rich Felker <dalias@libc.org> >>> diff --git a/arch/arm/mach-sunplus/cpuidle-sunplus.c >>> b/arch/arm/mach-sunplus/cpuidle-sunplus.c >>> new file mode 100644 >>> index 0000000..e9d9738 >>> --- /dev/null >>> +++ b/arch/arm/mach-sunplus/cpuidle-sunplus.c >>> @@ -0,0 +1,88 @@ >>> +// SPDX-License-Identifier: GPL-2.0-only >>> +/* >>> + * SP7021 cpu idle Driver. >>> + * Copyright (C) Sunplus Tech / Tibbo Tech. >>> + */ >>> +#define pr_fmt(fmt) "CPUidle arm: " fmt >>> + >>> +#include <linux/cpuidle.h> >>> +#include <linux/of_device.h> >>> +#include <linux/platform_data/cpuidle-sunplus.h> >>> + >>> +#include <asm/cpuidle.h> >>> + >>> +typedef int (*idle_fn)(void); >>> + >>> +static DEFINE_PER_CPU(idle_fn*, sp7021_idle_ops); >>> + >>> +static int sp7021_cpuidle_enter(unsigned long index) { >>> + return __this_cpu_read(sp7021_idle_ops)[index](); >>> +} >>> +static int sp7021_cpu_spc(void) >>> +{ >>> + cpu_v7_do_idle(); /* idle to WFI */ >>> + return 0; >>> +} >>> +static const struct of_device_id sp7021_idle_state_match[] = { >>> + { .compatible = "arm,idle-state", .data = sp7021_cpu_spc }, >>> + { }, >>> +}; >> >> This is confusing. You want to have two drivers to bind to the same compatible? As I wrote in the >> previous messages, you should simply use arm,idle-state just like few other architectures. >> >> >> Best regards, >> Krzysztof > > > The patch v5 implemented according your comment. > Used common part of arm,idle-state. > Create new enable-method for cpuidle.ops function. > It only have arm cpuidle driver exist now, no two drivers to bind to the same compatible. > > What do you mean " simply use arm,idle-state just like few other architectures "? > I mean, do it similarly (by using arm,idle-state and other related properties) to for example ti,am4372/ti,am3352. Best regards, Krzysztof
On Tue, Mar 01, 2022 at 09:18:31AM +0000, Edwin Chiu 邱垂峰 wrote: > > > > You really don't need a cpuidle driver to just WFI for any states. > > Add the driver when you have something non WFI in the suspend function. > > This is still valid and you haven't responded to this. > > > +static const struct of_device_id sp7021_idle_state_match[] = { > > > + { .compatible = "arm,idle-state", .data = sp7021_cpu_spc }, > > > + { }, > > > +}; > > > > This is better than adding new driver like you did in previous version. > > > > I did a quick check but couldn't figure out. How do cpus get switched ON > > or OFF on this platform(for example during CPU hotplug) ?. > > > > In this patch, I just want to submit cpuidle function. > So there have no cpu hotplug function now. You need to document the binding now for both idle and hotplug. You can't mix and match. You can either use PSCI or custom "sunplus,sc-smp" for both cpu on/off and suspend. So you must document it now even if you don't plan to support hotplug now. And when you add later, you must use the same method. However, you still don't need this driver for just WFI, so please explain why you think otherwise. Until then, you still won't get ACK from my side.
> -----Original Message----- > From: Krzysztof Kozlowski <krzk@kernel.org> > Sent: Tuesday, March 1, 2022 7:34 PM > To: Edwin Chiu 邱垂峰 <edwin.chiu@sunplus.com>; Edwin Chiu <edwinchiu0505tw@gmail.com>; > robh+dt@kernel.org; devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; rafael@kernel.org; > daniel.lezcano@linaro.org; linux-pm@vger.kernel.org > Subject: Re: [PATCH v5] cpuidle: sunplus: Create cpuidle driver for sunplus sp7021 > > On 01/03/2022 10:30, Edwin Chiu 邱垂峰 wrote: > > > > > >> -----Original Message----- > >> From: Krzysztof Kozlowski <krzk@kernel.org> > >> Sent: Tuesday, February 22, 2022 12:48 AM > >> To: Edwin Chiu <edwinchiu0505tw@gmail.com>; Edwin Chiu 邱垂峰 > >> <edwin.chiu@sunplus.com>; > >> robh+dt@kernel.org; devicetree@vger.kernel.org; > >> robh+linux-kernel@vger.kernel.org; rafael@kernel.org; > >> daniel.lezcano@linaro.org; linux-pm@vger.kernel.org > >> Subject: Re: [PATCH v5] cpuidle: sunplus: Create cpuidle driver for > >> sunplus sp7021 > >> > >> On 21/02/2022 08:26, Edwin Chiu wrote: > >>> Create cpuidle driver for sunplus sp7021 chip > >>> > >>> Signed-off-by: Edwin Chiu <edwinchiu0505tw@gmail.com> > >>> --- > >>> Changes in v3 > >>> - Rearrangement #include sequence > >>> - Change remark style to /*~*/ > >>> - Align author email address to same as sob > >>> - Optimal code > >>> Changes in v4 > >>> - According Rob Herringrobh's comment > >>> There is no need for this binding. > >>> Just wanting a different driver is not a reason > >>> for a duplicate schema. > >>> So remove yaml file and submit driver again. > >>> Changes in v5 > >>> - According Krzysztof's comment > >>> You either use appropriate compatible in DT > >>> or add your compatible to cpuidle-arm. > >>> Even if this did not work, then the solution is to > >>> use common parts, not to duplicate entire driver. > >>> According Sudeep's comment > >>> In short NACK for any dedicated driver for this platform, > >>> use the generic cpuidle-arm driver with appropriate platform hooks > >>> Create cpuidle-sunplus.c in arch/arm/mach-sunplus/ > >>> for hook generic cpuidle-arm driver > >>> > >>> MAINTAINERS | 6 ++ > >>> arch/arm/mach-sunplus/cpuidle-sunplus.c | 88 +++++++++++++++++ > >>> include/linux/platform_data/cpuidle-sunplus.h | 12 ++++ > >>> 3 files changed, 106 insertions(+) > >>> create mode 100644 arch/arm/mach-sunplus/cpuidle-sunplus.c > >>> create mode 100644 include/linux/platform_data/cpuidle-sunplus.h > >>> > >>> diff --git a/MAINTAINERS b/MAINTAINERS index e0dca8f..5c96428 100644 > >>> --- a/MAINTAINERS > >>> +++ b/MAINTAINERS > >>> @@ -18252,6 +18252,12 @@ L: netdev@vger.kernel.org > >>> S: Maintained > >>> F: drivers/net/ethernet/dlink/sundance.c > >>> > >>> +SUNPLUS CPUIDLE DRIVER > >>> +M: Edwin Chiu <edwinchiu0505tw@gmail.com> > >>> +S: Maintained > >>> +F: arch/arm/mach-sunplus/cpuidle-sunplus.c > >>> +F: include/linux/platform_data/cpuidle-sunplus.h > >>> + > >>> SUPERH > >>> M: Yoshinori Sato <ysato@users.sourceforge.jp> > >>> M: Rich Felker <dalias@libc.org> > >>> diff --git a/arch/arm/mach-sunplus/cpuidle-sunplus.c > >>> b/arch/arm/mach-sunplus/cpuidle-sunplus.c > >>> new file mode 100644 > >>> index 0000000..e9d9738 > >>> --- /dev/null > >>> +++ b/arch/arm/mach-sunplus/cpuidle-sunplus.c > >>> @@ -0,0 +1,88 @@ > >>> +// SPDX-License-Identifier: GPL-2.0-only > >>> +/* > >>> + * SP7021 cpu idle Driver. > >>> + * Copyright (C) Sunplus Tech / Tibbo Tech. > >>> + */ > >>> +#define pr_fmt(fmt) "CPUidle arm: " fmt > >>> + > >>> +#include <linux/cpuidle.h> > >>> +#include <linux/of_device.h> > >>> +#include <linux/platform_data/cpuidle-sunplus.h> > >>> + > >>> +#include <asm/cpuidle.h> > >>> + > >>> +typedef int (*idle_fn)(void); > >>> + > >>> +static DEFINE_PER_CPU(idle_fn*, sp7021_idle_ops); > >>> + > >>> +static int sp7021_cpuidle_enter(unsigned long index) { > >>> + return __this_cpu_read(sp7021_idle_ops)[index](); > >>> +} > >>> +static int sp7021_cpu_spc(void) > >>> +{ > >>> + cpu_v7_do_idle(); /* idle to WFI */ > >>> + return 0; > >>> +} > >>> +static const struct of_device_id sp7021_idle_state_match[] = { > >>> + { .compatible = "arm,idle-state", .data = sp7021_cpu_spc }, > >>> + { }, > >>> +}; > >> > >> This is confusing. You want to have two drivers to bind to the same > >> compatible? As I wrote in the previous messages, you should simply use arm,idle-state just like few > other architectures. > >> > >> > >> Best regards, > >> Krzysztof > > > > > > The patch v5 implemented according your comment. > > Used common part of arm,idle-state. > > Create new enable-method for cpuidle.ops function. > > It only have arm cpuidle driver exist now, no two drivers to bind to the same compatible. > > > > What do you mean " simply use arm,idle-state just like few other architectures "? > > > > I mean, do it similarly (by using arm,idle-state and other related > properties) to for example ti,am4372/ti,am3352. > > Best regards, > Krzysztof The am3352 cpuidle code structure is very similar to ours. Used enable-method = "ti,am3352" and compatible = "arm,idle-state" in am33xx.dtsi Used CPUIDLE_METHOD_OF_DECLARE(pm33xx_idle, "ti,am3352", &amx3_cpuidle_ops) in pm33xx-core.c The difference are am3352 amx3_idle_init(~) assign idle_states[i].wfi_flags = states[i].wfi_flags; amx3_idle_enter(~) call idle_fn(idle_state->wfi_flags) sunplus-sp7021 sp7021_cpuidle_init(~) assign fns[i] = idle_fns[i]; sp7021_cpuidle_enter(~) call __this_cpu_read(sp7021_idle_ops)[index](); I don't think am3352 cpuidle code architecture simpler than ours. The idle_fn function need more complex method to be assign. How do you think? 邱垂峰 EdwinChiu 智能運算專案 T: +886-3-5786005 ext.2590 edwin.chiu@sunplus.com 300 新竹科學園區創新一路19號
> -----Original Message----- > From: Sudeep Holla <sudeep.holla@arm.com> > Sent: Thursday, March 3, 2022 6:03 PM > To: Krzysztof Kozlowski <krzk@kernel.org> > Cc: Edwin Chiu 邱垂峰 <edwin.chiu@sunplus.com>; Edwin Chiu <edwinchiu0505tw@gmail.com>; > Sudeep Holla <sudeep.holla@arm.com>; robh+dt@kernel.org; devicetree@vger.kernel.org; > linux-kernel@vger.kernel.org; rafael@kernel.org; daniel.lezcano@linaro.org; linux-pm@vger.kernel.org > Subject: Re: [PATCH v5] cpuidle: sunplus: Create cpuidle driver for sunplus sp7021 > > On Thu, Mar 03, 2022 at 10:34:31AM +0100, Krzysztof Kozlowski wrote: > > On 03/03/2022 10:01, Edwin Chiu 邱垂峰 wrote: > > > > > > > > >> -----Original Message----- > > >> From: Krzysztof Kozlowski <krzk@kernel.org> > > >> Sent: Tuesday, March 1, 2022 7:34 PM > > >> To: Edwin Chiu 邱垂峰 <edwin.chiu@sunplus.com>; Edwin Chiu > > >> <edwinchiu0505tw@gmail.com>; > > >> robh+dt@kernel.org; devicetree@vger.kernel.org; > > >> robh+linux-kernel@vger.kernel.org; rafael@kernel.org; > > >> daniel.lezcano@linaro.org; linux-pm@vger.kernel.org > > >> Subject: Re: [PATCH v5] cpuidle: sunplus: Create cpuidle driver for > > >> sunplus sp7021 > > >> > > >> On 01/03/2022 10:30, Edwin Chiu 邱垂峰 wrote: > > >>> > > >>> > > >>>> -----Original Message----- > > >>>> From: Krzysztof Kozlowski <krzk@kernel.org> > > >>>> Sent: Tuesday, February 22, 2022 12:48 AM > > >>>> To: Edwin Chiu <edwinchiu0505tw@gmail.com>; Edwin Chiu 邱垂峰 > > >>>> <edwin.chiu@sunplus.com>; > > >>>> robh+dt@kernel.org; devicetree@vger.kernel.org; > > >>>> robh+linux-kernel@vger.kernel.org; rafael@kernel.org; > > >>>> daniel.lezcano@linaro.org; linux-pm@vger.kernel.org > > >>>> Subject: Re: [PATCH v5] cpuidle: sunplus: Create cpuidle driver > > >>>> for sunplus sp7021 > > >>>> > > >>>> On 21/02/2022 08:26, Edwin Chiu wrote: > > >>>>> Create cpuidle driver for sunplus sp7021 chip > > >>>>> > > >>>>> Signed-off-by: Edwin Chiu <edwinchiu0505tw@gmail.com> > > >>>>> --- > > >>>>> Changes in v3 > > >>>>> - Rearrangement #include sequence > > >>>>> - Change remark style to /*~*/ > > >>>>> - Align author email address to same as sob > > >>>>> - Optimal code > > >>>>> Changes in v4 > > >>>>> - According Rob Herringrobh's comment > > >>>>> There is no need for this binding. > > >>>>> Just wanting a different driver is not a reason > > >>>>> for a duplicate schema. > > >>>>> So remove yaml file and submit driver again. > > >>>>> Changes in v5 > > >>>>> - According Krzysztof's comment > > >>>>> You either use appropriate compatible in DT > > >>>>> or add your compatible to cpuidle-arm. > > >>>>> Even if this did not work, then the solution is to > > >>>>> use common parts, not to duplicate entire driver. > > >>>>> According Sudeep's comment > > >>>>> In short NACK for any dedicated driver for this platform, > > >>>>> use the generic cpuidle-arm driver with appropriate platform hooks > > >>>>> Create cpuidle-sunplus.c in arch/arm/mach-sunplus/ > > >>>>> for hook generic cpuidle-arm driver > > >>>>> > > >>>>> MAINTAINERS | 6 ++ > > >>>>> arch/arm/mach-sunplus/cpuidle-sunplus.c | 88 +++++++++++++++++ > > >>>>> include/linux/platform_data/cpuidle-sunplus.h | 12 ++++ > > >>>>> 3 files changed, 106 insertions(+) create mode 100644 > > >>>>> arch/arm/mach-sunplus/cpuidle-sunplus.c > > >>>>> create mode 100644 > > >>>>> include/linux/platform_data/cpuidle-sunplus.h > > >>>>> > > >>>>> diff --git a/MAINTAINERS b/MAINTAINERS index e0dca8f..5c96428 > > >>>>> 100644 > > >>>>> --- a/MAINTAINERS > > >>>>> +++ b/MAINTAINERS > > >>>>> @@ -18252,6 +18252,12 @@ L: netdev@vger.kernel.org > > >>>>> S: Maintained > > >>>>> F: drivers/net/ethernet/dlink/sundance.c > > >>>>> > > >>>>> +SUNPLUS CPUIDLE DRIVER > > >>>>> +M: Edwin Chiu <edwinchiu0505tw@gmail.com> > > >>>>> +S: Maintained > > >>>>> +F: arch/arm/mach-sunplus/cpuidle-sunplus.c > > >>>>> +F: include/linux/platform_data/cpuidle-sunplus.h > > >>>>> + > > >>>>> SUPERH > > >>>>> M: Yoshinori Sato <ysato@users.sourceforge.jp> > > >>>>> M: Rich Felker <dalias@libc.org> > > >>>>> diff --git a/arch/arm/mach-sunplus/cpuidle-sunplus.c > > >>>>> b/arch/arm/mach-sunplus/cpuidle-sunplus.c > > >>>>> new file mode 100644 > > >>>>> index 0000000..e9d9738 > > >>>>> --- /dev/null > > >>>>> +++ b/arch/arm/mach-sunplus/cpuidle-sunplus.c > > >>>>> @@ -0,0 +1,88 @@ > > >>>>> +// SPDX-License-Identifier: GPL-2.0-only > > >>>>> +/* > > >>>>> + * SP7021 cpu idle Driver. > > >>>>> + * Copyright (C) Sunplus Tech / Tibbo Tech. > > >>>>> + */ > > >>>>> +#define pr_fmt(fmt) "CPUidle arm: " fmt > > >>>>> + > > >>>>> +#include <linux/cpuidle.h> > > >>>>> +#include <linux/of_device.h> > > >>>>> +#include <linux/platform_data/cpuidle-sunplus.h> > > >>>>> + > > >>>>> +#include <asm/cpuidle.h> > > >>>>> + > > >>>>> +typedef int (*idle_fn)(void); > > >>>>> + > > >>>>> +static DEFINE_PER_CPU(idle_fn*, sp7021_idle_ops); > > >>>>> + > > >>>>> +static int sp7021_cpuidle_enter(unsigned long index) { > > >>>>> + return __this_cpu_read(sp7021_idle_ops)[index](); > > >>>>> +} > > >>>>> +static int sp7021_cpu_spc(void) { > > >>>>> + cpu_v7_do_idle(); /* idle to WFI */ > > >>>>> + return 0; > > >>>>> +} > > >>>>> +static const struct of_device_id sp7021_idle_state_match[] = { > > >>>>> + { .compatible = "arm,idle-state", .data = sp7021_cpu_spc }, > > >>>>> + { }, > > >>>>> +}; > > >>>> > > >>>> This is confusing. You want to have two drivers to bind to the > > >>>> same compatible? As I wrote in the previous messages, you should > > >>>> simply use arm,idle-state just like few > > >> other architectures. > > >>>> > > >>>> > > >>>> Best regards, > > >>>> Krzysztof > > >>> > > >>> > > >>> The patch v5 implemented according your comment. > > >>> Used common part of arm,idle-state. > > >>> Create new enable-method for cpuidle.ops function. > > >>> It only have arm cpuidle driver exist now, no two drivers to bind to the same compatible. > > >>> > > >>> What do you mean " simply use arm,idle-state just like few other architectures "? > > >>> > > >> > > >> I mean, do it similarly (by using arm,idle-state and other related > > >> properties) to for example ti,am4372/ti,am3352. > > >> > > >> Best regards, > > >> Krzysztof > > > > > > > > > The am3352 cpuidle code structure is very similar to ours. > > > Used enable-method = "ti,am3352" and compatible = "arm,idle-state" > > > in am33xx.dtsi Used CPUIDLE_METHOD_OF_DECLARE(pm33xx_idle, > > > "ti,am3352", &amx3_cpuidle_ops) in pm33xx-core.c > > > > > > The difference are > > > am3352 > > > amx3_idle_init(~) assign idle_states[i].wfi_flags = > > > states[i].wfi_flags; > > > amx3_idle_enter(~) call idle_fn(idle_state->wfi_flags) > > > > > > sunplus-sp7021 > > > sp7021_cpuidle_init(~) assign fns[i] = idle_fns[i]; > > > sp7021_cpuidle_enter(~) call > > > __this_cpu_read(sp7021_idle_ops)[index](); > > > > > > I don't think am3352 cpuidle code architecture simpler than ours. > > > The idle_fn function need more complex method to be assign. > > > How do you think? > > > > You duplicated a driver, entire pieces of code. This is not acceptable. > > Therefore it does not really make sense to discuss whether duplicated > > solution seems simpler or not... We won't accept duplicated code. > > Especially for WFI-only driver. > > > > +1 for above comment. > > In addition, the reference platform am33xx* doesn't seem to support hotplug (may be I am missing to > see but quick grep gave no results) and their idle is definitely not just WFI. So what I asked is that please > document the chosen "sunplus,sc-smp" as bot cpu idle and hotplug methods and when you support non > WFI states, we can revisit this. Also you must stick to this hotplug method whenever you decided to > support it. > > > -- > Regards, > Sudeep Thanks your advice. Look like key point still only WFI function when cpuidle. As I explain before, only enable generic ARM cpuidle driver is not work. It need enable-method code to assign cpuidle_ops functions. "psci" is one of enable-method, but there have problem in my side due to smc or secure code unsupported. So I create cpuidle-sunplus.c code with "sunplus,sc-smp" to let cpuidle code complete for our source code. With this structure, I can add more custom low power code in the future. What does it mean for "please document the chosen "sunplus,sc-smp" as bot cpu idle and hotplug methods" ? Does it mean "edit yaml file"? (Previously, I submit yaml file also, but Rob say I don't need submit when I use compatible="arm,idle-state") 邱垂峰 EdwinChiu 智能運算專案 T: +886-3-5786005 ext.2590 edwin.chiu@sunplus.com 300 新竹科學園區創新一路19號
diff --git a/MAINTAINERS b/MAINTAINERS index e0dca8f..5c96428 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -18252,6 +18252,12 @@ L: netdev@vger.kernel.org S: Maintained F: drivers/net/ethernet/dlink/sundance.c +SUNPLUS CPUIDLE DRIVER +M: Edwin Chiu <edwinchiu0505tw@gmail.com> +S: Maintained +F: arch/arm/mach-sunplus/cpuidle-sunplus.c +F: include/linux/platform_data/cpuidle-sunplus.h + SUPERH M: Yoshinori Sato <ysato@users.sourceforge.jp> M: Rich Felker <dalias@libc.org> diff --git a/arch/arm/mach-sunplus/cpuidle-sunplus.c b/arch/arm/mach-sunplus/cpuidle-sunplus.c new file mode 100644 index 0000000..e9d9738 --- /dev/null +++ b/arch/arm/mach-sunplus/cpuidle-sunplus.c @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * SP7021 cpu idle Driver. + * Copyright (C) Sunplus Tech / Tibbo Tech. + */ +#define pr_fmt(fmt) "CPUidle arm: " fmt + +#include <linux/cpuidle.h> +#include <linux/of_device.h> +#include <linux/platform_data/cpuidle-sunplus.h> + +#include <asm/cpuidle.h> + +typedef int (*idle_fn)(void); + +static DEFINE_PER_CPU(idle_fn*, sp7021_idle_ops); + +static int sp7021_cpuidle_enter(unsigned long index) +{ + return __this_cpu_read(sp7021_idle_ops)[index](); +} +static int sp7021_cpu_spc(void) +{ + cpu_v7_do_idle(); /* idle to WFI */ + return 0; +} +static const struct of_device_id sp7021_idle_state_match[] = { + { .compatible = "arm,idle-state", .data = sp7021_cpu_spc }, + { }, +}; +static int sp7021_cpuidle_init(struct device_node *cpu_node, int cpu) +{ + const struct of_device_id *match_id; + struct device_node *state_node; + int i; + int state_count = 1; + idle_fn idle_fns[CPUIDLE_STATE_MAX]; + idle_fn *fns; + + for (i = 0; ; i++) { + state_node = of_parse_phandle(cpu_node, "cpu-idle-states", i); + if (!state_node) + break; + + if (!of_device_is_available(state_node)) + continue; + + if (i == CPUIDLE_STATE_MAX) { + pr_warn("%s: cpuidle states reached max possible\n", + __func__); + break; + } + + match_id = of_match_node(sp7021_idle_state_match, state_node); + if (!match_id) + return -ENODEV; + + idle_fns[state_count] = match_id->data; + + state_count++; + } + + if (state_count == 1) + goto check_sp; + + fns = devm_kcalloc(get_cpu_device(cpu), state_count, sizeof(*fns), + GFP_KERNEL); + if (!fns) + return -ENOMEM; + + for (i = 1; i < state_count; i++) + fns[i] = idle_fns[i]; + + per_cpu(sp7021_idle_ops, cpu) = fns; + +check_sp: + return 0; +} +static const struct cpuidle_ops sp7021_cpuidle_ops __initconst = { + .suspend = sp7021_cpuidle_enter, + .init = sp7021_cpuidle_init, +}; +CPUIDLE_METHOD_OF_DECLARE(sc_smp, "sunplus,sc-smp", &sp7021_cpuidle_ops); + +MODULE_AUTHOR("Edwin Chiu <edwinchiu0505tw@gmail.com>"); +MODULE_DESCRIPTION("Sunplus sp7021 cpuidle driver"); +MODULE_LICENSE("GPL"); + diff --git a/include/linux/platform_data/cpuidle-sunplus.h b/include/linux/platform_data/cpuidle-sunplus.h new file mode 100644 index 0000000..12e98e5 --- /dev/null +++ b/include/linux/platform_data/cpuidle-sunplus.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * SP7021 cpu idle Driver. + * Copyright (C) Sunplus Tech / Tibbo Tech. + */ + +#ifndef __CPUIDLE_SP7021_H +#define __CPUIDLE_SP7021_H + +extern int cpu_v7_do_idle(void); + +#endif
Create cpuidle driver for sunplus sp7021 chip Signed-off-by: Edwin Chiu <edwinchiu0505tw@gmail.com> --- Changes in v3 - Rearrangement #include sequence - Change remark style to /*~*/ - Align author email address to same as sob - Optimal code Changes in v4 - According Rob Herringrobh's comment There is no need for this binding. Just wanting a different driver is not a reason for a duplicate schema. So remove yaml file and submit driver again. Changes in v5 - According Krzysztof's comment You either use appropriate compatible in DT or add your compatible to cpuidle-arm. Even if this did not work, then the solution is to use common parts, not to duplicate entire driver. According Sudeep's comment In short NACK for any dedicated driver for this platform, use the generic cpuidle-arm driver with appropriate platform hooks Create cpuidle-sunplus.c in arch/arm/mach-sunplus/ for hook generic cpuidle-arm driver MAINTAINERS | 6 ++ arch/arm/mach-sunplus/cpuidle-sunplus.c | 88 +++++++++++++++++ include/linux/platform_data/cpuidle-sunplus.h | 12 ++++ 3 files changed, 106 insertions(+) create mode 100644 arch/arm/mach-sunplus/cpuidle-sunplus.c create mode 100644 include/linux/platform_data/cpuidle-sunplus.h