* [PATCH 1/3] PM: wakeup: Add routine to help fetch wakeup source object.
@ 2019-05-17 2:47 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-05-17 2:47 UTC (permalink / raw)
To: Li Yang, Rob Herring, Mark Rutland
Cc: Rafael J . Wysocki, Pavel Machek, Len Brown, Greg Kroah-Hartman,
linuxppc-dev, linux-arm-kernel, devicetree, linux-kernel,
linux-pm, Ran Wang
Some user might want to go through all registered wakeup sources
and doing things accordingly. For example, SoC PM driver might need to
do HW programming to prevent powering down specific IP which wakeup
source depending on. And is user's responsibility to identify if this
wakeup source he is interested in.
Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
---
drivers/base/power/wakeup.c | 18 ++++++++++++++++++
include/linux/pm_wakeup.h | 3 +++
2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 5fa1898..8d75795 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -14,6 +14,7 @@
#include <linux/suspend.h>
#include <linux/seq_file.h>
#include <linux/debugfs.h>
+#include <linux/of_device.h>
#include <linux/pm_wakeirq.h>
#include <trace/events/power.h>
@@ -236,6 +237,22 @@ void wakeup_source_unregister(struct wakeup_source *ws)
}
}
EXPORT_SYMBOL_GPL(wakeup_source_unregister);
+/**
+ * wakeup_source_get_next - Get next wakeup source from the list
+ * @ws: Previous wakeup source object, null means caller want first one.
+ */
+struct wakeup_source *wakeup_source_get_next(struct wakeup_source *ws)
+{
+ struct list_head *ws_head = &wakeup_sources;
+
+ if (ws)
+ return list_next_or_null_rcu(ws_head, &ws->entry,
+ struct wakeup_source, entry);
+ else
+ return list_entry_rcu(ws_head->next,
+ struct wakeup_source, entry);
+}
+EXPORT_SYMBOL_GPL(wakeup_source_get_next);
/**
* device_wakeup_attach - Attach a wakeup source object to a device object.
@@ -252,6 +269,7 @@ static int device_wakeup_attach(struct device *dev, struct wakeup_source *ws)
return -EEXIST;
}
dev->power.wakeup = ws;
+ ws->attached_dev = dev;
if (dev->power.wakeirq)
device_wakeup_attach_irq(dev, dev->power.wakeirq);
spin_unlock_irq(&dev->power.lock);
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h
index 4238dde..1335487 100644
--- a/include/linux/pm_wakeup.h
+++ b/include/linux/pm_wakeup.h
@@ -50,6 +50,7 @@
* @wakeup_count: Number of times the wakeup source might abort suspend.
* @active: Status of the wakeup source.
* @has_timeout: The wakeup source has been activated with a timeout.
+ * @attached_dev: The device it attached to
*/
struct wakeup_source {
const char *name;
@@ -70,6 +71,7 @@ struct wakeup_source {
unsigned long wakeup_count;
bool active:1;
bool autosleep_enabled:1;
+ struct device *attached_dev;
};
#ifdef CONFIG_PM_SLEEP
@@ -102,6 +104,7 @@ static inline void device_set_wakeup_path(struct device *dev)
extern void wakeup_source_remove(struct wakeup_source *ws);
extern struct wakeup_source *wakeup_source_register(const char *name);
extern void wakeup_source_unregister(struct wakeup_source *ws);
+extern struct wakeup_source *wakeup_source_get_next(struct wakeup_source *ws);
extern int device_wakeup_enable(struct device *dev);
extern int device_wakeup_disable(struct device *dev);
extern void device_set_wakeup_capable(struct device *dev, bool capable);
--
1.7.1
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 1/3] PM: wakeup: Add routine to help fetch wakeup source object.
@ 2019-05-17 2:47 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-05-17 2:47 UTC (permalink / raw)
To: Li Yang, Rob Herring, Mark Rutland
Cc: Len Brown, devicetree, Greg Kroah-Hartman, linux-pm,
Rafael J . Wysocki, linux-kernel, Pavel Machek, Ran Wang,
linuxppc-dev, linux-arm-kernel
Some user might want to go through all registered wakeup sources
and doing things accordingly. For example, SoC PM driver might need to
do HW programming to prevent powering down specific IP which wakeup
source depending on. And is user's responsibility to identify if this
wakeup source he is interested in.
Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
---
drivers/base/power/wakeup.c | 18 ++++++++++++++++++
include/linux/pm_wakeup.h | 3 +++
2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 5fa1898..8d75795 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -14,6 +14,7 @@
#include <linux/suspend.h>
#include <linux/seq_file.h>
#include <linux/debugfs.h>
+#include <linux/of_device.h>
#include <linux/pm_wakeirq.h>
#include <trace/events/power.h>
@@ -236,6 +237,22 @@ void wakeup_source_unregister(struct wakeup_source *ws)
}
}
EXPORT_SYMBOL_GPL(wakeup_source_unregister);
+/**
+ * wakeup_source_get_next - Get next wakeup source from the list
+ * @ws: Previous wakeup source object, null means caller want first one.
+ */
+struct wakeup_source *wakeup_source_get_next(struct wakeup_source *ws)
+{
+ struct list_head *ws_head = &wakeup_sources;
+
+ if (ws)
+ return list_next_or_null_rcu(ws_head, &ws->entry,
+ struct wakeup_source, entry);
+ else
+ return list_entry_rcu(ws_head->next,
+ struct wakeup_source, entry);
+}
+EXPORT_SYMBOL_GPL(wakeup_source_get_next);
/**
* device_wakeup_attach - Attach a wakeup source object to a device object.
@@ -252,6 +269,7 @@ static int device_wakeup_attach(struct device *dev, struct wakeup_source *ws)
return -EEXIST;
}
dev->power.wakeup = ws;
+ ws->attached_dev = dev;
if (dev->power.wakeirq)
device_wakeup_attach_irq(dev, dev->power.wakeirq);
spin_unlock_irq(&dev->power.lock);
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h
index 4238dde..1335487 100644
--- a/include/linux/pm_wakeup.h
+++ b/include/linux/pm_wakeup.h
@@ -50,6 +50,7 @@
* @wakeup_count: Number of times the wakeup source might abort suspend.
* @active: Status of the wakeup source.
* @has_timeout: The wakeup source has been activated with a timeout.
+ * @attached_dev: The device it attached to
*/
struct wakeup_source {
const char *name;
@@ -70,6 +71,7 @@ struct wakeup_source {
unsigned long wakeup_count;
bool active:1;
bool autosleep_enabled:1;
+ struct device *attached_dev;
};
#ifdef CONFIG_PM_SLEEP
@@ -102,6 +104,7 @@ static inline void device_set_wakeup_path(struct device *dev)
extern void wakeup_source_remove(struct wakeup_source *ws);
extern struct wakeup_source *wakeup_source_register(const char *name);
extern void wakeup_source_unregister(struct wakeup_source *ws);
+extern struct wakeup_source *wakeup_source_get_next(struct wakeup_source *ws);
extern int device_wakeup_enable(struct device *dev);
extern int device_wakeup_disable(struct device *dev);
extern void device_set_wakeup_capable(struct device *dev, bool capable);
--
1.7.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 1/3] PM: wakeup: Add routine to help fetch wakeup source object.
@ 2019-05-17 2:47 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-05-17 2:47 UTC (permalink / raw)
To: Li Yang, Rob Herring, Mark Rutland
Cc: Len Brown, devicetree, Greg Kroah-Hartman, linux-pm,
Rafael J . Wysocki, linux-kernel, Pavel Machek, Ran Wang,
linuxppc-dev, linux-arm-kernel
Some user might want to go through all registered wakeup sources
and doing things accordingly. For example, SoC PM driver might need to
do HW programming to prevent powering down specific IP which wakeup
source depending on. And is user's responsibility to identify if this
wakeup source he is interested in.
Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
---
drivers/base/power/wakeup.c | 18 ++++++++++++++++++
include/linux/pm_wakeup.h | 3 +++
2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 5fa1898..8d75795 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -14,6 +14,7 @@
#include <linux/suspend.h>
#include <linux/seq_file.h>
#include <linux/debugfs.h>
+#include <linux/of_device.h>
#include <linux/pm_wakeirq.h>
#include <trace/events/power.h>
@@ -236,6 +237,22 @@ void wakeup_source_unregister(struct wakeup_source *ws)
}
}
EXPORT_SYMBOL_GPL(wakeup_source_unregister);
+/**
+ * wakeup_source_get_next - Get next wakeup source from the list
+ * @ws: Previous wakeup source object, null means caller want first one.
+ */
+struct wakeup_source *wakeup_source_get_next(struct wakeup_source *ws)
+{
+ struct list_head *ws_head = &wakeup_sources;
+
+ if (ws)
+ return list_next_or_null_rcu(ws_head, &ws->entry,
+ struct wakeup_source, entry);
+ else
+ return list_entry_rcu(ws_head->next,
+ struct wakeup_source, entry);
+}
+EXPORT_SYMBOL_GPL(wakeup_source_get_next);
/**
* device_wakeup_attach - Attach a wakeup source object to a device object.
@@ -252,6 +269,7 @@ static int device_wakeup_attach(struct device *dev, struct wakeup_source *ws)
return -EEXIST;
}
dev->power.wakeup = ws;
+ ws->attached_dev = dev;
if (dev->power.wakeirq)
device_wakeup_attach_irq(dev, dev->power.wakeirq);
spin_unlock_irq(&dev->power.lock);
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h
index 4238dde..1335487 100644
--- a/include/linux/pm_wakeup.h
+++ b/include/linux/pm_wakeup.h
@@ -50,6 +50,7 @@
* @wakeup_count: Number of times the wakeup source might abort suspend.
* @active: Status of the wakeup source.
* @has_timeout: The wakeup source has been activated with a timeout.
+ * @attached_dev: The device it attached to
*/
struct wakeup_source {
const char *name;
@@ -70,6 +71,7 @@ struct wakeup_source {
unsigned long wakeup_count;
bool active:1;
bool autosleep_enabled:1;
+ struct device *attached_dev;
};
#ifdef CONFIG_PM_SLEEP
@@ -102,6 +104,7 @@ static inline void device_set_wakeup_path(struct device *dev)
extern void wakeup_source_remove(struct wakeup_source *ws);
extern struct wakeup_source *wakeup_source_register(const char *name);
extern void wakeup_source_unregister(struct wakeup_source *ws);
+extern struct wakeup_source *wakeup_source_get_next(struct wakeup_source *ws);
extern int device_wakeup_enable(struct device *dev);
extern int device_wakeup_disable(struct device *dev);
extern void device_set_wakeup_capable(struct device *dev, bool capable);
--
1.7.1
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 2/3] Documentation: dt: binding: fsl: Add 'little-endian' and update Chassis define
2019-05-17 2:47 ` Ran Wang
(?)
@ 2019-05-17 2:47 ` Ran Wang
-1 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-05-17 2:47 UTC (permalink / raw)
To: Li Yang, Rob Herring, Mark Rutland
Cc: Rafael J . Wysocki, Pavel Machek, Len Brown, Greg Kroah-Hartman,
linuxppc-dev, linux-arm-kernel, devicetree, linux-kernel,
linux-pm, Ran Wang
By default, QorIQ SoC's RCPM register block is Big Endian. But
there are some exceptions, such as LS1088A and LS2088A, are Little
Endian. So add this optional property to help identify them.
Actually LS2021A and other Layerscapes won't totally follow Chassis
2.1, so separate them from powerpc SoC.
Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
---
Documentation/devicetree/bindings/soc/fsl/rcpm.txt | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/Documentation/devicetree/bindings/soc/fsl/rcpm.txt b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
index e284e4e..058154c 100644
--- a/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
+++ b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
@@ -20,6 +20,7 @@ Required properites:
* "fsl,qoriq-rcpm-1.0": for chassis 1.0 rcpm
* "fsl,qoriq-rcpm-2.0": for chassis 2.0 rcpm
* "fsl,qoriq-rcpm-2.1": for chassis 2.1 rcpm
+ * "fsl,qoriq-rcpm-2.1+": for chassis 2.1+ rcpm
All references to "1.0" and "2.0" refer to the QorIQ chassis version to
which the chip complies.
@@ -27,7 +28,12 @@ Chassis Version Example Chips
--------------- -------------------------------
1.0 p4080, p5020, p5040, p2041, p3041
2.0 t4240, b4860, b4420
-2.1 t1040, ls1021
+2.1 t1040,
+2.1+ ls1021a, ls1012a, ls1043a, ls1046a
+
+Optional properties:
+ - little-endian : RCPM register block is Little Endian. Without it RCPM
+ will be Big Endian (default case).
Example:
The RCPM node for T4240:
--
1.7.1
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 2/3] Documentation: dt: binding: fsl: Add 'little-endian' and update Chassis define
@ 2019-05-17 2:47 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-05-17 2:47 UTC (permalink / raw)
To: Li Yang, Rob Herring, Mark Rutland
Cc: Len Brown, devicetree, Greg Kroah-Hartman, linux-pm,
Rafael J . Wysocki, linux-kernel, Pavel Machek, Ran Wang,
linuxppc-dev, linux-arm-kernel
By default, QorIQ SoC's RCPM register block is Big Endian. But
there are some exceptions, such as LS1088A and LS2088A, are Little
Endian. So add this optional property to help identify them.
Actually LS2021A and other Layerscapes won't totally follow Chassis
2.1, so separate them from powerpc SoC.
Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
---
Documentation/devicetree/bindings/soc/fsl/rcpm.txt | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/Documentation/devicetree/bindings/soc/fsl/rcpm.txt b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
index e284e4e..058154c 100644
--- a/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
+++ b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
@@ -20,6 +20,7 @@ Required properites:
* "fsl,qoriq-rcpm-1.0": for chassis 1.0 rcpm
* "fsl,qoriq-rcpm-2.0": for chassis 2.0 rcpm
* "fsl,qoriq-rcpm-2.1": for chassis 2.1 rcpm
+ * "fsl,qoriq-rcpm-2.1+": for chassis 2.1+ rcpm
All references to "1.0" and "2.0" refer to the QorIQ chassis version to
which the chip complies.
@@ -27,7 +28,12 @@ Chassis Version Example Chips
--------------- -------------------------------
1.0 p4080, p5020, p5040, p2041, p3041
2.0 t4240, b4860, b4420
-2.1 t1040, ls1021
+2.1 t1040,
+2.1+ ls1021a, ls1012a, ls1043a, ls1046a
+
+Optional properties:
+ - little-endian : RCPM register block is Little Endian. Without it RCPM
+ will be Big Endian (default case).
Example:
The RCPM node for T4240:
--
1.7.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 2/3] Documentation: dt: binding: fsl: Add 'little-endian' and update Chassis define
@ 2019-05-17 2:47 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-05-17 2:47 UTC (permalink / raw)
To: Li Yang, Rob Herring, Mark Rutland
Cc: Len Brown, devicetree, Greg Kroah-Hartman, linux-pm,
Rafael J . Wysocki, linux-kernel, Pavel Machek, Ran Wang,
linuxppc-dev, linux-arm-kernel
By default, QorIQ SoC's RCPM register block is Big Endian. But
there are some exceptions, such as LS1088A and LS2088A, are Little
Endian. So add this optional property to help identify them.
Actually LS2021A and other Layerscapes won't totally follow Chassis
2.1, so separate them from powerpc SoC.
Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
---
Documentation/devicetree/bindings/soc/fsl/rcpm.txt | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/Documentation/devicetree/bindings/soc/fsl/rcpm.txt b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
index e284e4e..058154c 100644
--- a/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
+++ b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
@@ -20,6 +20,7 @@ Required properites:
* "fsl,qoriq-rcpm-1.0": for chassis 1.0 rcpm
* "fsl,qoriq-rcpm-2.0": for chassis 2.0 rcpm
* "fsl,qoriq-rcpm-2.1": for chassis 2.1 rcpm
+ * "fsl,qoriq-rcpm-2.1+": for chassis 2.1+ rcpm
All references to "1.0" and "2.0" refer to the QorIQ chassis version to
which the chip complies.
@@ -27,7 +28,12 @@ Chassis Version Example Chips
--------------- -------------------------------
1.0 p4080, p5020, p5040, p2041, p3041
2.0 t4240, b4860, b4420
-2.1 t1040, ls1021
+2.1 t1040,
+2.1+ ls1021a, ls1012a, ls1043a, ls1046a
+
+Optional properties:
+ - little-endian : RCPM register block is Little Endian. Without it RCPM
+ will be Big Endian (default case).
Example:
The RCPM node for T4240:
--
1.7.1
^ permalink raw reply related [flat|nested] 50+ messages in thread
* Re: [PATCH 2/3] Documentation: dt: binding: fsl: Add 'little-endian' and update Chassis define
2019-05-17 2:47 ` Ran Wang
(?)
(?)
@ 2019-06-13 22:07 ` Rob Herring
-1 siblings, 0 replies; 50+ messages in thread
From: Rob Herring @ 2019-06-13 22:07 UTC (permalink / raw)
To: Ran Wang
Cc: Li Yang, Mark Rutland, Rafael J . Wysocki, Pavel Machek,
Len Brown, Greg Kroah-Hartman, linuxppc-dev, linux-arm-kernel,
devicetree, linux-kernel, linux-pm, Ran Wang
On Fri, 17 May 2019 10:47:47 +0800, Ran Wang wrote:
> By default, QorIQ SoC's RCPM register block is Big Endian. But
> there are some exceptions, such as LS1088A and LS2088A, are Little
> Endian. So add this optional property to help identify them.
>
> Actually LS2021A and other Layerscapes won't totally follow Chassis
> 2.1, so separate them from powerpc SoC.
>
> Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> ---
> Documentation/devicetree/bindings/soc/fsl/rcpm.txt | 8 +++++++-
> 1 files changed, 7 insertions(+), 1 deletions(-)
>
Reviewed-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 2/3] Documentation: dt: binding: fsl: Add 'little-endian' and update Chassis define
@ 2019-06-13 22:07 ` Rob Herring
0 siblings, 0 replies; 50+ messages in thread
From: Rob Herring @ 2019-06-13 22:07 UTC (permalink / raw)
To: Ran Wang
Cc: Mark Rutland, Len Brown, devicetree, Greg Kroah-Hartman,
linux-pm, Rafael J . Wysocki, linux-kernel, Li Yang,
Pavel Machek, Ran Wang, linuxppc-dev, linux-arm-kernel
On Fri, 17 May 2019 10:47:47 +0800, Ran Wang wrote:
> By default, QorIQ SoC's RCPM register block is Big Endian. But
> there are some exceptions, such as LS1088A and LS2088A, are Little
> Endian. So add this optional property to help identify them.
>
> Actually LS2021A and other Layerscapes won't totally follow Chassis
> 2.1, so separate them from powerpc SoC.
>
> Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> ---
> Documentation/devicetree/bindings/soc/fsl/rcpm.txt | 8 +++++++-
> 1 files changed, 7 insertions(+), 1 deletions(-)
>
Reviewed-by: Rob Herring <robh@kernel.org>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 2/3] Documentation: dt: binding: fsl: Add 'little-endian' and update Chassis define
@ 2019-06-13 22:07 ` Rob Herring
0 siblings, 0 replies; 50+ messages in thread
From: Rob Herring @ 2019-06-13 22:07 UTC (permalink / raw)
To: Ran Wang
Cc: Mark Rutland, Len Brown, devicetree, Greg Kroah-Hartman,
linux-pm, Rafael J . Wysocki, linux-kernel, Li Yang,
Pavel Machek, Ran Wang, linuxppc-dev, linux-arm-kernel
On Fri, 17 May 2019 10:47:47 +0800, Ran Wang wrote:
> By default, QorIQ SoC's RCPM register block is Big Endian. But
> there are some exceptions, such as LS1088A and LS2088A, are Little
> Endian. So add this optional property to help identify them.
>
> Actually LS2021A and other Layerscapes won't totally follow Chassis
> 2.1, so separate them from powerpc SoC.
>
> Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> ---
> Documentation/devicetree/bindings/soc/fsl/rcpm.txt | 8 +++++++-
> 1 files changed, 7 insertions(+), 1 deletions(-)
>
Reviewed-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 2/3] Documentation: dt: binding: fsl: Add 'little-endian' and update Chassis define
@ 2019-06-13 22:07 ` Rob Herring
0 siblings, 0 replies; 50+ messages in thread
From: Rob Herring @ 2019-06-13 22:07 UTC (permalink / raw)
Cc: Li Yang, Mark Rutland, Rafael J . Wysocki, Pavel Machek,
Len Brown, Greg Kroah-Hartman, linuxppc-dev, linux-arm-kernel,
devicetree, linux-kernel, linux-pm, Ran Wang
On Fri, 17 May 2019 10:47:47 +0800, Ran Wang wrote:
> By default, QorIQ SoC's RCPM register block is Big Endian. But
> there are some exceptions, such as LS1088A and LS2088A, are Little
> Endian. So add this optional property to help identify them.
>
> Actually LS2021A and other Layerscapes won't totally follow Chassis
> 2.1, so separate them from powerpc SoC.
>
> Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> ---
> Documentation/devicetree/bindings/soc/fsl/rcpm.txt | 8 +++++++-
> 1 files changed, 7 insertions(+), 1 deletions(-)
>
Reviewed-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
2019-05-17 2:47 ` Ran Wang
(?)
@ 2019-05-17 2:47 ` Ran Wang
-1 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-05-17 2:47 UTC (permalink / raw)
To: Li Yang, Rob Herring, Mark Rutland
Cc: Rafael J . Wysocki, Pavel Machek, Len Brown, Greg Kroah-Hartman,
linuxppc-dev, linux-arm-kernel, devicetree, linux-kernel,
linux-pm, Ran Wang
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 <ran.wang_1@nxp.com>
---
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 0000000..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 <ran.wang_1@nxp.com>,
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/suspend.h>
+#include <linux/kernel.h>
+
+#define RCPM_WAKEUP_CELL_MAX_SIZE 7
+
+struct rcpm {
+ unsigned int wakeup_cells;
+ void __iomem *ippdexpcr_base;
+ bool little_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 = &pdev->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(&pdev->dev, r);
+ if (IS_ERR(rcpm->ippdexpcr_base)) {
+ ret = PTR_ERR(rcpm->ippdexpcr_base);
+ return ret;
+ }
+
+ rcpm->little_endian = device_property_read_bool(
+ &pdev->dev, "little-endian");
+
+ ret = device_property_read_u32(&pdev->dev,
+ "fsl,#rcpm-wakeup-cells", &rcpm->wakeup_cells);
+ if (ret)
+ return ret;
+
+ dev_set_drvdata(&pdev->dev, rcpm);
+
+ return 0;
+}
+
+static const struct of_device_id rcpm_of_match[] = {
+ { .compatible = "fsl,qoriq-rcpm-2.1+", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, rcpm_of_match);
+
+static struct platform_driver rcpm_driver = {
+ .driver = {
+ .name = "rcpm",
+ .of_match_table = rcpm_of_match,
+ .pm = &rcpm_pm_ops,
+ },
+ .probe = rcpm_probe,
+};
+
+module_platform_driver(rcpm_driver);
--
1.7.1
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2019-05-17 2:47 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-05-17 2:47 UTC (permalink / raw)
To: Li Yang, Rob Herring, Mark Rutland
Cc: Len Brown, devicetree, Greg Kroah-Hartman, linux-pm,
Rafael J . Wysocki, linux-kernel, Pavel Machek, Ran Wang,
linuxppc-dev, linux-arm-kernel
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 <ran.wang_1@nxp.com>
---
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 0000000..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 <ran.wang_1@nxp.com>,
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/suspend.h>
+#include <linux/kernel.h>
+
+#define RCPM_WAKEUP_CELL_MAX_SIZE 7
+
+struct rcpm {
+ unsigned int wakeup_cells;
+ void __iomem *ippdexpcr_base;
+ bool little_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 = &pdev->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(&pdev->dev, r);
+ if (IS_ERR(rcpm->ippdexpcr_base)) {
+ ret = PTR_ERR(rcpm->ippdexpcr_base);
+ return ret;
+ }
+
+ rcpm->little_endian = device_property_read_bool(
+ &pdev->dev, "little-endian");
+
+ ret = device_property_read_u32(&pdev->dev,
+ "fsl,#rcpm-wakeup-cells", &rcpm->wakeup_cells);
+ if (ret)
+ return ret;
+
+ dev_set_drvdata(&pdev->dev, rcpm);
+
+ return 0;
+}
+
+static const struct of_device_id rcpm_of_match[] = {
+ { .compatible = "fsl,qoriq-rcpm-2.1+", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, rcpm_of_match);
+
+static struct platform_driver rcpm_driver = {
+ .driver = {
+ .name = "rcpm",
+ .of_match_table = rcpm_of_match,
+ .pm = &rcpm_pm_ops,
+ },
+ .probe = rcpm_probe,
+};
+
+module_platform_driver(rcpm_driver);
--
1.7.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2019-05-17 2:47 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-05-17 2:47 UTC (permalink / raw)
To: Li Yang, Rob Herring, Mark Rutland
Cc: Len Brown, devicetree, Greg Kroah-Hartman, linux-pm,
Rafael J . Wysocki, linux-kernel, Pavel Machek, Ran Wang,
linuxppc-dev, linux-arm-kernel
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 <ran.wang_1@nxp.com>
---
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 0000000..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 <ran.wang_1@nxp.com>,
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/suspend.h>
+#include <linux/kernel.h>
+
+#define RCPM_WAKEUP_CELL_MAX_SIZE 7
+
+struct rcpm {
+ unsigned int wakeup_cells;
+ void __iomem *ippdexpcr_base;
+ bool little_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 = &pdev->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(&pdev->dev, r);
+ if (IS_ERR(rcpm->ippdexpcr_base)) {
+ ret = PTR_ERR(rcpm->ippdexpcr_base);
+ return ret;
+ }
+
+ rcpm->little_endian = device_property_read_bool(
+ &pdev->dev, "little-endian");
+
+ ret = device_property_read_u32(&pdev->dev,
+ "fsl,#rcpm-wakeup-cells", &rcpm->wakeup_cells);
+ if (ret)
+ return ret;
+
+ dev_set_drvdata(&pdev->dev, rcpm);
+
+ return 0;
+}
+
+static const struct of_device_id rcpm_of_match[] = {
+ { .compatible = "fsl,qoriq-rcpm-2.1+", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, rcpm_of_match);
+
+static struct platform_driver rcpm_driver = {
+ .driver = {
+ .name = "rcpm",
+ .of_match_table = rcpm_of_match,
+ .pm = &rcpm_pm_ops,
+ },
+ .probe = rcpm_probe,
+};
+
+module_platform_driver(rcpm_driver);
--
1.7.1
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 1/3] PM: wakeup: Add routine to help fetch wakeup source object.
@ 2019-10-22 7:51 Ran Wang
2019-10-22 7:51 ` Ran Wang
0 siblings, 1 reply; 50+ messages in thread
From: Ran Wang @ 2019-10-22 7:51 UTC (permalink / raw)
To: Rafael J . Wysocki, Rob Herring, Li Yang, Mark Rutland,
Pavel Machek, Huang Anson
Cc: Li Biwen, Len Brown, Greg Kroah-Hartman, linuxppc-dev,
linux-arm-kernel, devicetree, linux-kernel, linux-pm, Ran Wang
Some user might want to go through all registered wakeup sources
and doing things accordingly. For example, SoC PM driver might need to
do HW programming to prevent powering down specific IP which wakeup
source depending on. So add this API to help walk through all registered
wakeup source objects on that list and return them one by one.
Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
Tested-by: Leonard Crestez <leonard.crestez@nxp.com>
---
Change in v8
- Rename wakeup_source_get_next() to wakeup_sources_walk_next().
- Add wakeup_sources_read_lock() to take over locking job of
wakeup_source_get_star().
- Rename wakeup_source_get_start() to wakeup_sources_walk_start().
- Replace wakeup_source_get_stop() with wakeup_sources_read_unlock().
- Define macro for_each_wakeup_source(ws).
Change in v7:
- Remove define of member *dev in wake_irq to fix conflict with commit
c8377adfa781 ("PM / wakeup: Show wakeup sources stats in sysfs"), user
will use ws->dev->parent instead.
- Remove '#include <linux/of_device.h>' because it is not used.
Change in v6:
- Add wakeup_source_get_star() and wakeup_source_get_stop() to aligned
with wakeup_sources_stats_seq_start/nex/stop.
Change in v5:
- Update commit message, add decription of walk through all wakeup
source objects.
- Add SCU protection in function wakeup_source_get_next().
- Rename wakeup_source member 'attached_dev' to 'dev' and move it up
(before wakeirq).
Change in v4:
- None.
Change in v3:
- Adjust indentation of *attached_dev;.
Change in v2:
- None.
drivers/base/power/wakeup.c | 42 ++++++++++++++++++++++++++++++++++++++++++
include/linux/pm_wakeup.h | 9 +++++++++
2 files changed, 51 insertions(+)
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 5817b51..8c7a5f9 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -248,6 +248,48 @@ void wakeup_source_unregister(struct wakeup_source *ws)
EXPORT_SYMBOL_GPL(wakeup_source_unregister);
/**
+ * wakeup_sources_read_lock - Lock wakeup source list for read.
+ */
+int wakeup_sources_read_lock(void)
+{
+ return srcu_read_lock(&wakeup_srcu);
+}
+EXPORT_SYMBOL_GPL(wakeup_sources_read_lock);
+
+/**
+ * wakeup_sources_read_unlock - Unlock wakeup source list.
+ */
+void wakeup_sources_read_unlock(int idx)
+{
+ srcu_read_unlock(&wakeup_srcu, idx);
+}
+EXPORT_SYMBOL_GPL(wakeup_sources_read_unlock);
+
+/**
+ * wakeup_sources_walk_start - Begin a walk on wakeup source list
+ */
+struct wakeup_source *wakeup_sources_walk_start(void)
+{
+ struct list_head *ws_head = &wakeup_sources;
+
+ return list_entry_rcu(ws_head->next, struct wakeup_source, entry);
+}
+EXPORT_SYMBOL_GPL(wakeup_sources_walk_start);
+
+/**
+ * wakeup_sources_walk_next - Get next wakeup source from the list
+ * @ws: Previous wakeup source object
+ */
+struct wakeup_source *wakeup_sources_walk_next(struct wakeup_source *ws)
+{
+ struct list_head *ws_head = &wakeup_sources;
+
+ return list_next_or_null_rcu(ws_head, &ws->entry,
+ struct wakeup_source, entry);
+}
+EXPORT_SYMBOL_GPL(wakeup_sources_walk_next);
+
+/**
* device_wakeup_attach - Attach a wakeup source object to a device object.
* @dev: Device to handle.
* @ws: Wakeup source object to attach to @dev.
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h
index 661efa0..aa3da66 100644
--- a/include/linux/pm_wakeup.h
+++ b/include/linux/pm_wakeup.h
@@ -63,6 +63,11 @@ struct wakeup_source {
bool autosleep_enabled:1;
};
+#define for_each_wakeup_source(ws) \
+ for ((ws) = wakeup_sources_walk_start(); \
+ (ws); \
+ (ws) = wakeup_sources_walk_next((ws)))
+
#ifdef CONFIG_PM_SLEEP
/*
@@ -92,6 +97,10 @@ extern void wakeup_source_remove(struct wakeup_source *ws);
extern struct wakeup_source *wakeup_source_register(struct device *dev,
const char *name);
extern void wakeup_source_unregister(struct wakeup_source *ws);
+extern int wakeup_sources_read_lock(void);
+extern void wakeup_sources_read_unlock(int idx);
+extern struct wakeup_source *wakeup_sources_walk_start(void);
+extern struct wakeup_source *wakeup_sources_walk_next(struct wakeup_source *ws);
extern int device_wakeup_enable(struct device *dev);
extern int device_wakeup_disable(struct device *dev);
extern void device_set_wakeup_capable(struct device *dev, bool capable);
--
2.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
2019-10-22 7:51 [PATCH 1/3] PM: wakeup: Add routine to help fetch wakeup source object Ran Wang
2019-10-22 7:51 ` Ran Wang
@ 2019-10-22 7:51 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-10-22 7:51 UTC (permalink / raw)
To: Rafael J . Wysocki, Rob Herring, Li Yang, Mark Rutland,
Pavel Machek, Huang Anson
Cc: Li Biwen, Len Brown, Greg Kroah-Hartman, linuxppc-dev,
linux-arm-kernel, devicetree, linux-kernel, linux-pm, Ran Wang
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 <ran.wang_1@nxp.com>
---
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 0000000..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 <ran.wang_1@nxp.com>
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/suspend.h>
+#include <linux/kernel.h>
+
+#define RCPM_WAKEUP_CELL_MAX_SIZE 7
+
+struct rcpm {
+ unsigned int wakeup_cells;
+ void __iomem *ippdexpcr_base;
+ bool little_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);
+ tmp |= value[i + 1];
+ iowrite32(tmp, base + i * 4);
+ } else {
+ tmp = ioread32be(base + i * 4);
+ tmp |= value[i + 1];
+ iowrite32be(tmp, base + i * 4);
+ }
+ }
+ }
+ }
+
+ wakeup_sources_read_unlock(idx);
+
+ 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 = &pdev->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(&pdev->dev, r);
+ if (IS_ERR(rcpm->ippdexpcr_base)) {
+ ret = PTR_ERR(rcpm->ippdexpcr_base);
+ return ret;
+ }
+
+ rcpm->little_endian = device_property_read_bool(
+ &pdev->dev, "little-endian");
+
+ ret = device_property_read_u32(&pdev->dev,
+ "#fsl,rcpm-wakeup-cells", &rcpm->wakeup_cells);
+ if (ret)
+ return ret;
+
+ dev_set_drvdata(&pdev->dev, rcpm);
+
+ return 0;
+}
+
+static const struct of_device_id rcpm_of_match[] = {
+ { .compatible = "fsl,qoriq-rcpm-2.1+", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, rcpm_of_match);
+
+static struct platform_driver rcpm_driver = {
+ .driver = {
+ .name = "rcpm",
+ .of_match_table = rcpm_of_match,
+ .pm = &rcpm_pm_ops,
+ },
+ .probe = rcpm_probe,
+};
+
+module_platform_driver(rcpm_driver);
--
2.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2019-10-22 7:51 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-10-22 7:51 UTC (permalink / raw)
To: Rafael J . Wysocki, Rob Herring, Li Yang, Mark Rutland,
Pavel Machek, Huang Anson
Cc: Li Biwen, Len Brown, devicetree, Greg Kroah-Hartman, linux-pm,
linux-kernel, Ran Wang, linuxppc-dev, linux-arm-kernel
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 <ran.wang_1@nxp.com>
---
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 0000000..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 <ran.wang_1@nxp.com>
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/suspend.h>
+#include <linux/kernel.h>
+
+#define RCPM_WAKEUP_CELL_MAX_SIZE 7
+
+struct rcpm {
+ unsigned int wakeup_cells;
+ void __iomem *ippdexpcr_base;
+ bool little_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);
+ tmp |= value[i + 1];
+ iowrite32(tmp, base + i * 4);
+ } else {
+ tmp = ioread32be(base + i * 4);
+ tmp |= value[i + 1];
+ iowrite32be(tmp, base + i * 4);
+ }
+ }
+ }
+ }
+
+ wakeup_sources_read_unlock(idx);
+
+ 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 = &pdev->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(&pdev->dev, r);
+ if (IS_ERR(rcpm->ippdexpcr_base)) {
+ ret = PTR_ERR(rcpm->ippdexpcr_base);
+ return ret;
+ }
+
+ rcpm->little_endian = device_property_read_bool(
+ &pdev->dev, "little-endian");
+
+ ret = device_property_read_u32(&pdev->dev,
+ "#fsl,rcpm-wakeup-cells", &rcpm->wakeup_cells);
+ if (ret)
+ return ret;
+
+ dev_set_drvdata(&pdev->dev, rcpm);
+
+ return 0;
+}
+
+static const struct of_device_id rcpm_of_match[] = {
+ { .compatible = "fsl,qoriq-rcpm-2.1+", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, rcpm_of_match);
+
+static struct platform_driver rcpm_driver = {
+ .driver = {
+ .name = "rcpm",
+ .of_match_table = rcpm_of_match,
+ .pm = &rcpm_pm_ops,
+ },
+ .probe = rcpm_probe,
+};
+
+module_platform_driver(rcpm_driver);
--
2.7.4
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2019-10-22 7:51 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2019-10-22 7:51 UTC (permalink / raw)
To: Rafael J . Wysocki, Rob Herring, Li Yang, Mark Rutland,
Pavel Machek, Huang Anson
Cc: Li Biwen, Len Brown, devicetree, Greg Kroah-Hartman, linux-pm,
linux-kernel, Ran Wang, linuxppc-dev, linux-arm-kernel
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 <ran.wang_1@nxp.com>
---
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 0000000..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 <ran.wang_1@nxp.com>
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/suspend.h>
+#include <linux/kernel.h>
+
+#define RCPM_WAKEUP_CELL_MAX_SIZE 7
+
+struct rcpm {
+ unsigned int wakeup_cells;
+ void __iomem *ippdexpcr_base;
+ bool little_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);
+ tmp |= value[i + 1];
+ iowrite32(tmp, base + i * 4);
+ } else {
+ tmp = ioread32be(base + i * 4);
+ tmp |= value[i + 1];
+ iowrite32be(tmp, base + i * 4);
+ }
+ }
+ }
+ }
+
+ wakeup_sources_read_unlock(idx);
+
+ 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 = &pdev->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(&pdev->dev, r);
+ if (IS_ERR(rcpm->ippdexpcr_base)) {
+ ret = PTR_ERR(rcpm->ippdexpcr_base);
+ return ret;
+ }
+
+ rcpm->little_endian = device_property_read_bool(
+ &pdev->dev, "little-endian");
+
+ ret = device_property_read_u32(&pdev->dev,
+ "#fsl,rcpm-wakeup-cells", &rcpm->wakeup_cells);
+ if (ret)
+ return ret;
+
+ dev_set_drvdata(&pdev->dev, rcpm);
+
+ return 0;
+}
+
+static const struct of_device_id rcpm_of_match[] = {
+ { .compatible = "fsl,qoriq-rcpm-2.1+", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, rcpm_of_match);
+
+static struct platform_driver rcpm_driver = {
+ .driver = {
+ .name = "rcpm",
+ .of_match_table = rcpm_of_match,
+ .pm = &rcpm_pm_ops,
+ },
+ .probe = rcpm_probe,
+};
+
+module_platform_driver(rcpm_driver);
--
2.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
2019-10-22 7:51 ` Ran Wang
(?)
@ 2019-10-22 9:18 ` Rafael J. Wysocki
-1 siblings, 0 replies; 50+ messages in thread
From: Rafael J. Wysocki @ 2019-10-22 9:18 UTC (permalink / raw)
To: Ran Wang
Cc: Rafael J . Wysocki, Rob Herring, Li Yang, Mark Rutland,
Pavel Machek, Huang Anson, Li Biwen, Len Brown,
Greg Kroah-Hartman, linuxppc-dev, Linux ARM, devicetree,
Linux Kernel Mailing List, Linux PM
On Tue, Oct 22, 2019 at 9:52 AM Ran Wang <ran.wang_1@nxp.com> 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 <ran.wang_1@nxp.com>
> ---
> 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 0000000..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 <ran.wang_1@nxp.com>
> +
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/of_address.h>
> +#include <linux/slab.h>
> +#include <linux/suspend.h>
> +#include <linux/kernel.h>
> +
> +#define RCPM_WAKEUP_CELL_MAX_SIZE 7
> +
> +struct rcpm {
> + unsigned int wakeup_cells;
> + void __iomem *ippdexpcr_base;
> + bool little_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",
> + ws->name);
IMO printing this message is not useful in general, because it looks
like you just want to skip wakeup sources that aren't associated with
rcpm devices.
Maybe use pr_debug() to print it? Or maybe use pr_debug() to print a
message if you have found a suitable device? Wouldn't that be more
useful?
> + continue;
> + }
> +
It would be good to add a comment explaining what the code below does
here. Or explain that in the function's kerneldoc comment.
> + for (i = 0; i < rcpm->wakeup_cells; i++) {
It looks like 'tmp' can be defined in this block.
And I would store the value of value[i+1] in tmp upfront, that is
u32 tmp = value[i+1];
> + /* We can only OR related bits */
> + if (value[i + 1]) {
Also I would do
if (!tmp)
continue;
to reduce the indentation level.
> + if (rcpm->little_endian) {
> + tmp = ioread32(base + i * 4);
> + tmp |= value[i + 1];
> + iowrite32(tmp, base + i * 4);
So it is sufficient to do
tmp |= ioread32(base + i * 4);
iowrite32(tmp, base + i * 4);
here and analogously below.
You may as well define
void __iomem *address = base + i * 4;
and use it everywhere in this block instead of the (base + I * 4) expression.
> + } else {
> + tmp = ioread32be(base + i * 4);
> + tmp |= value[i + 1];
> + iowrite32be(tmp, base + i * 4);
> + }
> + }
> + }
> + }
> +
> + wakeup_sources_read_unlock(idx);
> +
> + return 0;
> +}
> +
> +static const struct dev_pm_ops rcpm_pm_ops = {
> + .prepare = rcpm_pm_prepare,
> +};
> +
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2019-10-22 9:18 ` Rafael J. Wysocki
0 siblings, 0 replies; 50+ messages in thread
From: Rafael J. Wysocki @ 2019-10-22 9:18 UTC (permalink / raw)
To: Ran Wang
Cc: Mark Rutland, Li Biwen, Huang Anson, Len Brown,
Greg Kroah-Hartman, Linux PM, Rafael J . Wysocki,
Linux Kernel Mailing List, Li Yang, devicetree, Rob Herring,
Pavel Machek, linuxppc-dev, Linux ARM
On Tue, Oct 22, 2019 at 9:52 AM Ran Wang <ran.wang_1@nxp.com> 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 <ran.wang_1@nxp.com>
> ---
> 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 0000000..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 <ran.wang_1@nxp.com>
> +
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/of_address.h>
> +#include <linux/slab.h>
> +#include <linux/suspend.h>
> +#include <linux/kernel.h>
> +
> +#define RCPM_WAKEUP_CELL_MAX_SIZE 7
> +
> +struct rcpm {
> + unsigned int wakeup_cells;
> + void __iomem *ippdexpcr_base;
> + bool little_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",
> + ws->name);
IMO printing this message is not useful in general, because it looks
like you just want to skip wakeup sources that aren't associated with
rcpm devices.
Maybe use pr_debug() to print it? Or maybe use pr_debug() to print a
message if you have found a suitable device? Wouldn't that be more
useful?
> + continue;
> + }
> +
It would be good to add a comment explaining what the code below does
here. Or explain that in the function's kerneldoc comment.
> + for (i = 0; i < rcpm->wakeup_cells; i++) {
It looks like 'tmp' can be defined in this block.
And I would store the value of value[i+1] in tmp upfront, that is
u32 tmp = value[i+1];
> + /* We can only OR related bits */
> + if (value[i + 1]) {
Also I would do
if (!tmp)
continue;
to reduce the indentation level.
> + if (rcpm->little_endian) {
> + tmp = ioread32(base + i * 4);
> + tmp |= value[i + 1];
> + iowrite32(tmp, base + i * 4);
So it is sufficient to do
tmp |= ioread32(base + i * 4);
iowrite32(tmp, base + i * 4);
here and analogously below.
You may as well define
void __iomem *address = base + i * 4;
and use it everywhere in this block instead of the (base + I * 4) expression.
> + } else {
> + tmp = ioread32be(base + i * 4);
> + tmp |= value[i + 1];
> + iowrite32be(tmp, base + i * 4);
> + }
> + }
> + }
> + }
> +
> + wakeup_sources_read_unlock(idx);
> +
> + return 0;
> +}
> +
> +static const struct dev_pm_ops rcpm_pm_ops = {
> + .prepare = rcpm_pm_prepare,
> +};
> +
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2019-10-22 9:18 ` Rafael J. Wysocki
0 siblings, 0 replies; 50+ messages in thread
From: Rafael J. Wysocki @ 2019-10-22 9:18 UTC (permalink / raw)
To: Ran Wang
Cc: Mark Rutland, Li Biwen, Huang Anson, Len Brown,
Greg Kroah-Hartman, Linux PM, Rafael J . Wysocki,
Linux Kernel Mailing List, Li Yang, devicetree, Rob Herring,
Pavel Machek, linuxppc-dev, Linux ARM
On Tue, Oct 22, 2019 at 9:52 AM Ran Wang <ran.wang_1@nxp.com> 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 <ran.wang_1@nxp.com>
> ---
> 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 0000000..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 <ran.wang_1@nxp.com>
> +
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/of_address.h>
> +#include <linux/slab.h>
> +#include <linux/suspend.h>
> +#include <linux/kernel.h>
> +
> +#define RCPM_WAKEUP_CELL_MAX_SIZE 7
> +
> +struct rcpm {
> + unsigned int wakeup_cells;
> + void __iomem *ippdexpcr_base;
> + bool little_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",
> + ws->name);
IMO printing this message is not useful in general, because it looks
like you just want to skip wakeup sources that aren't associated with
rcpm devices.
Maybe use pr_debug() to print it? Or maybe use pr_debug() to print a
message if you have found a suitable device? Wouldn't that be more
useful?
> + continue;
> + }
> +
It would be good to add a comment explaining what the code below does
here. Or explain that in the function's kerneldoc comment.
> + for (i = 0; i < rcpm->wakeup_cells; i++) {
It looks like 'tmp' can be defined in this block.
And I would store the value of value[i+1] in tmp upfront, that is
u32 tmp = value[i+1];
> + /* We can only OR related bits */
> + if (value[i + 1]) {
Also I would do
if (!tmp)
continue;
to reduce the indentation level.
> + if (rcpm->little_endian) {
> + tmp = ioread32(base + i * 4);
> + tmp |= value[i + 1];
> + iowrite32(tmp, base + i * 4);
So it is sufficient to do
tmp |= ioread32(base + i * 4);
iowrite32(tmp, base + i * 4);
here and analogously below.
You may as well define
void __iomem *address = base + i * 4;
and use it everywhere in this block instead of the (base + I * 4) expression.
> + } else {
> + tmp = ioread32be(base + i * 4);
> + tmp |= value[i + 1];
> + iowrite32be(tmp, base + i * 4);
> + }
> + }
> + }
> + }
> +
> + wakeup_sources_read_unlock(idx);
> +
> + return 0;
> +}
> +
> +static const struct dev_pm_ops rcpm_pm_ops = {
> + .prepare = rcpm_pm_prepare,
> +};
> +
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 1/3] soc: fsl: add Platform PM driver QorIQ platforms
@ 2018-08-31 3:52 Ran Wang
2018-08-31 3:52 ` Ran Wang
0 siblings, 1 reply; 50+ messages in thread
From: Ran Wang @ 2018-08-31 3:52 UTC (permalink / raw)
To: Leo Li, Rob Herring, Mark Rutland
Cc: linuxppc-dev, linux-arm-kernel, devicetree, linux-kernel, Ran Wang
This driver is to provide a independent framework for PM service
provider and consumer to configure system level wake up feature. For
example, RCPM driver could register a callback function on this
platform first, and Flex timer driver who want to enable timer wake
up feature, will call generic API provided by this platform driver,
and then it will trigger RCPM driver to do it. The benefit is to
isolate the user and service, such as flex timer driver will not 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 is
changed and remain user side unchanged.
Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
---
drivers/soc/fsl/Kconfig | 14 +++++
drivers/soc/fsl/Makefile | 1 +
drivers/soc/fsl/plat_pm.c | 144 +++++++++++++++++++++++++++++++++++++++++++++
include/soc/fsl/plat_pm.h | 22 +++++++
4 files changed, 181 insertions(+), 0 deletions(-)
create mode 100644 drivers/soc/fsl/plat_pm.c
create mode 100644 include/soc/fsl/plat_pm.h
diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig
index 7a9fb9b..6517412 100644
--- a/drivers/soc/fsl/Kconfig
+++ b/drivers/soc/fsl/Kconfig
@@ -16,3 +16,17 @@ config FSL_GUTS
Initially only reading SVR and registering soc device are supported.
Other guts accesses, such as reading RCW, should eventually be moved
into this driver as well.
+
+config FSL_PLAT_PM
+ bool "Freescale platform PM framework"
+ help
+ This driver is to provide a independent framework for PM service
+ provider and consumer to configure system level wake up feature. For
+ example, RCPM driver could register a callback function on this
+ platform first, and Flex timer driver who want to enable timer wake
+ up feature, will call generic API provided by this platform driver,
+ and then it will trigger RCPM driver to do it. The benefit is to
+ isolate the user and service, such as flex timer driver will not
+ 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.
diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile
index 44b3beb..8f9db23 100644
--- a/drivers/soc/fsl/Makefile
+++ b/drivers/soc/fsl/Makefile
@@ -6,3 +6,4 @@ obj-$(CONFIG_FSL_DPAA) += qbman/
obj-$(CONFIG_QUICC_ENGINE) += qe/
obj-$(CONFIG_CPM) += qe/
obj-$(CONFIG_FSL_GUTS) += guts.o
+obj-$(CONFIG_FSL_PLAT_PM) += plat_pm.o
diff --git a/drivers/soc/fsl/plat_pm.c b/drivers/soc/fsl/plat_pm.c
new file mode 100644
index 0000000..19ea14e
--- /dev/null
+++ b/drivers/soc/fsl/plat_pm.c
@@ -0,0 +1,144 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// plat_pm.c - Freescale platform PM framework
+//
+// Copyright 2018 NXP
+//
+// Author: Ran Wang <ran.wang_1@nxp.com>,
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/list.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+#include <soc/fsl/plat_pm.h>
+
+
+struct plat_pm_t {
+ struct list_head node;
+ fsl_plat_pm_handle handle;
+ void *handle_priv;
+ spinlock_t lock;
+};
+
+static struct plat_pm_t plat_pm;
+
+// register_fsl_platform_wakeup_source - Register callback function to plat_pm
+// @handle: Pointer to handle PM feature requirement
+// @handle_priv: Handler specific data struct
+//
+// Return 0 on success other negative errno
+int register_fsl_platform_wakeup_source(fsl_plat_pm_handle handle,
+ void *handle_priv)
+{
+ struct plat_pm_t *p;
+ unsigned long flags;
+
+ if (!handle) {
+ pr_err("FSL plat_pm: Handler invalid, reject\n");
+ return -EINVAL;
+ }
+
+ p = kmalloc(sizeof(*p), GFP_KERNEL);
+ if (!p)
+ return -ENOMEM;
+
+ p->handle = handle;
+ p->handle_priv = handle_priv;
+
+ spin_lock_irqsave(&plat_pm.lock, flags);
+ list_add_tail(&p->node, &plat_pm.node);
+ spin_unlock_irqrestore(&plat_pm.lock, flags);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(register_fsl_platform_wakeup_source);
+
+// Deregister_fsl_platform_wakeup_source - deregister callback function
+// @handle_priv: Handler specific data struct
+//
+// Return 0 on success other negative errno
+int deregister_fsl_platform_wakeup_source(void *handle_priv)
+{
+ struct plat_pm_t *p, *tmp;
+ unsigned long flags;
+
+ spin_lock_irqsave(&plat_pm.lock, flags);
+ list_for_each_entry_safe(p, tmp, &plat_pm.node, node) {
+ if (p->handle_priv == handle_priv) {
+ list_del(&p->node);
+ kfree(p);
+ }
+ }
+ spin_unlock_irqrestore(&plat_pm.lock, flags);
+ return 0;
+}
+EXPORT_SYMBOL_GPL(deregister_fsl_platform_wakeup_source);
+
+// fsl_platform_wakeup_config - Configure wakeup source by calling handlers
+// @dev: pointer to user's device struct
+// @flag: to tell enable or disable wakeup source
+//
+// Return 0 on success other negative errno
+int fsl_platform_wakeup_config(struct device *dev, bool flag)
+{
+ struct plat_pm_t *p;
+ int ret;
+ bool success_handled;
+ unsigned long flags;
+
+ success_handled = false;
+
+ // Will consider success if at least one callback return 0.
+ // Also, rest handles still get oppertunity to be executed
+ spin_lock_irqsave(&plat_pm.lock, flags);
+ list_for_each_entry(p, &plat_pm.node, node) {
+ if (p->handle) {
+ ret = p->handle(dev, flag, p->handle_priv);
+ if (!ret)
+ success_handled = true;
+ else if (ret != -ENODEV) {
+ pr_err("FSL plat_pm: Failed to config wakeup source:%d\n", ret);
+ return ret;
+ }
+ } else
+ pr_warn("FSL plat_pm: Invalid handler detected, skip\n");
+ }
+ spin_unlock_irqrestore(&plat_pm.lock, flags);
+
+ if (success_handled == false) {
+ pr_err("FSL plat_pm: Cannot find the matchhed handler for wakeup source config\n");
+ return -ENODEV;
+ }
+
+ return 0;
+}
+
+// fsl_platform_wakeup_enable - Enable wakeup source
+// @dev: pointer to user's device struct
+//
+// Return 0 on success other negative errno
+int fsl_platform_wakeup_enable(struct device *dev)
+{
+ return fsl_platform_wakeup_config(dev, true);
+}
+EXPORT_SYMBOL_GPL(fsl_platform_wakeup_enable);
+
+// fsl_platform_wakeup_disable - Disable wakeup source
+// @dev: pointer to user's device struct
+//
+// Return 0 on success other negative errno
+int fsl_platform_wakeup_disable(struct device *dev)
+{
+ return fsl_platform_wakeup_config(dev, false);
+}
+EXPORT_SYMBOL_GPL(fsl_platform_wakeup_disable);
+
+static int __init fsl_plat_pm_init(void)
+{
+ spin_lock_init(&plat_pm.lock);
+ INIT_LIST_HEAD(&plat_pm.node);
+ return 0;
+}
+
+core_initcall(fsl_plat_pm_init);
diff --git a/include/soc/fsl/plat_pm.h b/include/soc/fsl/plat_pm.h
new file mode 100644
index 0000000..bbe151e
--- /dev/null
+++ b/include/soc/fsl/plat_pm.h
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// plat_pm.h - Freescale platform PM Header
+//
+// Copyright 2018 NXP
+//
+// Author: Ran Wang <ran.wang_1@nxp.com>,
+
+#ifndef __FSL_PLAT_PM_H
+#define __FSL_PLAT_PM_H
+
+typedef int (*fsl_plat_pm_handle)(struct device *dev, bool flag,
+ void *handle_priv);
+
+int register_fsl_platform_wakeup_source(fsl_plat_pm_handle handle,
+ void *handle_priv);
+int deregister_fsl_platform_wakeup_source(void *handle_priv);
+int fsl_platform_wakeup_config(struct device *dev, bool flag);
+int fsl_platform_wakeup_enable(struct device *dev);
+int fsl_platform_wakeup_disable(struct device *dev);
+
+#endif // __FSL_PLAT_PM_H
--
1.7.1
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
2018-08-31 3:52 [PATCH 1/3] soc: fsl: add Platform PM driver QorIQ platforms Ran Wang
@ 2018-08-31 3:52 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-08-31 3:52 UTC (permalink / raw)
To: Leo Li, Rob Herring, Mark Rutland
Cc: linuxppc-dev, linux-arm-kernel, devicetree, linux-kernel, Ran Wang
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 <chenhui.zhao@nxp.com>
Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
---
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 0000000..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 <ran.wang_1@nxp.com>,
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <soc/fsl/plat_pm.h>
+
+#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], &set_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], &set_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)
+{
+ struct resource *r;
+ struct rcpm_t *rcpm;
+
+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!r)
+ return -ENODEV;
+
+ rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
+ if (!rcpm)
+ return -ENOMEM;
+
+ rcpm->big_endian = device_property_read_bool(&pdev->dev, "big-endian");
+
+ rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
+ if (IS_ERR(rcpm->ippdexpcr_addr))
+ return PTR_ERR(rcpm->ippdexpcr_addr);
+
+ rcpm->dev = &pdev->dev;
+ platform_set_drvdata(pdev, rcpm);
+
+ return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
+}
+
+static int ls_rcpm_remove(struct platform_device *pdev)
+{
+ struct rcpm_t *rcpm;
+
+ rcpm = platform_get_drvdata(pdev);
+ deregister_fsl_platform_wakeup_source(rcpm);
+ kfree(rcpm);
+
+ return 0;
+}
+
+static const struct of_device_id ls_rcpm_of_match[] = {
+ { .compatible = "fsl,qoriq-rcpm-2.1", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
+
+static struct platform_driver ls_rcpm_driver = {
+ .driver = {
+ .name = "ls-rcpm",
+ .of_match_table = ls_rcpm_of_match,
+ },
+ .probe = ls_rcpm_probe,
+ .remove = ls_rcpm_remove,
+};
+
+static int __init ls_rcpm_init(void)
+{
+ return platform_driver_register(&ls_rcpm_driver);
+}
+subsys_initcall(ls_rcpm_init);
+
+static void __exit ls_rcpm_exit(void)
+{
+ platform_driver_unregister(&ls_rcpm_driver);
+}
+module_exit(ls_rcpm_exit);
--
1.7.1
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-08-31 3:52 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-08-31 3:52 UTC (permalink / raw)
To: linux-arm-kernel
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 <chenhui.zhao@nxp.com>
Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
---
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 0000000..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 <ran.wang_1@nxp.com>,
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <soc/fsl/plat_pm.h>
+
+#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], &set_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], &set_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)
+{
+ struct resource *r;
+ struct rcpm_t *rcpm;
+
+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!r)
+ return -ENODEV;
+
+ rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
+ if (!rcpm)
+ return -ENOMEM;
+
+ rcpm->big_endian = device_property_read_bool(&pdev->dev, "big-endian");
+
+ rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
+ if (IS_ERR(rcpm->ippdexpcr_addr))
+ return PTR_ERR(rcpm->ippdexpcr_addr);
+
+ rcpm->dev = &pdev->dev;
+ platform_set_drvdata(pdev, rcpm);
+
+ return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
+}
+
+static int ls_rcpm_remove(struct platform_device *pdev)
+{
+ struct rcpm_t *rcpm;
+
+ rcpm = platform_get_drvdata(pdev);
+ deregister_fsl_platform_wakeup_source(rcpm);
+ kfree(rcpm);
+
+ return 0;
+}
+
+static const struct of_device_id ls_rcpm_of_match[] = {
+ { .compatible = "fsl,qoriq-rcpm-2.1", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
+
+static struct platform_driver ls_rcpm_driver = {
+ .driver = {
+ .name = "ls-rcpm",
+ .of_match_table = ls_rcpm_of_match,
+ },
+ .probe = ls_rcpm_probe,
+ .remove = ls_rcpm_remove,
+};
+
+static int __init ls_rcpm_init(void)
+{
+ return platform_driver_register(&ls_rcpm_driver);
+}
+subsys_initcall(ls_rcpm_init);
+
+static void __exit ls_rcpm_exit(void)
+{
+ platform_driver_unregister(&ls_rcpm_driver);
+}
+module_exit(ls_rcpm_exit);
--
1.7.1
^ permalink raw reply related [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
2018-08-31 3:52 ` Ran Wang
(?)
(?)
@ 2018-09-05 2:57 ` Wang, Dongsheng
-1 siblings, 0 replies; 50+ messages in thread
From: Wang, Dongsheng @ 2018-09-05 2:57 UTC (permalink / raw)
To: Ran Wang, Leo Li, Rob Herring, Mark Rutland
Cc: devicetree, linuxppc-dev, linux-kernel, linux-arm-kernel
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 <chenhui.zhao@nxp.com>
> Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> ---
> 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 0000000..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 <ran.wang_1@nxp.com>,
> +
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/of_address.h>
> +#include <linux/slab.h>
> +#include <soc/fsl/plat_pm.h>
> +
> +#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], &set_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], &set_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
if (x) {
...
...
} else {
}
> + iowrite32(ippdexpcr, ippdexpcr_addr);
> +
> + return 0;
> + }
> + }
> + }
> +
> + return -ENODEV;
> +}
> +
> +static int ls_rcpm_probe(struct platform_device *pdev)
> +{
> + struct resource *r;
> + struct rcpm_t *rcpm;
> +
> + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!r)
> + return -ENODEV;
> +
> + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
kzalloc is better.
> + if (!rcpm)
> + return -ENOMEM;
> +
> + rcpm->big_endian = device_property_read_bool(&pdev->dev, "big-endian");
> +
> + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> + if (IS_ERR(rcpm->ippdexpcr_addr))
> + return PTR_ERR(rcpm->ippdexpcr_addr);
> +
> + rcpm->dev = &pdev->dev;
> + platform_set_drvdata(pdev, rcpm);
> +
> + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
> +}
> +
> +static int ls_rcpm_remove(struct platform_device *pdev)
> +{
> + struct rcpm_t *rcpm;
Not need a table.
Cheers,
-Dongsheng
> +
> + rcpm = platform_get_drvdata(pdev);
> + deregister_fsl_platform_wakeup_source(rcpm);
> + kfree(rcpm);
> +
> + return 0;
> +}
> +
> +static const struct of_device_id ls_rcpm_of_match[] = {
> + { .compatible = "fsl,qoriq-rcpm-2.1", },
> + {}
> +};
> +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> +
> +static struct platform_driver ls_rcpm_driver = {
> + .driver = {
> + .name = "ls-rcpm",
> + .of_match_table = ls_rcpm_of_match,
> + },
> + .probe = ls_rcpm_probe,
> + .remove = ls_rcpm_remove,
> +};
> +
> +static int __init ls_rcpm_init(void)
> +{
> + return platform_driver_register(&ls_rcpm_driver);
> +}
> +subsys_initcall(ls_rcpm_init);
> +
> +static void __exit ls_rcpm_exit(void)
> +{
> + platform_driver_unregister(&ls_rcpm_driver);
> +}
> +module_exit(ls_rcpm_exit);
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-05 2:57 ` Wang, Dongsheng
0 siblings, 0 replies; 50+ messages in thread
From: Wang, Dongsheng @ 2018-09-05 2:57 UTC (permalink / raw)
To: linux-arm-kernel
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 <chenhui.zhao@nxp.com>
> Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> ---
> 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 0000000..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 <ran.wang_1@nxp.com>,
> +
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/of_address.h>
> +#include <linux/slab.h>
> +#include <soc/fsl/plat_pm.h>
> +
> +#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], &set_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], &set_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
if (x) {
....
....
} else {
}
> + iowrite32(ippdexpcr, ippdexpcr_addr);
> +
> + return 0;
> + }
> + }
> + }
> +
> + return -ENODEV;
> +}
> +
> +static int ls_rcpm_probe(struct platform_device *pdev)
> +{
> + struct resource *r;
> + struct rcpm_t *rcpm;
> +
> + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!r)
> + return -ENODEV;
> +
> + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
kzalloc is better.
> + if (!rcpm)
> + return -ENOMEM;
> +
> + rcpm->big_endian = device_property_read_bool(&pdev->dev, "big-endian");
> +
> + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> + if (IS_ERR(rcpm->ippdexpcr_addr))
> + return PTR_ERR(rcpm->ippdexpcr_addr);
> +
> + rcpm->dev = &pdev->dev;
> + platform_set_drvdata(pdev, rcpm);
> +
> + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
> +}
> +
> +static int ls_rcpm_remove(struct platform_device *pdev)
> +{
> + struct rcpm_t *rcpm;
Not need a table.
Cheers,
-Dongsheng
> +
> + rcpm = platform_get_drvdata(pdev);
> + deregister_fsl_platform_wakeup_source(rcpm);
> + kfree(rcpm);
> +
> + return 0;
> +}
> +
> +static const struct of_device_id ls_rcpm_of_match[] = {
> + { .compatible = "fsl,qoriq-rcpm-2.1", },
> + {}
> +};
> +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> +
> +static struct platform_driver ls_rcpm_driver = {
> + .driver = {
> + .name = "ls-rcpm",
> + .of_match_table = ls_rcpm_of_match,
> + },
> + .probe = ls_rcpm_probe,
> + .remove = ls_rcpm_remove,
> +};
> +
> +static int __init ls_rcpm_init(void)
> +{
> + return platform_driver_register(&ls_rcpm_driver);
> +}
> +subsys_initcall(ls_rcpm_init);
> +
> +static void __exit ls_rcpm_exit(void)
> +{
> + platform_driver_unregister(&ls_rcpm_driver);
> +}
> +module_exit(ls_rcpm_exit);
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-05 2:57 ` Wang, Dongsheng
0 siblings, 0 replies; 50+ messages in thread
From: Wang, Dongsheng @ 2018-09-05 2:57 UTC (permalink / raw)
To: Ran Wang, Leo Li, Rob Herring, Mark Rutland
Cc: devicetree, linuxppc-dev, linux-kernel, linux-arm-kernel
Please change your comments style.=0A=
=0A=
On 2018/8/31 11:56, Ran Wang wrote:=0A=
> The NXP's QorIQ Processors based on ARM Core have RCPM module (Run=0A=
> Control and Power Management), which performs all device-level=0A=
> tasks associated with power management such as wakeup source control.=0A=
>=0A=
> This driver depends on FSL platform PM driver framework which help to=0A=
> isolate user and PM service provider (such as RCPM driver).=0A=
>=0A=
> Signed-off-by: Chenhui Zhao <chenhui.zhao@nxp.com>=0A=
> Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>=0A=
> Signed-off-by: Ran Wang <ran.wang_1@nxp.com>=0A=
> ---=0A=
> drivers/soc/fsl/Kconfig | 6 ++=0A=
> drivers/soc/fsl/Makefile | 1 +=0A=
> drivers/soc/fsl/ls-rcpm.c | 153 +++++++++++++++++++++++++++++++++++++++=
++++++=0A=
> 3 files changed, 160 insertions(+), 0 deletions(-)=0A=
> create mode 100644 drivers/soc/fsl/ls-rcpm.c=0A=
>=0A=
> diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig=0A=
> index 6517412..882330d 100644=0A=
> --- a/drivers/soc/fsl/Kconfig=0A=
> +++ b/drivers/soc/fsl/Kconfig=0A=
> @@ -30,3 +30,9 @@ config FSL_PLAT_PM=0A=
> have to know the implement details of wakeup function it require.=0A=
> Besides, it is also easy for service side to upgrade its logic when=
=0A=
> design changed and remain user side unchanged.=0A=
> +=0A=
> +config LS_RCPM=0A=
> + bool "Freescale RCPM support"=0A=
> + depends on (FSL_PLAT_PM)=0A=
> + help=0A=
> + This feature is to enable specified wakeup source for system sleep.=
=0A=
> diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile=0A=
> index 8f9db23..43ff71a 100644=0A=
> --- a/drivers/soc/fsl/Makefile=0A=
> +++ b/drivers/soc/fsl/Makefile=0A=
> @@ -7,3 +7,4 @@ obj-$(CONFIG_QUICC_ENGINE) +=3D qe/=0A=
> obj-$(CONFIG_CPM) +=3D qe/=0A=
> obj-$(CONFIG_FSL_GUTS) +=3D guts.o=0A=
> obj-$(CONFIG_FSL_PLAT_PM) +=3D plat_pm.o=0A=
> +obj-$(CONFIG_LS_RCPM) +=3D ls-rcpm.o=0A=
> diff --git a/drivers/soc/fsl/ls-rcpm.c b/drivers/soc/fsl/ls-rcpm.c=0A=
> new file mode 100644=0A=
> index 0000000..b0feb88=0A=
> --- /dev/null=0A=
> +++ b/drivers/soc/fsl/ls-rcpm.c=0A=
> @@ -0,0 +1,153 @@=0A=
> +// SPDX-License-Identifier: GPL-2.0=0A=
> +//=0A=
> +// plat_pm.c - Freescale Layerscape RCPM driver=0A=
> +//=0A=
> +// Copyright 2018 NXP=0A=
> +//=0A=
> +// Author: Ran Wang <ran.wang_1@nxp.com>,=0A=
> +=0A=
> +#include <linux/init.h>=0A=
> +#include <linux/module.h>=0A=
> +#include <linux/platform_device.h>=0A=
> +#include <linux/of_address.h>=0A=
> +#include <linux/slab.h>=0A=
> +#include <soc/fsl/plat_pm.h>=0A=
> +=0A=
> +#define MAX_COMPATIBLE_NUM 10=0A=
> +=0A=
> +struct rcpm_t {=0A=
> + struct device *dev;=0A=
> + void __iomem *ippdexpcr_addr;=0A=
> + bool big_endian; /* Big/Little endian of RCPM module */=0A=
> +};=0A=
> +=0A=
> +// rcpm_handle - Configure RCPM reg according to wake up source request=
=0A=
> +// @user_dev: pointer to user's device struct=0A=
> +// @flag: to enable(true) or disable(false) wakeup source=0A=
> +// @handle_priv: pointer to struct rcpm_t instance=0A=
> +//=0A=
> +// Return 0 on success other negative errno=0A=
> +static int rcpm_handle(struct device *user_dev, bool flag, void *handle_=
priv)=0A=
> +{=0A=
> + struct rcpm_t *rcpm;=0A=
> + bool big_endian;=0A=
> + const char *dev_compatible_array[MAX_COMPATIBLE_NUM];=0A=
> + void __iomem *ippdexpcr_addr;=0A=
> + u32 ippdexpcr;=0A=
> + u32 set_bit;=0A=
> + int ret, num, i;=0A=
> +=0A=
> + rcpm =3D handle_priv;=0A=
> + big_endian =3D rcpm->big_endian;=0A=
> + ippdexpcr_addr =3D rcpm->ippdexpcr_addr;=0A=
> +=0A=
> + num =3D device_property_read_string_array(user_dev, "compatible",=0A=
> + dev_compatible_array, MAX_COMPATIBLE_NUM);=0A=
> + if (num < 0)=0A=
> + return num;=0A=
> +=0A=
> + for (i =3D 0; i < num; i++) {=0A=
> + if (!device_property_present(rcpm->dev,=0A=
> + dev_compatible_array[i]))=0A=
> + continue;=0A=
> + else {=0A=
Remove this else.=0A=
> + ret =3D device_property_read_u32(rcpm->dev,=0A=
> + dev_compatible_array[i], &set_bit);=0A=
> + if (ret)=0A=
> + return ret;=0A=
> +=0A=
> + if (!device_property_present(rcpm->dev,=0A=
> + dev_compatible_array[i]))=0A=
This has been checked. Continue ? or return ENODEV=1B$B!)=1B(B=0A=
> + return -ENODEV;=0A=
> + else {=0A=
Remove this else.=0A=
> + ret =3D device_property_read_u32(rcpm->dev,=0A=
> + dev_compatible_array[i], &set_bit);=0A=
> + if (ret)=0A=
> + return ret;=0A=
> +=0A=
> + if (big_endian)=0A=
> + ippdexpcr =3D ioread32be(ippdexpcr_addr);=0A=
> + else=0A=
> + ippdexpcr =3D ioread32(ippdexpcr_addr);=0A=
> +=0A=
> + if (flag)=0A=
> + ippdexpcr |=3D set_bit;=0A=
> + else=0A=
> + ippdexpcr &=3D ~set_bit;=0A=
> +=0A=
> + if (big_endian) {=0A=
> + iowrite32be(ippdexpcr, ippdexpcr_addr);=0A=
> + ippdexpcr =3D ioread32be(ippdexpcr_addr);=0A=
> + } else=0A=
if (x) {=0A=
....=0A=
....=0A=
} else {=0A=
=0A=
}=0A=
> + iowrite32(ippdexpcr, ippdexpcr_addr);=0A=
> +=0A=
> + return 0;=0A=
> + }=0A=
> + }=0A=
> + }=0A=
> +=0A=
> + return -ENODEV;=0A=
> +}=0A=
> +=0A=
> +static int ls_rcpm_probe(struct platform_device *pdev)=0A=
> +{=0A=
> + struct resource *r;=0A=
> + struct rcpm_t *rcpm;=0A=
> +=0A=
> + r =3D platform_get_resource(pdev, IORESOURCE_MEM, 0);=0A=
> + if (!r)=0A=
> + return -ENODEV;=0A=
> +=0A=
> + rcpm =3D kmalloc(sizeof(*rcpm), GFP_KERNEL);=0A=
kzalloc is better.=0A=
> + if (!rcpm)=0A=
> + return -ENOMEM;=0A=
> +=0A=
> + rcpm->big_endian =3D device_property_read_bool(&pdev->dev, "big-endian"=
);=0A=
> +=0A=
> + rcpm->ippdexpcr_addr =3D devm_ioremap_resource(&pdev->dev, r);=0A=
> + if (IS_ERR(rcpm->ippdexpcr_addr))=0A=
> + return PTR_ERR(rcpm->ippdexpcr_addr);=0A=
> +=0A=
> + rcpm->dev =3D &pdev->dev;=0A=
> + platform_set_drvdata(pdev, rcpm);=0A=
> +=0A=
> + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);=0A=
> +}=0A=
> +=0A=
> +static int ls_rcpm_remove(struct platform_device *pdev)=0A=
> +{=0A=
> + struct rcpm_t *rcpm;=0A=
Not need a table.=0A=
=0A=
Cheers,=0A=
-Dongsheng=0A=
=0A=
> +=0A=
> + rcpm =3D platform_get_drvdata(pdev);=0A=
> + deregister_fsl_platform_wakeup_source(rcpm);=0A=
> + kfree(rcpm);=0A=
> +=0A=
> + return 0;=0A=
> +}=0A=
> +=0A=
> +static const struct of_device_id ls_rcpm_of_match[] =3D {=0A=
> + { .compatible =3D "fsl,qoriq-rcpm-2.1", },=0A=
> + {}=0A=
> +};=0A=
> +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);=0A=
> +=0A=
> +static struct platform_driver ls_rcpm_driver =3D {=0A=
> + .driver =3D {=0A=
> + .name =3D "ls-rcpm",=0A=
> + .of_match_table =3D ls_rcpm_of_match,=0A=
> + },=0A=
> + .probe =3D ls_rcpm_probe,=0A=
> + .remove =3D ls_rcpm_remove,=0A=
> +};=0A=
> +=0A=
> +static int __init ls_rcpm_init(void)=0A=
> +{=0A=
> + return platform_driver_register(&ls_rcpm_driver);=0A=
> +}=0A=
> +subsys_initcall(ls_rcpm_init);=0A=
> +=0A=
> +static void __exit ls_rcpm_exit(void)=0A=
> +{=0A=
> + platform_driver_unregister(&ls_rcpm_driver);=0A=
> +}=0A=
> +module_exit(ls_rcpm_exit);=0A=
=0A=
=0A=
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-05 2:57 ` Wang, Dongsheng
0 siblings, 0 replies; 50+ messages in thread
From: Wang, Dongsheng @ 2018-09-05 2:57 UTC (permalink / raw)
To: Ran Wang, Leo Li, Rob Herring, Mark Rutland
Cc: devicetree, linuxppc-dev, linux-kernel, linux-arm-kernel
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 <chenhui.zhao@nxp.com>
> Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> ---
> 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 0000000..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 <ran.wang_1@nxp.com>,
> +
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/of_address.h>
> +#include <linux/slab.h>
> +#include <soc/fsl/plat_pm.h>
> +
> +#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], &set_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], &set_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
if (x) {
....
....
} else {
}
> + iowrite32(ippdexpcr, ippdexpcr_addr);
> +
> + return 0;
> + }
> + }
> + }
> +
> + return -ENODEV;
> +}
> +
> +static int ls_rcpm_probe(struct platform_device *pdev)
> +{
> + struct resource *r;
> + struct rcpm_t *rcpm;
> +
> + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!r)
> + return -ENODEV;
> +
> + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
kzalloc is better.
> + if (!rcpm)
> + return -ENOMEM;
> +
> + rcpm->big_endian = device_property_read_bool(&pdev->dev, "big-endian");
> +
> + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> + if (IS_ERR(rcpm->ippdexpcr_addr))
> + return PTR_ERR(rcpm->ippdexpcr_addr);
> +
> + rcpm->dev = &pdev->dev;
> + platform_set_drvdata(pdev, rcpm);
> +
> + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
> +}
> +
> +static int ls_rcpm_remove(struct platform_device *pdev)
> +{
> + struct rcpm_t *rcpm;
Not need a table.
Cheers,
-Dongsheng
> +
> + rcpm = platform_get_drvdata(pdev);
> + deregister_fsl_platform_wakeup_source(rcpm);
> + kfree(rcpm);
> +
> + return 0;
> +}
> +
> +static const struct of_device_id ls_rcpm_of_match[] = {
> + { .compatible = "fsl,qoriq-rcpm-2.1", },
> + {}
> +};
> +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> +
> +static struct platform_driver ls_rcpm_driver = {
> + .driver = {
> + .name = "ls-rcpm",
> + .of_match_table = ls_rcpm_of_match,
> + },
> + .probe = ls_rcpm_probe,
> + .remove = ls_rcpm_remove,
> +};
> +
> +static int __init ls_rcpm_init(void)
> +{
> + return platform_driver_register(&ls_rcpm_driver);
> +}
> +subsys_initcall(ls_rcpm_init);
> +
> +static void __exit ls_rcpm_exit(void)
> +{
> + platform_driver_unregister(&ls_rcpm_driver);
> +}
> +module_exit(ls_rcpm_exit);
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
2018-09-05 2:57 ` Wang, Dongsheng
(?)
(?)
@ 2018-09-05 3:21 ` Li Yang
-1 siblings, 0 replies; 50+ messages in thread
From: Li Yang @ 2018-09-05 3:21 UTC (permalink / raw)
To: dongsheng.wang
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
On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng
<dongsheng.wang@hxt-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://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 <chenhui.zhao@nxp.com>
> > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > ---
> > 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 0000000..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 <ran.wang_1@nxp.com>,
Where do you need the comma in the end?
> > +
> > +#include <linux/init.h>
> > +#include <linux/module.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/of_address.h>
> > +#include <linux/slab.h>
> > +#include <soc/fsl/plat_pm.h>
> > +
> > +#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], &set_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], &set_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
> if (x) {
> ....
> ....
> } else {
>
> }
> > + iowrite32(ippdexpcr, ippdexpcr_addr);
> > +
> > + return 0;
> > + }
> > + }
> > + }
> > +
> > + return -ENODEV;
> > +}
> > +
> > +static int ls_rcpm_probe(struct platform_device *pdev)
> > +{
> > + struct resource *r;
> > + struct rcpm_t *rcpm;
> > +
> > + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > + if (!r)
> > + return -ENODEV;
> > +
> > + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
> kzalloc is better.
> > + if (!rcpm)
> > + return -ENOMEM;
> > +
> > + rcpm->big_endian = device_property_read_bool(&pdev->dev, "big-endian");
> > +
> > + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> > + if (IS_ERR(rcpm->ippdexpcr_addr))
> > + return PTR_ERR(rcpm->ippdexpcr_addr);
> > +
> > + rcpm->dev = &pdev->dev;
> > + platform_set_drvdata(pdev, rcpm);
> > +
> > + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
> > +}
> > +
> > +static int ls_rcpm_remove(struct platform_device *pdev)
> > +{
> > + struct rcpm_t *rcpm;
> Not need a table.
>
> Cheers,
> -Dongsheng
>
> > +
> > + rcpm = platform_get_drvdata(pdev);
> > + deregister_fsl_platform_wakeup_source(rcpm);
> > + kfree(rcpm);
> > +
> > + return 0;
> > +}
> > +
> > +static const struct of_device_id ls_rcpm_of_match[] = {
> > + { .compatible = "fsl,qoriq-rcpm-2.1", },
> > + {}
> > +};
> > +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> > +
> > +static struct platform_driver ls_rcpm_driver = {
> > + .driver = {
> > + .name = "ls-rcpm",
> > + .of_match_table = ls_rcpm_of_match,
> > + },
> > + .probe = ls_rcpm_probe,
> > + .remove = ls_rcpm_remove,
> > +};
> > +
> > +static int __init ls_rcpm_init(void)
> > +{
> > + return platform_driver_register(&ls_rcpm_driver);
> > +}
> > +subsys_initcall(ls_rcpm_init);
> > +
> > +static void __exit ls_rcpm_exit(void)
> > +{
> > + platform_driver_unregister(&ls_rcpm_driver);
> > +}
> > +module_exit(ls_rcpm_exit);
>
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-05 3:21 ` Li Yang
0 siblings, 0 replies; 50+ messages in thread
From: Li Yang @ 2018-09-05 3:21 UTC (permalink / raw)
To: linux-arm-kernel
On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng
<dongsheng.wang@hxt-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://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 <chenhui.zhao@nxp.com>
> > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > ---
> > 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 0000000..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 <ran.wang_1@nxp.com>,
Where do you need the comma in the end?
> > +
> > +#include <linux/init.h>
> > +#include <linux/module.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/of_address.h>
> > +#include <linux/slab.h>
> > +#include <soc/fsl/plat_pm.h>
> > +
> > +#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], &set_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], &set_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
> if (x) {
> ....
> ....
> } else {
>
> }
> > + iowrite32(ippdexpcr, ippdexpcr_addr);
> > +
> > + return 0;
> > + }
> > + }
> > + }
> > +
> > + return -ENODEV;
> > +}
> > +
> > +static int ls_rcpm_probe(struct platform_device *pdev)
> > +{
> > + struct resource *r;
> > + struct rcpm_t *rcpm;
> > +
> > + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > + if (!r)
> > + return -ENODEV;
> > +
> > + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
> kzalloc is better.
> > + if (!rcpm)
> > + return -ENOMEM;
> > +
> > + rcpm->big_endian = device_property_read_bool(&pdev->dev, "big-endian");
> > +
> > + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> > + if (IS_ERR(rcpm->ippdexpcr_addr))
> > + return PTR_ERR(rcpm->ippdexpcr_addr);
> > +
> > + rcpm->dev = &pdev->dev;
> > + platform_set_drvdata(pdev, rcpm);
> > +
> > + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
> > +}
> > +
> > +static int ls_rcpm_remove(struct platform_device *pdev)
> > +{
> > + struct rcpm_t *rcpm;
> Not need a table.
>
> Cheers,
> -Dongsheng
>
> > +
> > + rcpm = platform_get_drvdata(pdev);
> > + deregister_fsl_platform_wakeup_source(rcpm);
> > + kfree(rcpm);
> > +
> > + return 0;
> > +}
> > +
> > +static const struct of_device_id ls_rcpm_of_match[] = {
> > + { .compatible = "fsl,qoriq-rcpm-2.1", },
> > + {}
> > +};
> > +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> > +
> > +static struct platform_driver ls_rcpm_driver = {
> > + .driver = {
> > + .name = "ls-rcpm",
> > + .of_match_table = ls_rcpm_of_match,
> > + },
> > + .probe = ls_rcpm_probe,
> > + .remove = ls_rcpm_remove,
> > +};
> > +
> > +static int __init ls_rcpm_init(void)
> > +{
> > + return platform_driver_register(&ls_rcpm_driver);
> > +}
> > +subsys_initcall(ls_rcpm_init);
> > +
> > +static void __exit ls_rcpm_exit(void)
> > +{
> > + platform_driver_unregister(&ls_rcpm_driver);
> > +}
> > +module_exit(ls_rcpm_exit);
>
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-05 3:21 ` Li Yang
0 siblings, 0 replies; 50+ messages in thread
From: Li Yang @ 2018-09-05 3:21 UTC (permalink / raw)
To: dongsheng.wang
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
On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng
<dongsheng.wang@hxt-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://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 <chenhui.zhao@nxp.com>
> > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > ---
> > 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 requir=
e.
> > 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 sl=
eep.
> > 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) +=3D qe/
> > obj-$(CONFIG_CPM) +=3D qe/
> > obj-$(CONFIG_FSL_GUTS) +=3D guts.o
> > obj-$(CONFIG_FSL_PLAT_PM) +=3D plat_pm.o
> > +obj-$(CONFIG_LS_RCPM) +=3D 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 0000000..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 <ran.wang_1@nxp.com>,
Where do you need the comma in the end?
> > +
> > +#include <linux/init.h>
> > +#include <linux/module.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/of_address.h>
> > +#include <linux/slab.h>
> > +#include <soc/fsl/plat_pm.h>
> > +
> > +#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 reques=
t
> > +// @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 *handl=
e_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 =3D handle_priv;
> > + big_endian =3D rcpm->big_endian;
> > + ippdexpcr_addr =3D rcpm->ippdexpcr_addr;
> > +
> > + num =3D device_property_read_string_array(user_dev, "compatible",
> > + dev_compatible_array, MAX_COMPATIBLE_NUM);
> > + if (num < 0)
> > + return num;
> > +
> > + for (i =3D 0; i < num; i++) {
> > + if (!device_property_present(rcpm->dev,
> > + dev_compatible_array[i]))
> > + continue;
> > + else {
> Remove this else.
> > + ret =3D device_property_read_u32(rcpm->dev,
> > + dev_compatible_array[i], &set_bit=
);
> > + if (ret)
> > + return ret;
> > +
> > + if (!device_property_present(rcpm->dev,
> > + dev_compatible_array[i]))
> This has been checked. Continue ? or return ENODEV=EF=BC=9F
> > + return -ENODEV;
> > + else {
> Remove this else.
> > + ret =3D device_property_read_u32(rcpm->de=
v,
> > + dev_compatible_array[i], =
&set_bit);
> > + if (ret)
> > + return ret;
> > +
> > + if (big_endian)
> > + ippdexpcr =3D ioread32be(ippdexpc=
r_addr);
> > + else
> > + ippdexpcr =3D ioread32(ippdexpcr_=
addr);
> > +
> > + if (flag)
> > + ippdexpcr |=3D set_bit;
> > + else
> > + ippdexpcr &=3D ~set_bit;
> > +
> > + if (big_endian) {
> > + iowrite32be(ippdexpcr, ippdexpcr_=
addr);
> > + ippdexpcr =3D ioread32be(ippdexpc=
r_addr);
> > + } else
> if (x) {
> ....
> ....
> } else {
>
> }
> > + iowrite32(ippdexpcr, ippdexpcr_ad=
dr);
> > +
> > + return 0;
> > + }
> > + }
> > + }
> > +
> > + return -ENODEV;
> > +}
> > +
> > +static int ls_rcpm_probe(struct platform_device *pdev)
> > +{
> > + struct resource *r;
> > + struct rcpm_t *rcpm;
> > +
> > + r =3D platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > + if (!r)
> > + return -ENODEV;
> > +
> > + rcpm =3D kmalloc(sizeof(*rcpm), GFP_KERNEL);
> kzalloc is better.
> > + if (!rcpm)
> > + return -ENOMEM;
> > +
> > + rcpm->big_endian =3D device_property_read_bool(&pdev->dev, "big-e=
ndian");
> > +
> > + rcpm->ippdexpcr_addr =3D devm_ioremap_resource(&pdev->dev, r);
> > + if (IS_ERR(rcpm->ippdexpcr_addr))
> > + return PTR_ERR(rcpm->ippdexpcr_addr);
> > +
> > + rcpm->dev =3D &pdev->dev;
> > + platform_set_drvdata(pdev, rcpm);
> > +
> > + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
> > +}
> > +
> > +static int ls_rcpm_remove(struct platform_device *pdev)
> > +{
> > + struct rcpm_t *rcpm;
> Not need a table.
>
> Cheers,
> -Dongsheng
>
> > +
> > + rcpm =3D platform_get_drvdata(pdev);
> > + deregister_fsl_platform_wakeup_source(rcpm);
> > + kfree(rcpm);
> > +
> > + return 0;
> > +}
> > +
> > +static const struct of_device_id ls_rcpm_of_match[] =3D {
> > + { .compatible =3D "fsl,qoriq-rcpm-2.1", },
> > + {}
> > +};
> > +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> > +
> > +static struct platform_driver ls_rcpm_driver =3D {
> > + .driver =3D {
> > + .name =3D "ls-rcpm",
> > + .of_match_table =3D ls_rcpm_of_match,
> > + },
> > + .probe =3D ls_rcpm_probe,
> > + .remove =3D ls_rcpm_remove,
> > +};
> > +
> > +static int __init ls_rcpm_init(void)
> > +{
> > + return platform_driver_register(&ls_rcpm_driver);
> > +}
> > +subsys_initcall(ls_rcpm_init);
> > +
> > +static void __exit ls_rcpm_exit(void)
> > +{
> > + platform_driver_unregister(&ls_rcpm_driver);
> > +}
> > +module_exit(ls_rcpm_exit);
>
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-05 3:21 ` Li Yang
0 siblings, 0 replies; 50+ messages in thread
From: Li Yang @ 2018-09-05 3:21 UTC (permalink / raw)
To: dongsheng.wang
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
On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng
<dongsheng.wang@hxt-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://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 <chenhui.zhao@nxp.com>
> > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > ---
> > 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 0000000..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 <ran.wang_1@nxp.com>,
Where do you need the comma in the end?
> > +
> > +#include <linux/init.h>
> > +#include <linux/module.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/of_address.h>
> > +#include <linux/slab.h>
> > +#include <soc/fsl/plat_pm.h>
> > +
> > +#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], &set_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], &set_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
> if (x) {
> ....
> ....
> } else {
>
> }
> > + iowrite32(ippdexpcr, ippdexpcr_addr);
> > +
> > + return 0;
> > + }
> > + }
> > + }
> > +
> > + return -ENODEV;
> > +}
> > +
> > +static int ls_rcpm_probe(struct platform_device *pdev)
> > +{
> > + struct resource *r;
> > + struct rcpm_t *rcpm;
> > +
> > + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > + if (!r)
> > + return -ENODEV;
> > +
> > + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
> kzalloc is better.
> > + if (!rcpm)
> > + return -ENOMEM;
> > +
> > + rcpm->big_endian = device_property_read_bool(&pdev->dev, "big-endian");
> > +
> > + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> > + if (IS_ERR(rcpm->ippdexpcr_addr))
> > + return PTR_ERR(rcpm->ippdexpcr_addr);
> > +
> > + rcpm->dev = &pdev->dev;
> > + platform_set_drvdata(pdev, rcpm);
> > +
> > + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
> > +}
> > +
> > +static int ls_rcpm_remove(struct platform_device *pdev)
> > +{
> > + struct rcpm_t *rcpm;
> Not need a table.
>
> Cheers,
> -Dongsheng
>
> > +
> > + rcpm = platform_get_drvdata(pdev);
> > + deregister_fsl_platform_wakeup_source(rcpm);
> > + kfree(rcpm);
> > +
> > + return 0;
> > +}
> > +
> > +static const struct of_device_id ls_rcpm_of_match[] = {
> > + { .compatible = "fsl,qoriq-rcpm-2.1", },
> > + {}
> > +};
> > +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> > +
> > +static struct platform_driver ls_rcpm_driver = {
> > + .driver = {
> > + .name = "ls-rcpm",
> > + .of_match_table = ls_rcpm_of_match,
> > + },
> > + .probe = ls_rcpm_probe,
> > + .remove = ls_rcpm_remove,
> > +};
> > +
> > +static int __init ls_rcpm_init(void)
> > +{
> > + return platform_driver_register(&ls_rcpm_driver);
> > +}
> > +subsys_initcall(ls_rcpm_init);
> > +
> > +static void __exit ls_rcpm_exit(void)
> > +{
> > + platform_driver_unregister(&ls_rcpm_driver);
> > +}
> > +module_exit(ls_rcpm_exit);
>
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
2018-09-05 3:21 ` Li Yang
(?)
(?)
@ 2018-09-07 9:48 ` Ran Wang
-1 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-07 9:48 UTC (permalink / raw)
To: Leo Li
Cc: dongsheng.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
Hi Leo,
On September 05, 2018 at 11:22 Yang Li wrote:
> -----Original Message-----
> From: Li Yang <leoyang.li@nxp.com>
> Sent: Wednesday, September 05, 2018 11:22
> To: dongsheng.wang@hxt-semitech.com
> Cc: Ran Wang <ran.wang_1@nxp.com>; Rob Herring <robh+dt@kernel.org>;
> Mark Rutland <mark.rutland@arm.com>; open list:OPEN FIRMWARE AND
> FLATTENED DEVICE TREE BINDINGS <devicetree@vger.kernel.org>; linuxppc-
> dev <linuxppc-dev@lists.ozlabs.org>; lkml <linux-kernel@vger.kernel.org>;
> moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE <linux-arm-
> kernel@lists.infradead.org>
> Subject: Re: [PATCH 3/3] soc: fsl: add RCPM driver
>
> On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng <dongsheng.wang@hxt-
> 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%2F133&data=02%7C01%7Cran.wang_
> 1%40nxp.com%7Cc0d88e6690384e02b95108d612dec235%7C686ea1d3bc2b4c
> 6fa92cd99c5c301635%7C0%7C0%7C636717145285126200&sdata=JIoCZp
> WhRyW76EqgSflfTDA1f0gMQGKa%2FcbvSc5CO%2Fw%3D&reserved=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 <chenhui.zhao@nxp.com>
> > > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > > ---
> > > 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 0000000..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 <ran.wang_1@nxp.com>,
>
> Where do you need the comma in the end?
My bad, will remove comma in next version.
> > > +
> > > +#include <linux/init.h>
> > > +#include <linux/module.h>
> > > +#include <linux/platform_device.h>
> > > +#include <linux/of_address.h>
> > > +#include <linux/slab.h>
> > > +#include <soc/fsl/plat_pm.h>
> > > +
> > > +#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://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
> w.kernel.org%2Fdoc%2Fhtml%2Fv4.18%2Fdoc-guide%2Fkernel-
> doc.html&data=02%7C01%7Cran.wang_1%40nxp.com%7Cc0d88e669038
> 4e02b95108d612dec235%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0
> %7C636717145285126200&sdata=H7GkUNOLVG%2FCcZESzhtHBeHCbO9
> %2FK4k9EdH30Cxq2%2BM%3D&reserved=0
So, do you think I need to change all comment style back to '/* ... */' ?
Actually I feel a little bit confused here.
Regards,
Ran
> > > +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], &set_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], &set_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
> > if (x) {
> > ....
> > ....
> > } else {
> >
> > }
> > > + iowrite32(ippdexpcr,
> > > + ippdexpcr_addr);
> > > +
> > > + return 0;
> > > + }
> > > + }
> > > + }
> > > +
> > > + return -ENODEV;
> > > +}
> > > +
> > > +static int ls_rcpm_probe(struct platform_device *pdev) {
> > > + struct resource *r;
> > > + struct rcpm_t *rcpm;
> > > +
> > > + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > > + if (!r)
> > > + return -ENODEV;
> > > +
> > > + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
> > kzalloc is better.
> > > + if (!rcpm)
> > > + return -ENOMEM;
> > > +
> > > + rcpm->big_endian = device_property_read_bool(&pdev->dev,
> > > + "big-endian");
> > > +
> > > + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> > > + if (IS_ERR(rcpm->ippdexpcr_addr))
> > > + return PTR_ERR(rcpm->ippdexpcr_addr);
> > > +
> > > + rcpm->dev = &pdev->dev;
> > > + platform_set_drvdata(pdev, rcpm);
> > > +
> > > + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
> > > +}
> > > +
> > > +static int ls_rcpm_remove(struct platform_device *pdev) {
> > > + struct rcpm_t *rcpm;
> > Not need a table.
> >
> > Cheers,
> > -Dongsheng
> >
> > > +
> > > + rcpm = platform_get_drvdata(pdev);
> > > + deregister_fsl_platform_wakeup_source(rcpm);
> > > + kfree(rcpm);
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +static const struct of_device_id ls_rcpm_of_match[] = {
> > > + { .compatible = "fsl,qoriq-rcpm-2.1", },
> > > + {}
> > > +};
> > > +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> > > +
> > > +static struct platform_driver ls_rcpm_driver = {
> > > + .driver = {
> > > + .name = "ls-rcpm",
> > > + .of_match_table = ls_rcpm_of_match,
> > > + },
> > > + .probe = ls_rcpm_probe,
> > > + .remove = ls_rcpm_remove,
> > > +};
> > > +
> > > +static int __init ls_rcpm_init(void) {
> > > + return platform_driver_register(&ls_rcpm_driver);
> > > +}
> > > +subsys_initcall(ls_rcpm_init);
> > > +
> > > +static void __exit ls_rcpm_exit(void) {
> > > + platform_driver_unregister(&ls_rcpm_driver);
> > > +}
> > > +module_exit(ls_rcpm_exit);
> >
> >
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-07 9:48 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-07 9:48 UTC (permalink / raw)
To: linux-arm-kernel
Hi Leo,
On September 05, 2018 at 11:22 Yang Li wrote:
> -----Original Message-----
> From: Li Yang <leoyang.li@nxp.com>
> Sent: Wednesday, September 05, 2018 11:22
> To: dongsheng.wang at hxt-semitech.com
> Cc: Ran Wang <ran.wang_1@nxp.com>; Rob Herring <robh+dt@kernel.org>;
> Mark Rutland <mark.rutland@arm.com>; open list:OPEN FIRMWARE AND
> FLATTENED DEVICE TREE BINDINGS <devicetree@vger.kernel.org>; linuxppc-
> dev <linuxppc-dev@lists.ozlabs.org>; lkml <linux-kernel@vger.kernel.org>;
> moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE <linux-arm-
> kernel at lists.infradead.org>
> Subject: Re: [PATCH 3/3] soc: fsl: add RCPM driver
>
> On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng <dongsheng.wang@hxt-
> 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%2F133&data=02%7C01%7Cran.wang_
> 1%40nxp.com%7Cc0d88e6690384e02b95108d612dec235%7C686ea1d3bc2b4c
> 6fa92cd99c5c301635%7C0%7C0%7C636717145285126200&sdata=JIoCZp
> WhRyW76EqgSflfTDA1f0gMQGKa%2FcbvSc5CO%2Fw%3D&reserved=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 <chenhui.zhao@nxp.com>
> > > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > > ---
> > > 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 0000000..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 <ran.wang_1@nxp.com>,
>
> Where do you need the comma in the end?
My bad, will remove comma in next version.
> > > +
> > > +#include <linux/init.h>
> > > +#include <linux/module.h>
> > > +#include <linux/platform_device.h>
> > > +#include <linux/of_address.h>
> > > +#include <linux/slab.h>
> > > +#include <soc/fsl/plat_pm.h>
> > > +
> > > +#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://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
> w.kernel.org%2Fdoc%2Fhtml%2Fv4.18%2Fdoc-guide%2Fkernel-
> doc.html&data=02%7C01%7Cran.wang_1%40nxp.com%7Cc0d88e669038
> 4e02b95108d612dec235%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0
> %7C636717145285126200&sdata=H7GkUNOLVG%2FCcZESzhtHBeHCbO9
> %2FK4k9EdH30Cxq2%2BM%3D&reserved=0
So, do you think I need to change all comment style back to '/* ... */' ?
Actually I feel a little bit confused here.
Regards,
Ran
> > > +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], &set_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], &set_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
> > if (x) {
> > ....
> > ....
> > } else {
> >
> > }
> > > + iowrite32(ippdexpcr,
> > > + ippdexpcr_addr);
> > > +
> > > + return 0;
> > > + }
> > > + }
> > > + }
> > > +
> > > + return -ENODEV;
> > > +}
> > > +
> > > +static int ls_rcpm_probe(struct platform_device *pdev) {
> > > + struct resource *r;
> > > + struct rcpm_t *rcpm;
> > > +
> > > + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > > + if (!r)
> > > + return -ENODEV;
> > > +
> > > + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
> > kzalloc is better.
> > > + if (!rcpm)
> > > + return -ENOMEM;
> > > +
> > > + rcpm->big_endian = device_property_read_bool(&pdev->dev,
> > > + "big-endian");
> > > +
> > > + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> > > + if (IS_ERR(rcpm->ippdexpcr_addr))
> > > + return PTR_ERR(rcpm->ippdexpcr_addr);
> > > +
> > > + rcpm->dev = &pdev->dev;
> > > + platform_set_drvdata(pdev, rcpm);
> > > +
> > > + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
> > > +}
> > > +
> > > +static int ls_rcpm_remove(struct platform_device *pdev) {
> > > + struct rcpm_t *rcpm;
> > Not need a table.
> >
> > Cheers,
> > -Dongsheng
> >
> > > +
> > > + rcpm = platform_get_drvdata(pdev);
> > > + deregister_fsl_platform_wakeup_source(rcpm);
> > > + kfree(rcpm);
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +static const struct of_device_id ls_rcpm_of_match[] = {
> > > + { .compatible = "fsl,qoriq-rcpm-2.1", },
> > > + {}
> > > +};
> > > +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> > > +
> > > +static struct platform_driver ls_rcpm_driver = {
> > > + .driver = {
> > > + .name = "ls-rcpm",
> > > + .of_match_table = ls_rcpm_of_match,
> > > + },
> > > + .probe = ls_rcpm_probe,
> > > + .remove = ls_rcpm_remove,
> > > +};
> > > +
> > > +static int __init ls_rcpm_init(void) {
> > > + return platform_driver_register(&ls_rcpm_driver);
> > > +}
> > > +subsys_initcall(ls_rcpm_init);
> > > +
> > > +static void __exit ls_rcpm_exit(void) {
> > > + platform_driver_unregister(&ls_rcpm_driver);
> > > +}
> > > +module_exit(ls_rcpm_exit);
> >
> >
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-07 9:48 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-07 9:48 UTC (permalink / raw)
To: Leo Li
Cc: dongsheng.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
SGkgTGVvLA0KDQpPbiBTZXB0ZW1iZXIgMDUsIDIwMTggYXQgMTE6MjIgWWFuZyBMaSB3cm90ZToN
Cj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogTGkgWWFuZyA8bGVveWFuZy5s
aUBueHAuY29tPg0KPiBTZW50OiBXZWRuZXNkYXksIFNlcHRlbWJlciAwNSwgMjAxOCAxMToyMg0K
PiBUbzogZG9uZ3NoZW5nLndhbmdAaHh0LXNlbWl0ZWNoLmNvbQ0KPiBDYzogUmFuIFdhbmcgPHJh
bi53YW5nXzFAbnhwLmNvbT47IFJvYiBIZXJyaW5nIDxyb2JoK2R0QGtlcm5lbC5vcmc+Ow0KPiBN
YXJrIFJ1dGxhbmQgPG1hcmsucnV0bGFuZEBhcm0uY29tPjsgb3BlbiBsaXN0Ok9QRU4gRklSTVdB
UkUgQU5EDQo+IEZMQVRURU5FRCBERVZJQ0UgVFJFRSBCSU5ESU5HUyA8ZGV2aWNldHJlZUB2Z2Vy
Lmtlcm5lbC5vcmc+OyBsaW51eHBwYy0NCj4gZGV2IDxsaW51eHBwYy1kZXZAbGlzdHMub3psYWJz
Lm9yZz47IGxrbWwgPGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc+Ow0KPiBtb2RlcmF0ZWQg
bGlzdDpBUk0vRlJFRVNDQUxFIElNWCAvIE1YQyBBUk0gQVJDSElURUNUVVJFIDxsaW51eC1hcm0t
DQo+IGtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnPg0KPiBTdWJqZWN0OiBSZTogW1BBVENIIDMv
M10gc29jOiBmc2w6IGFkZCBSQ1BNIGRyaXZlcg0KPiANCj4gT24gVHVlLCBTZXAgNCwgMjAxOCBh
dCA5OjU4IFBNIFdhbmcsIERvbmdzaGVuZyA8ZG9uZ3NoZW5nLndhbmdAaHh0LQ0KPiBzZW1pdGVj
aC5jb20+IHdyb3RlOg0KPiA+DQo+ID4gUGxlYXNlIGNoYW5nZSB5b3VyIGNvbW1lbnRzIHN0eWxl
Lg0KPiANCj4gQWx0aG91Z2ggdGhpcyBkb2Vzbid0IGdldCBpbnRvIHRoZSBMaW51eCBrZXJuZWwg
Y29kaW5nIHN0eWxlIGRvY3VtZW50YXRpb24NCj4geWV0LCBMaW51cyBzZWVtcyBjaGFuZ2VkIGhp
cyBtaW5kIHRvIHByZWZlciAvLyB0aGFuIC8qDQo+ICovIGNvbW1lbnQgc3R5bGUgbm93Lg0KPiBo
dHRwczovL2VtZWEwMS5zYWZlbGlua3MucHJvdGVjdGlvbi5vdXRsb29rLmNvbS8/dXJsPWh0dHBz
JTNBJTJGJTJGbGttbA0KPiAub3JnJTJGbGttbCUyRjIwMTclMkYxMSUyRjI1JTJGMTMzJmFtcDtk
YXRhPTAyJTdDMDElN0NyYW4ud2FuZ18NCj4gMSU0MG54cC5jb20lN0NjMGQ4OGU2NjkwMzg0ZTAy
Yjk1MTA4ZDYxMmRlYzIzNSU3QzY4NmVhMWQzYmMyYjRjDQo+IDZmYTkyY2Q5OWM1YzMwMTYzNSU3
QzAlN0MwJTdDNjM2NzE3MTQ1Mjg1MTI2MjAwJmFtcDtzZGF0YT1KSW9DWnANCj4gV2hSeVc3NkVx
Z1NmbGZUREExZjBnTVFHS2ElMkZjYnZTYzVDTyUyRnclM0QmYW1wO3Jlc2VydmVkPTANCj4gU28g
dGhlDQo+IC8vIHN0eWxlIHNob3VsZCBiZSBhY2NlcHRhYmxlIGZvciBub3cuDQo+IA0KPiA+DQo+
ID4gT24gMjAxOC84LzMxIDExOjU2LCBSYW4gV2FuZyB3cm90ZToNCj4gPiA+IFRoZSBOWFAncyBR
b3JJUSBQcm9jZXNzb3JzIGJhc2VkIG9uIEFSTSBDb3JlIGhhdmUgUkNQTSBtb2R1bGUgKFJ1bg0K
PiA+ID4gQ29udHJvbCBhbmQgUG93ZXIgTWFuYWdlbWVudCksIHdoaWNoIHBlcmZvcm1zIGFsbCBk
ZXZpY2UtbGV2ZWwgdGFza3MNCj4gPiA+IGFzc29jaWF0ZWQgd2l0aCBwb3dlciBtYW5hZ2VtZW50
IHN1Y2ggYXMgd2FrZXVwIHNvdXJjZSBjb250cm9sLg0KPiA+ID4NCj4gPiA+IFRoaXMgZHJpdmVy
IGRlcGVuZHMgb24gRlNMIHBsYXRmb3JtIFBNIGRyaXZlciBmcmFtZXdvcmsgd2hpY2ggaGVscA0K
PiA+ID4gdG8gaXNvbGF0ZSB1c2VyIGFuZCBQTSBzZXJ2aWNlIHByb3ZpZGVyIChzdWNoIGFzIFJD
UE0gZHJpdmVyKS4NCj4gPiA+DQo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBDaGVuaHVpIFpoYW8gPGNo
ZW5odWkuemhhb0BueHAuY29tPg0KPiA+ID4gU2lnbmVkLW9mZi1ieTogWWluZyBaaGFuZyA8eWlu
Zy56aGFuZzIyNDU1QG54cC5jb20+DQo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBSYW4gV2FuZyA8cmFu
LndhbmdfMUBueHAuY29tPg0KPiA+ID4gLS0tDQo+ID4gPiAgZHJpdmVycy9zb2MvZnNsL0tjb25m
aWcgICB8ICAgIDYgKysNCj4gPiA+ICBkcml2ZXJzL3NvYy9mc2wvTWFrZWZpbGUgIHwgICAgMSAr
DQo+ID4gPiAgZHJpdmVycy9zb2MvZnNsL2xzLXJjcG0uYyB8ICAxNTMNCj4gPiA+ICsrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KPiA+ID4gIDMgZmlsZXMgY2hh
bmdlZCwgMTYwIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pICBjcmVhdGUgbW9kZQ0KPiA+
ID4gMTAwNjQ0IGRyaXZlcnMvc29jL2ZzbC9scy1yY3BtLmMNCj4gPiA+DQo+ID4gPiBkaWZmIC0t
Z2l0IGEvZHJpdmVycy9zb2MvZnNsL0tjb25maWcgYi9kcml2ZXJzL3NvYy9mc2wvS2NvbmZpZyBp
bmRleA0KPiA+ID4gNjUxNzQxMi4uODgyMzMwZCAxMDA2NDQNCj4gPiA+IC0tLSBhL2RyaXZlcnMv
c29jL2ZzbC9LY29uZmlnDQo+ID4gPiArKysgYi9kcml2ZXJzL3NvYy9mc2wvS2NvbmZpZw0KPiA+
ID4gQEAgLTMwLDMgKzMwLDkgQEAgY29uZmlnIEZTTF9QTEFUX1BNDQo+ID4gPiAgICAgICAgIGhh
dmUgdG8ga25vdyB0aGUgaW1wbGVtZW50IGRldGFpbHMgb2Ygd2FrZXVwIGZ1bmN0aW9uIGl0IHJl
cXVpcmUuDQo+ID4gPiAgICAgICAgIEJlc2lkZXMsIGl0IGlzIGFsc28gZWFzeSBmb3Igc2Vydmlj
ZSBzaWRlIHRvIHVwZ3JhZGUgaXRzIGxvZ2ljIHdoZW4NCj4gPiA+ICAgICAgICAgZGVzaWduIGNo
YW5nZWQgYW5kIHJlbWFpbiB1c2VyIHNpZGUgdW5jaGFuZ2VkLg0KPiA+ID4gKw0KPiA+ID4gK2Nv
bmZpZyBMU19SQ1BNDQo+ID4gPiArICAgICBib29sICJGcmVlc2NhbGUgUkNQTSBzdXBwb3J0Ig0K
PiA+ID4gKyAgICAgZGVwZW5kcyBvbiAoRlNMX1BMQVRfUE0pDQo+ID4gPiArICAgICBoZWxwDQo+
ID4gPiArICAgICAgIFRoaXMgZmVhdHVyZSBpcyB0byBlbmFibGUgc3BlY2lmaWVkIHdha2V1cCBz
b3VyY2UgZm9yIHN5c3RlbSBzbGVlcC4NCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9m
c2wvTWFrZWZpbGUgYi9kcml2ZXJzL3NvYy9mc2wvTWFrZWZpbGUNCj4gPiA+IGluZGV4IDhmOWRi
MjMuLjQzZmY3MWEgMTAwNjQ0DQo+ID4gPiAtLS0gYS9kcml2ZXJzL3NvYy9mc2wvTWFrZWZpbGUN
Cj4gPiA+ICsrKyBiL2RyaXZlcnMvc29jL2ZzbC9NYWtlZmlsZQ0KPiA+ID4gQEAgLTcsMyArNyw0
IEBAIG9iai0kKENPTkZJR19RVUlDQ19FTkdJTkUpICAgICAgICAgICAgKz0gcWUvDQo+ID4gPiAg
b2JqLSQoQ09ORklHX0NQTSkgICAgICAgICAgICAgICAgICAgICs9IHFlLw0KPiA+ID4gIG9iai0k
KENPTkZJR19GU0xfR1VUUykgICAgICAgICAgICAgICAgICAgICAgICs9IGd1dHMubw0KPiA+ID4g
IG9iai0kKENPTkZJR19GU0xfUExBVF9QTSkgICAgKz0gcGxhdF9wbS5vDQo+ID4gPiArb2JqLSQo
Q09ORklHX0xTX1JDUE0pICAgICAgICAgICAgICAgICs9IGxzLXJjcG0ubw0KPiANCj4gUHJvYmFi
bHkgdXNlICJfIiBpbnN0ZWFkIG9mICItIiBmb3IgYWxpZ25tZW50Lg0KDQpPSywgd2lsbCB1cGRh
dGUgaW4gbmV4dCB2ZXJzaW9uDQoNCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9mc2wv
bHMtcmNwbS5jIGIvZHJpdmVycy9zb2MvZnNsL2xzLXJjcG0uYw0KPiA+ID4gbmV3IGZpbGUgbW9k
ZSAxMDA2NDQgaW5kZXggMDAwMDAwMC4uYjBmZWI4OA0KPiA+ID4gLS0tIC9kZXYvbnVsbA0KPiA+
ID4gKysrIGIvZHJpdmVycy9zb2MvZnNsL2xzLXJjcG0uYw0KPiA+ID4gQEAgLTAsMCArMSwxNTMg
QEANCj4gPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAvLyAvLyBwbGF0
X3BtLmMgLSBGcmVlc2NhbGUNCj4gPiA+ICtMYXllcnNjYXBlIFJDUE0gZHJpdmVyDQo+IA0KPiBU
aGUgZmlsZSBuYW1lIGhlcmUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSByZWFsIGZpbGUgbmFtZS4N
Cg0KR290IGl0LCB3aWxsIGNvcnJlY3QgaXQuDQoNCj4gPiA+ICsvLw0KPiA+ID4gKy8vIENvcHly
aWdodCAyMDE4IE5YUA0KPiA+ID4gKy8vDQo+ID4gPiArLy8gQXV0aG9yOiBSYW4gV2FuZyA8cmFu
LndhbmdfMUBueHAuY29tPiwNCj4gDQo+IFdoZXJlIGRvIHlvdSBuZWVkIHRoZSBjb21tYSBpbiB0
aGUgZW5kPw0KDQpNeSBiYWQsIHdpbGwgcmVtb3ZlIGNvbW1hIGluIG5leHQgdmVyc2lvbi4NCg0K
PiA+ID4gKw0KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+DQo+ID4gPiArI2luY2x1ZGUg
PGxpbnV4L21vZHVsZS5oPg0KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2Uu
aD4NCj4gPiA+ICsjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPg0KPiA+ID4gKyNpbmNsdWRl
IDxsaW51eC9zbGFiLmg+DQo+ID4gPiArI2luY2x1ZGUgPHNvYy9mc2wvcGxhdF9wbS5oPg0KPiA+
ID4gKw0KPiA+ID4gKyNkZWZpbmUgTUFYX0NPTVBBVElCTEVfTlVNICAgMTANCj4gPiA+ICsNCj4g
PiA+ICtzdHJ1Y3QgcmNwbV90IHsNCj4gPiA+ICsgICAgIHN0cnVjdCBkZXZpY2UgKmRldjsNCj4g
PiA+ICsgICAgIHZvaWQgX19pb21lbSAqaXBwZGV4cGNyX2FkZHI7DQo+ID4gPiArICAgICBib29s
IGJpZ19lbmRpYW47ICAgICAgICAvKiBCaWcvTGl0dGxlIGVuZGlhbiBvZiBSQ1BNIG1vZHVsZSAq
Lw0KPiA+ID4gK307DQo+ID4gPiArDQo+ID4gPiArLy8gcmNwbV9oYW5kbGUgLSBDb25maWd1cmUg
UkNQTSByZWcgYWNjb3JkaW5nIHRvIHdha2UgdXAgc291cmNlDQo+ID4gPiArcmVxdWVzdCAvLyBA
dXNlcl9kZXY6IHBvaW50ZXIgdG8gdXNlcidzIGRldmljZSBzdHJ1Y3QgLy8gQGZsYWc6IHRvDQo+
ID4gPiArZW5hYmxlKHRydWUpIG9yIGRpc2FibGUoZmFsc2UpIHdha2V1cCBzb3VyY2UgLy8gQGhh
bmRsZV9wcml2Og0KPiA+ID4gK3BvaW50ZXIgdG8gc3RydWN0IHJjcG1fdCBpbnN0YW5jZSAvLyAv
LyBSZXR1cm4gMCBvbiBzdWNjZXNzIG90aGVyDQo+ID4gPiArbmVnYXRpdmUgZXJybm8NCj4gDQo+
IEFsdGhvdWdoIExpbnVzIHByZWZlcnJlZCB0aGlzIC8vIGNvbW1lbnQgc3R5bGUuICBJJ20gbm90
IHN1cmUgaWYgdGhpcyB3aWxsIGJlDQo+IGhhbmRsZWQgY29ycmVjdGx5IGJ5IHRoZSBrZXJuZWwt
ZG9jIGNvbXBpbGVyLg0KPiBodHRwczovL2VtZWEwMS5zYWZlbGlua3MucHJvdGVjdGlvbi5vdXRs
b29rLmNvbS8/dXJsPWh0dHBzJTNBJTJGJTJGd3cNCj4gdy5rZXJuZWwub3JnJTJGZG9jJTJGaHRt
bCUyRnY0LjE4JTJGZG9jLWd1aWRlJTJGa2VybmVsLQ0KPiBkb2MuaHRtbCZhbXA7ZGF0YT0wMiU3
QzAxJTdDcmFuLndhbmdfMSU0MG54cC5jb20lN0NjMGQ4OGU2NjkwMzgNCj4gNGUwMmI5NTEwOGQ2
MTJkZWMyMzUlN0M2ODZlYTFkM2JjMmI0YzZmYTkyY2Q5OWM1YzMwMTYzNSU3QzAlN0MwDQo+ICU3
QzYzNjcxNzE0NTI4NTEyNjIwMCZhbXA7c2RhdGE9SDdHa1VOT0xWRyUyRkNjWkVTemh0SEJlSENi
TzkNCj4gJTJGSzRrOUVkSDMwQ3hxMiUyQk0lM0QmYW1wO3Jlc2VydmVkPTANCg0KU28sIGRvIHlv
dSB0aGluayBJIG5lZWQgdG8gY2hhbmdlIGFsbCBjb21tZW50IHN0eWxlIGJhY2sgdG8gJy8qIC4u
LiAqLycgPw0KQWN0dWFsbHkgSSBmZWVsIGEgbGl0dGxlIGJpdCBjb25mdXNlZCBoZXJlLg0KDQpS
ZWdhcmRzLA0KUmFuDQoNCj4gPiA+ICtzdGF0aWMgaW50IHJjcG1faGFuZGxlKHN0cnVjdCBkZXZp
Y2UgKnVzZXJfZGV2LCBib29sIGZsYWcsIHZvaWQNCj4gPiA+ICsqaGFuZGxlX3ByaXYpIHsNCj4g
PiA+ICsgICAgIHN0cnVjdCByY3BtX3QgKnJjcG07DQo+ID4gPiArICAgICBib29sIGJpZ19lbmRp
YW47DQo+ID4gPiArICAgICBjb25zdCBjaGFyICAqZGV2X2NvbXBhdGlibGVfYXJyYXlbTUFYX0NP
TVBBVElCTEVfTlVNXTsNCj4gPiA+ICsgICAgIHZvaWQgX19pb21lbSAqaXBwZGV4cGNyX2FkZHI7
DQo+ID4gPiArICAgICB1MzIgaXBwZGV4cGNyOw0KPiA+ID4gKyAgICAgdTMyIHNldF9iaXQ7DQo+
ID4gPiArICAgICBpbnQgcmV0LCBudW0sIGk7DQo+ID4gPiArDQo+ID4gPiArICAgICByY3BtID0g
aGFuZGxlX3ByaXY7DQo+ID4gPiArICAgICBiaWdfZW5kaWFuID0gcmNwbS0+YmlnX2VuZGlhbjsN
Cj4gPiA+ICsgICAgIGlwcGRleHBjcl9hZGRyID0gcmNwbS0+aXBwZGV4cGNyX2FkZHI7DQo+ID4g
PiArDQo+ID4gPiArICAgICBudW0gPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9zdHJpbmdfYXJyYXko
dXNlcl9kZXYsICJjb21wYXRpYmxlIiwNCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBkZXZf
Y29tcGF0aWJsZV9hcnJheSwgTUFYX0NPTVBBVElCTEVfTlVNKTsNCj4gPiA+ICsgICAgIGlmIChu
dW0gPCAwKQ0KPiA+ID4gKyAgICAgICAgICAgICByZXR1cm4gbnVtOw0KPiA+ID4gKw0KPiA+ID4g
KyAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7DQo+ID4gPiArICAgICAgICAgICAgIGlm
ICghZGV2aWNlX3Byb3BlcnR5X3ByZXNlbnQocmNwbS0+ZGV2LA0KPiA+ID4gKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfY29tcGF0aWJsZV9hcnJheVtpXSkpDQo+ID4g
PiArICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQo+ID4gPiArICAgICAgICAgICAgIGVs
c2Ugew0KPiA+IFJlbW92ZSB0aGlzIGVsc2UuDQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAg
cmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKHJjcG0tPmRldiwNCj4gPiA+ICsgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2NvbXBhdGlibGVfYXJyYXlbaV0sICZz
ZXRfYml0KTsNCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBpZiAocmV0KQ0KPiA+ID4gKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsNCj4gPiA+ICsNCj4gPiA+ICsg
ICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9wcm9wZXJ0eV9wcmVzZW50KHJjcG0tPmRl
diwNCj4gPiA+ICsNCj4gPiA+ICsgZGV2X2NvbXBhdGlibGVfYXJyYXlbaV0pKQ0KPiA+IFRoaXMg
aGFzIGJlZW4gY2hlY2tlZC4gQ29udGludWUgPyBvciByZXR1cm4gRU5PREVW77yfDQo+ID4gPiAr
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsNCj4gPiA+ICsgICAg
ICAgICAgICAgICAgICAgICBlbHNlIHsNCj4gPiBSZW1vdmUgdGhpcyBlbHNlLg0KPiA+ID4gKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMy
KHJjcG0tPmRldiwNCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBkZXZfY29tcGF0aWJsZV9hcnJheVtpXSwgJnNldF9iaXQpOw0KPiA+ID4gKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkNCj4gPiA+ICsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsNCj4gPiA+ICsNCj4gPiA+ICsgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIChiaWdfZW5kaWFuKQ0KPiA+ID4gKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpcHBkZXhwY3IgPSBpb3JlYWQzMmJlKGlwcGRleHBj
cl9hZGRyKTsNCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCj4gPiA+
ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBwZGV4cGNyID0NCj4gPiA+
ICsgaW9yZWFkMzIoaXBwZGV4cGNyX2FkZHIpOw0KPiA+ID4gKw0KPiA+ID4gKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKGZsYWcpDQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlwcGRleHBjciB8PSBzZXRfYml0Ow0KPiA+ID4gKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZWxzZQ0KPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpcHBkZXhwY3IgJj0gfnNldF9iaXQ7DQo+ID4gPiArDQo+ID4gPiArICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmlnX2VuZGlhbikgew0KPiA+ID4gKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3dyaXRlMzJiZShpcHBkZXhwY3IsIGlwcGRl
eHBjcl9hZGRyKTsNCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aXBwZGV4cGNyID0gaW9yZWFkMzJiZShpcHBkZXhwY3JfYWRkcik7DQo+ID4gPiArICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB9IGVsc2UNCj4gPiBpZiAoeCkgew0KPiA+IC4uLi4NCj4gPiAu
Li4uDQo+ID4gfSAgZWxzZSB7DQo+ID4NCj4gPiB9DQo+ID4gPiArICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlvd3JpdGUzMihpcHBkZXhwY3IsDQo+ID4gPiArIGlwcGRleHBj
cl9hZGRyKTsNCj4gPiA+ICsNCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiAwOw0KPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIH0NCj4gPiA+ICsgICAgICAgICAg
ICAgfQ0KPiA+ID4gKyAgICAgfQ0KPiA+ID4gKw0KPiA+ID4gKyAgICAgcmV0dXJuIC1FTk9ERVY7
DQo+ID4gPiArfQ0KPiA+ID4gKw0KPiA+ID4gK3N0YXRpYyBpbnQgbHNfcmNwbV9wcm9iZShzdHJ1
Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KSB7DQo+ID4gPiArICAgICBzdHJ1Y3QgcmVzb3VyY2Ug
KnI7DQo+ID4gPiArICAgICBzdHJ1Y3QgcmNwbV90ICpyY3BtOw0KPiA+ID4gKw0KPiA+ID4gKyAg
ICAgciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7DQo+
ID4gPiArICAgICBpZiAoIXIpDQo+ID4gPiArICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOw0K
PiA+ID4gKw0KPiA+ID4gKyAgICAgcmNwbSA9IGttYWxsb2Moc2l6ZW9mKCpyY3BtKSwgR0ZQX0tF
Uk5FTCk7DQo+ID4ga3phbGxvYyBpcyBiZXR0ZXIuDQo+ID4gPiArICAgICBpZiAoIXJjcG0pDQo+
ID4gPiArICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOw0KPiA+ID4gKw0KPiA+ID4gKyAgICAg
cmNwbS0+YmlnX2VuZGlhbiA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woJnBkZXYtPmRldiwN
Cj4gPiA+ICsgImJpZy1lbmRpYW4iKTsNCj4gPiA+ICsNCj4gPiA+ICsgICAgIHJjcG0tPmlwcGRl
eHBjcl9hZGRyID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHIpOw0KPiA+ID4g
KyAgICAgaWYgKElTX0VSUihyY3BtLT5pcHBkZXhwY3JfYWRkcikpDQo+ID4gPiArICAgICAgICAg
ICAgIHJldHVybiBQVFJfRVJSKHJjcG0tPmlwcGRleHBjcl9hZGRyKTsNCj4gPiA+ICsNCj4gPiA+
ICsgICAgIHJjcG0tPmRldiA9ICZwZGV2LT5kZXY7DQo+ID4gPiArICAgICBwbGF0Zm9ybV9zZXRf
ZHJ2ZGF0YShwZGV2LCByY3BtKTsNCj4gPiA+ICsNCj4gPiA+ICsgICAgIHJldHVybiByZWdpc3Rl
cl9mc2xfcGxhdGZvcm1fd2FrZXVwX3NvdXJjZShyY3BtX2hhbmRsZSwgcmNwbSk7DQo+ID4gPiAr
fQ0KPiA+ID4gKw0KPiA+ID4gK3N0YXRpYyBpbnQgbHNfcmNwbV9yZW1vdmUoc3RydWN0IHBsYXRm
b3JtX2RldmljZSAqcGRldikgew0KPiA+ID4gKyAgICAgc3RydWN0IHJjcG1fdCAgICpyY3BtOw0K
PiA+IE5vdCBuZWVkIGEgdGFibGUuDQo+ID4NCj4gPiBDaGVlcnMsDQo+ID4gLURvbmdzaGVuZw0K
PiA+DQo+ID4gPiArDQo+ID4gPiArICAgICByY3BtID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRl
dik7DQo+ID4gPiArICAgICBkZXJlZ2lzdGVyX2ZzbF9wbGF0Zm9ybV93YWtldXBfc291cmNlKHJj
cG0pOw0KPiA+ID4gKyAgICAga2ZyZWUocmNwbSk7DQo+ID4gPiArDQo+ID4gPiArICAgICByZXR1
cm4gMDsNCj4gPiA+ICt9DQo+ID4gPiArDQo+ID4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9k
ZXZpY2VfaWQgbHNfcmNwbV9vZl9tYXRjaFtdID0gew0KPiA+ID4gKyAgICAgeyAuY29tcGF0aWJs
ZSA9ICJmc2wscW9yaXEtcmNwbS0yLjEiLCB9LA0KPiA+ID4gKyAgICAge30NCj4gPiA+ICt9Ow0K
PiA+ID4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGxzX3JjcG1fb2ZfbWF0Y2gpOw0KPiA+ID4g
Kw0KPiA+ID4gK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGxzX3JjcG1fZHJpdmVyID0g
ew0KPiA+ID4gKyAgICAgLmRyaXZlciA9IHsNCj4gPiA+ICsgICAgICAgICAgICAgLm5hbWUgPSAi
bHMtcmNwbSIsDQo+ID4gPiArICAgICAgICAgICAgIC5vZl9tYXRjaF90YWJsZSA9IGxzX3JjcG1f
b2ZfbWF0Y2gsDQo+ID4gPiArICAgICB9LA0KPiA+ID4gKyAgICAgLnByb2JlID0gbHNfcmNwbV9w
cm9iZSwNCj4gPiA+ICsgICAgIC5yZW1vdmUgPSBsc19yY3BtX3JlbW92ZSwNCj4gPiA+ICt9Ow0K
PiA+ID4gKw0KPiA+ID4gK3N0YXRpYyBpbnQgX19pbml0IGxzX3JjcG1faW5pdCh2b2lkKSB7DQo+
ID4gPiArICAgICByZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZsc19yY3BtX2RyaXZl
cik7DQo+ID4gPiArfQ0KPiA+ID4gK3N1YnN5c19pbml0Y2FsbChsc19yY3BtX2luaXQpOw0KPiA+
ID4gKw0KPiA+ID4gK3N0YXRpYyB2b2lkIF9fZXhpdCBsc19yY3BtX2V4aXQodm9pZCkgew0KPiA+
ID4gKyAgICAgcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmxzX3JjcG1fZHJpdmVyKTsNCj4g
PiA+ICt9DQo+ID4gPiArbW9kdWxlX2V4aXQobHNfcmNwbV9leGl0KTsNCj4gPg0KPiA+DQo=
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-07 9:48 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-07 9:48 UTC (permalink / raw)
To: Leo Li
Cc: dongsheng.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
Hi Leo,
On September 05, 2018 at 11:22 Yang Li wrote:
> -----Original Message-----
> From: Li Yang <leoyang.li@nxp.com>
> Sent: Wednesday, September 05, 2018 11:22
> To: dongsheng.wang@hxt-semitech.com
> Cc: Ran Wang <ran.wang_1@nxp.com>; Rob Herring <robh+dt@kernel.org>;
> Mark Rutland <mark.rutland@arm.com>; open list:OPEN FIRMWARE AND
> FLATTENED DEVICE TREE BINDINGS <devicetree@vger.kernel.org>; linuxppc-
> dev <linuxppc-dev@lists.ozlabs.org>; lkml <linux-kernel@vger.kernel.org>;
> moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE <linux-arm-
> kernel@lists.infradead.org>
> Subject: Re: [PATCH 3/3] soc: fsl: add RCPM driver
>
> On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng <dongsheng.wang@hxt-
> 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%2F133&data=02%7C01%7Cran.wang_
> 1%40nxp.com%7Cc0d88e6690384e02b95108d612dec235%7C686ea1d3bc2b4c
> 6fa92cd99c5c301635%7C0%7C0%7C636717145285126200&sdata=JIoCZp
> WhRyW76EqgSflfTDA1f0gMQGKa%2FcbvSc5CO%2Fw%3D&reserved=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 <chenhui.zhao@nxp.com>
> > > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > > ---
> > > 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 0000000..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 <ran.wang_1@nxp.com>,
>
> Where do you need the comma in the end?
My bad, will remove comma in next version.
> > > +
> > > +#include <linux/init.h>
> > > +#include <linux/module.h>
> > > +#include <linux/platform_device.h>
> > > +#include <linux/of_address.h>
> > > +#include <linux/slab.h>
> > > +#include <soc/fsl/plat_pm.h>
> > > +
> > > +#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://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
> w.kernel.org%2Fdoc%2Fhtml%2Fv4.18%2Fdoc-guide%2Fkernel-
> doc.html&data=02%7C01%7Cran.wang_1%40nxp.com%7Cc0d88e669038
> 4e02b95108d612dec235%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0
> %7C636717145285126200&sdata=H7GkUNOLVG%2FCcZESzhtHBeHCbO9
> %2FK4k9EdH30Cxq2%2BM%3D&reserved=0
So, do you think I need to change all comment style back to '/* ... */' ?
Actually I feel a little bit confused here.
Regards,
Ran
> > > +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], &set_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], &set_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
> > if (x) {
> > ....
> > ....
> > } else {
> >
> > }
> > > + iowrite32(ippdexpcr,
> > > + ippdexpcr_addr);
> > > +
> > > + return 0;
> > > + }
> > > + }
> > > + }
> > > +
> > > + return -ENODEV;
> > > +}
> > > +
> > > +static int ls_rcpm_probe(struct platform_device *pdev) {
> > > + struct resource *r;
> > > + struct rcpm_t *rcpm;
> > > +
> > > + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > > + if (!r)
> > > + return -ENODEV;
> > > +
> > > + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
> > kzalloc is better.
> > > + if (!rcpm)
> > > + return -ENOMEM;
> > > +
> > > + rcpm->big_endian = device_property_read_bool(&pdev->dev,
> > > + "big-endian");
> > > +
> > > + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> > > + if (IS_ERR(rcpm->ippdexpcr_addr))
> > > + return PTR_ERR(rcpm->ippdexpcr_addr);
> > > +
> > > + rcpm->dev = &pdev->dev;
> > > + platform_set_drvdata(pdev, rcpm);
> > > +
> > > + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm);
> > > +}
> > > +
> > > +static int ls_rcpm_remove(struct platform_device *pdev) {
> > > + struct rcpm_t *rcpm;
> > Not need a table.
> >
> > Cheers,
> > -Dongsheng
> >
> > > +
> > > + rcpm = platform_get_drvdata(pdev);
> > > + deregister_fsl_platform_wakeup_source(rcpm);
> > > + kfree(rcpm);
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +static const struct of_device_id ls_rcpm_of_match[] = {
> > > + { .compatible = "fsl,qoriq-rcpm-2.1", },
> > > + {}
> > > +};
> > > +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> > > +
> > > +static struct platform_driver ls_rcpm_driver = {
> > > + .driver = {
> > > + .name = "ls-rcpm",
> > > + .of_match_table = ls_rcpm_of_match,
> > > + },
> > > + .probe = ls_rcpm_probe,
> > > + .remove = ls_rcpm_remove,
> > > +};
> > > +
> > > +static int __init ls_rcpm_init(void) {
> > > + return platform_driver_register(&ls_rcpm_driver);
> > > +}
> > > +subsys_initcall(ls_rcpm_init);
> > > +
> > > +static void __exit ls_rcpm_exit(void) {
> > > + platform_driver_unregister(&ls_rcpm_driver);
> > > +}
> > > +module_exit(ls_rcpm_exit);
> >
> >
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
2018-09-07 9:48 ` Ran Wang
(?)
@ 2018-09-07 18:56 ` Li Yang
-1 siblings, 0 replies; 50+ messages in thread
From: Li Yang @ 2018-09-07 18:56 UTC (permalink / raw)
To: Ran Wang
Cc: Mark Rutland, dongsheng.wang,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS, lkml,
Rob Herring, linuxppc-dev,
moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE
On Fri, Sep 7, 2018 at 4:51 AM Ran Wang <ran.wang_1@nxp.com> wrote:
>
> Hi Leo,
>
> On September 05, 2018 at 11:22 Yang Li wrote:
> > -----Original Message-----
> > From: Li Yang <leoyang.li@nxp.com>
> > Sent: Wednesday, September 05, 2018 11:22
> > To: dongsheng.wang@hxt-semitech.com
> > Cc: Ran Wang <ran.wang_1@nxp.com>; Rob Herring <robh+dt@kernel.org>;
> > Mark Rutland <mark.rutland@arm.com>; open list:OPEN FIRMWARE AND
> > FLATTENED DEVICE TREE BINDINGS <devicetree@vger.kernel.org>; linuxppc-
> > dev <linuxppc-dev@lists.ozlabs.org>; lkml <linux-kernel@vger.kernel.org>;
> > moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE <linux-arm-
> > kernel@lists.infradead.org>
> > Subject: Re: [PATCH 3/3] soc: fsl: add RCPM driver
> >
> > On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng <dongsheng.wang@hxt-
> > 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%2F133&data=02%7C01%7Cran.wang_
> > 1%40nxp.com%7Cc0d88e6690384e02b95108d612dec235%7C686ea1d3bc2b4c
> > 6fa92cd99c5c301635%7C0%7C0%7C636717145285126200&sdata=JIoCZp
> > WhRyW76EqgSflfTDA1f0gMQGKa%2FcbvSc5CO%2Fw%3D&reserved=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 <chenhui.zhao@nxp.com>
> > > > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > > > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > > > ---
> > > > 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 0000000..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 <ran.wang_1@nxp.com>,
> >
> > Where do you need the comma in the end?
>
> My bad, will remove comma in next version.
>
> > > > +
> > > > +#include <linux/init.h>
> > > > +#include <linux/module.h>
> > > > +#include <linux/platform_device.h>
> > > > +#include <linux/of_address.h>
> > > > +#include <linux/slab.h>
> > > > +#include <soc/fsl/plat_pm.h>
> > > > +
> > > > +#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://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
> > w.kernel.org%2Fdoc%2Fhtml%2Fv4.18%2Fdoc-guide%2Fkernel-
> > doc.html&data=02%7C01%7Cran.wang_1%40nxp.com%7Cc0d88e669038
> > 4e02b95108d612dec235%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0
> > %7C636717145285126200&sdata=H7GkUNOLVG%2FCcZESzhtHBeHCbO9
> > %2FK4k9EdH30Cxq2%2BM%3D&reserved=0
>
> So, do you think I need to change all comment style back to '/* ... */' ?
> Actually I feel a little bit confused here.
I think Linus's comment about // comment style applies to normal code
comment. But kernel-doc comment is a special kind of code comment
that needs to meet certain requirements. People can use the
scripts/kernel-doc tool to generate readable API documents from the
source code. It looks like you wanted to make the function
description aligned with the kernel-doc format, but kernel-doc
specifically requires to use the /* */ style(at least for now).
Regards,
Leo
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-07 18:56 ` Li Yang
0 siblings, 0 replies; 50+ messages in thread
From: Li Yang @ 2018-09-07 18:56 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Sep 7, 2018 at 4:51 AM Ran Wang <ran.wang_1@nxp.com> wrote:
>
> Hi Leo,
>
> On September 05, 2018 at 11:22 Yang Li wrote:
> > -----Original Message-----
> > From: Li Yang <leoyang.li@nxp.com>
> > Sent: Wednesday, September 05, 2018 11:22
> > To: dongsheng.wang at hxt-semitech.com
> > Cc: Ran Wang <ran.wang_1@nxp.com>; Rob Herring <robh+dt@kernel.org>;
> > Mark Rutland <mark.rutland@arm.com>; open list:OPEN FIRMWARE AND
> > FLATTENED DEVICE TREE BINDINGS <devicetree@vger.kernel.org>; linuxppc-
> > dev <linuxppc-dev@lists.ozlabs.org>; lkml <linux-kernel@vger.kernel.org>;
> > moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE <linux-arm-
> > kernel at lists.infradead.org>
> > Subject: Re: [PATCH 3/3] soc: fsl: add RCPM driver
> >
> > On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng <dongsheng.wang@hxt-
> > 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%2F133&data=02%7C01%7Cran.wang_
> > 1%40nxp.com%7Cc0d88e6690384e02b95108d612dec235%7C686ea1d3bc2b4c
> > 6fa92cd99c5c301635%7C0%7C0%7C636717145285126200&sdata=JIoCZp
> > WhRyW76EqgSflfTDA1f0gMQGKa%2FcbvSc5CO%2Fw%3D&reserved=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 <chenhui.zhao@nxp.com>
> > > > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > > > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > > > ---
> > > > 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 0000000..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 <ran.wang_1@nxp.com>,
> >
> > Where do you need the comma in the end?
>
> My bad, will remove comma in next version.
>
> > > > +
> > > > +#include <linux/init.h>
> > > > +#include <linux/module.h>
> > > > +#include <linux/platform_device.h>
> > > > +#include <linux/of_address.h>
> > > > +#include <linux/slab.h>
> > > > +#include <soc/fsl/plat_pm.h>
> > > > +
> > > > +#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://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
> > w.kernel.org%2Fdoc%2Fhtml%2Fv4.18%2Fdoc-guide%2Fkernel-
> > doc.html&data=02%7C01%7Cran.wang_1%40nxp.com%7Cc0d88e669038
> > 4e02b95108d612dec235%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0
> > %7C636717145285126200&sdata=H7GkUNOLVG%2FCcZESzhtHBeHCbO9
> > %2FK4k9EdH30Cxq2%2BM%3D&reserved=0
>
> So, do you think I need to change all comment style back to '/* ... */' ?
> Actually I feel a little bit confused here.
I think Linus's comment about // comment style applies to normal code
comment. But kernel-doc comment is a special kind of code comment
that needs to meet certain requirements. People can use the
scripts/kernel-doc tool to generate readable API documents from the
source code. It looks like you wanted to make the function
description aligned with the kernel-doc format, but kernel-doc
specifically requires to use the /* */ style(at least for now).
Regards,
Leo
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-07 18:56 ` Li Yang
0 siblings, 0 replies; 50+ messages in thread
From: Li Yang @ 2018-09-07 18:56 UTC (permalink / raw)
To: Ran Wang
Cc: Mark Rutland, dongsheng.wang,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS, lkml,
Rob Herring, linuxppc-dev,
moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE
On Fri, Sep 7, 2018 at 4:51 AM Ran Wang <ran.wang_1@nxp.com> wrote:
>
> Hi Leo,
>
> On September 05, 2018 at 11:22 Yang Li wrote:
> > -----Original Message-----
> > From: Li Yang <leoyang.li@nxp.com>
> > Sent: Wednesday, September 05, 2018 11:22
> > To: dongsheng.wang@hxt-semitech.com
> > Cc: Ran Wang <ran.wang_1@nxp.com>; Rob Herring <robh+dt@kernel.org>;
> > Mark Rutland <mark.rutland@arm.com>; open list:OPEN FIRMWARE AND
> > FLATTENED DEVICE TREE BINDINGS <devicetree@vger.kernel.org>; linuxppc-
> > dev <linuxppc-dev@lists.ozlabs.org>; lkml <linux-kernel@vger.kernel.org>;
> > moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE <linux-arm-
> > kernel@lists.infradead.org>
> > Subject: Re: [PATCH 3/3] soc: fsl: add RCPM driver
> >
> > On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng <dongsheng.wang@hxt-
> > 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%2F133&data=02%7C01%7Cran.wang_
> > 1%40nxp.com%7Cc0d88e6690384e02b95108d612dec235%7C686ea1d3bc2b4c
> > 6fa92cd99c5c301635%7C0%7C0%7C636717145285126200&sdata=JIoCZp
> > WhRyW76EqgSflfTDA1f0gMQGKa%2FcbvSc5CO%2Fw%3D&reserved=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 <chenhui.zhao@nxp.com>
> > > > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > > > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > > > ---
> > > > 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 0000000..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 <ran.wang_1@nxp.com>,
> >
> > Where do you need the comma in the end?
>
> My bad, will remove comma in next version.
>
> > > > +
> > > > +#include <linux/init.h>
> > > > +#include <linux/module.h>
> > > > +#include <linux/platform_device.h>
> > > > +#include <linux/of_address.h>
> > > > +#include <linux/slab.h>
> > > > +#include <soc/fsl/plat_pm.h>
> > > > +
> > > > +#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://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
> > w.kernel.org%2Fdoc%2Fhtml%2Fv4.18%2Fdoc-guide%2Fkernel-
> > doc.html&data=02%7C01%7Cran.wang_1%40nxp.com%7Cc0d88e669038
> > 4e02b95108d612dec235%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0
> > %7C636717145285126200&sdata=H7GkUNOLVG%2FCcZESzhtHBeHCbO9
> > %2FK4k9EdH30Cxq2%2BM%3D&reserved=0
>
> So, do you think I need to change all comment style back to '/* ... */' ?
> Actually I feel a little bit confused here.
I think Linus's comment about // comment style applies to normal code
comment. But kernel-doc comment is a special kind of code comment
that needs to meet certain requirements. People can use the
scripts/kernel-doc tool to generate readable API documents from the
source code. It looks like you wanted to make the function
description aligned with the kernel-doc format, but kernel-doc
specifically requires to use the /* */ style(at least for now).
Regards,
Leo
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
2018-09-07 18:56 ` Li Yang
(?)
(?)
@ 2018-09-10 3:31 ` Ran Wang
-1 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-10 3:31 UTC (permalink / raw)
To: Leo Li
Cc: Mark Rutland, dongsheng.wang,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS, lkml,
Rob Herring, linuxppc-dev,
moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE
Hi Leo,
On 2018/9/7 4:51, Yang Li wrote:
>
> On Fri, Sep 7, 2018 at 4:51 AM Ran Wang <ran.wang_1@nxp.com> wrote:
> >
> > Hi Leo,
> >
> > On September 05, 2018 at 11:22 Yang Li wrote:
> > > -----Original Message-----
> > > From: Li Yang <leoyang.li@nxp.com>
> > > Sent: Wednesday, September 05, 2018 11:22
> > > To: dongsheng.wang@hxt-semitech.com
> > > Cc: Ran Wang <ran.wang_1@nxp.com>; Rob Herring
> <robh+dt@kernel.org>;
> > > Mark Rutland <mark.rutland@arm.com>; open list:OPEN FIRMWARE AND
> > > FLATTENED DEVICE TREE BINDINGS <devicetree@vger.kernel.org>;
> > > linuxppc- dev <linuxppc-dev@lists.ozlabs.org>; lkml
> > > <linux-kernel@vger.kernel.org>; moderated list:ARM/FREESCALE IMX /
> > > MXC ARM ARCHITECTURE <linux-arm- kernel@lists.infradead.org>
> > > Subject: Re: [PATCH 3/3] soc: fsl: add RCPM driver
> > >
> > > On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng
> <dongsheng.wang@hxt-
> > > 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%2F133&data=02%7C01%7Cran.w
> ang_
> > >
> 1%40nxp.com%7Cc0d88e6690384e02b95108d612dec235%7C686ea1d3bc2b4c
> > >
> 6fa92cd99c5c301635%7C0%7C0%7C636717145285126200&sdata=JIoCZp
> > >
> WhRyW76EqgSflfTDA1f0gMQGKa%2FcbvSc5CO%2Fw%3D&reserved=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 <chenhui.zhao@nxp.com>
> > > > > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > > > > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > > > > ---
> > > > > 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
> > > > > 0000000..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 <ran.wang_1@nxp.com>,
> > >
> > > Where do you need the comma in the end?
> >
> > My bad, will remove comma in next version.
> >
> > > > > +
> > > > > +#include <linux/init.h>
> > > > > +#include <linux/module.h>
> > > > > +#include <linux/platform_device.h> #include
> > > > > +<linux/of_address.h> #include <linux/slab.h> #include
> > > > > +<soc/fsl/plat_pm.h>
> > > > > +
> > > > > +#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://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fw
> > > w
> > > w.kernel.org%2Fdoc%2Fhtml%2Fv4.18%2Fdoc-guide%2Fkernel-
> > >
> doc.html&data=02%7C01%7Cran.wang_1%40nxp.com%7Cc0d88e669038
> > >
> 4e02b95108d612dec235%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0
> > > %7C636717145285126200&sdata=H7GkUNOLVG%2FCcZESzhtHBeHC
> bO9
> > > %2FK4k9EdH30Cxq2%2BM%3D&reserved=0
> >
> > So, do you think I need to change all comment style back to '/* ... */' ?
> > Actually I feel a little bit confused here.
>
> I think Linus's comment about // comment style applies to normal code
> comment. But kernel-doc comment is a special kind of code comment that
> needs to meet certain requirements. People can use the scripts/kernel-doc
> tool to generate readable API documents from the source code. It looks like
> you wanted to make the function description aligned with the kernel-doc
> format, but kernel-doc specifically requires to use the /* */ style(at least for
> now).
OK, will change style back to /* */.
Regards,
Ran
> Regards,
> Leo
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-10 3:31 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-10 3:31 UTC (permalink / raw)
To: linux-arm-kernel
Hi Leo,
On 2018/9/7 4:51, Yang Li wrote:
>
> On Fri, Sep 7, 2018 at 4:51 AM Ran Wang <ran.wang_1@nxp.com> wrote:
> >
> > Hi Leo,
> >
> > On September 05, 2018 at 11:22 Yang Li wrote:
> > > -----Original Message-----
> > > From: Li Yang <leoyang.li@nxp.com>
> > > Sent: Wednesday, September 05, 2018 11:22
> > > To: dongsheng.wang at hxt-semitech.com
> > > Cc: Ran Wang <ran.wang_1@nxp.com>; Rob Herring
> <robh+dt@kernel.org>;
> > > Mark Rutland <mark.rutland@arm.com>; open list:OPEN FIRMWARE AND
> > > FLATTENED DEVICE TREE BINDINGS <devicetree@vger.kernel.org>;
> > > linuxppc- dev <linuxppc-dev@lists.ozlabs.org>; lkml
> > > <linux-kernel@vger.kernel.org>; moderated list:ARM/FREESCALE IMX /
> > > MXC ARM ARCHITECTURE <linux-arm- kernel@lists.infradead.org>
> > > Subject: Re: [PATCH 3/3] soc: fsl: add RCPM driver
> > >
> > > On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng
> <dongsheng.wang@hxt-
> > > 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%2F133&data=02%7C01%7Cran.w
> ang_
> > >
> 1%40nxp.com%7Cc0d88e6690384e02b95108d612dec235%7C686ea1d3bc2b4c
> > >
> 6fa92cd99c5c301635%7C0%7C0%7C636717145285126200&sdata=JIoCZp
> > >
> WhRyW76EqgSflfTDA1f0gMQGKa%2FcbvSc5CO%2Fw%3D&reserved=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 <chenhui.zhao@nxp.com>
> > > > > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > > > > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > > > > ---
> > > > > 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
> > > > > 0000000..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 <ran.wang_1@nxp.com>,
> > >
> > > Where do you need the comma in the end?
> >
> > My bad, will remove comma in next version.
> >
> > > > > +
> > > > > +#include <linux/init.h>
> > > > > +#include <linux/module.h>
> > > > > +#include <linux/platform_device.h> #include
> > > > > +<linux/of_address.h> #include <linux/slab.h> #include
> > > > > +<soc/fsl/plat_pm.h>
> > > > > +
> > > > > +#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://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fw
> > > w
> > > w.kernel.org%2Fdoc%2Fhtml%2Fv4.18%2Fdoc-guide%2Fkernel-
> > >
> doc.html&data=02%7C01%7Cran.wang_1%40nxp.com%7Cc0d88e669038
> > >
> 4e02b95108d612dec235%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0
> > > %7C636717145285126200&sdata=H7GkUNOLVG%2FCcZESzhtHBeHC
> bO9
> > > %2FK4k9EdH30Cxq2%2BM%3D&reserved=0
> >
> > So, do you think I need to change all comment style back to '/* ... */' ?
> > Actually I feel a little bit confused here.
>
> I think Linus's comment about // comment style applies to normal code
> comment. But kernel-doc comment is a special kind of code comment that
> needs to meet certain requirements. People can use the scripts/kernel-doc
> tool to generate readable API documents from the source code. It looks like
> you wanted to make the function description aligned with the kernel-doc
> format, but kernel-doc specifically requires to use the /* */ style(at least for
> now).
OK, will change style back to /* */.
Regards,
Ran
> Regards,
> Leo
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-10 3:31 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-10 3:31 UTC (permalink / raw)
To: Leo Li
Cc: Mark Rutland, dongsheng.wang,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS, lkml,
Rob Herring, linuxppc-dev,
moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE
SGkgTGVvLA0KDQpPbiAyMDE4LzkvNyA0OjUxLCBZYW5nIExpIHdyb3RlOg0KPiANCj4gT24gRnJp
LCBTZXAgNywgMjAxOCBhdCA0OjUxIEFNIFJhbiBXYW5nIDxyYW4ud2FuZ18xQG54cC5jb20+IHdy
b3RlOg0KPiA+DQo+ID4gSGkgTGVvLA0KPiA+DQo+ID4gT24gU2VwdGVtYmVyIDA1LCAyMDE4IGF0
IDExOjIyIFlhbmcgTGkgd3JvdGU6DQo+ID4gPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0K
PiA+ID4gRnJvbTogTGkgWWFuZyA8bGVveWFuZy5saUBueHAuY29tPg0KPiA+ID4gU2VudDogV2Vk
bmVzZGF5LCBTZXB0ZW1iZXIgMDUsIDIwMTggMTE6MjINCj4gPiA+IFRvOiBkb25nc2hlbmcud2Fu
Z0BoeHQtc2VtaXRlY2guY29tDQo+ID4gPiBDYzogUmFuIFdhbmcgPHJhbi53YW5nXzFAbnhwLmNv
bT47IFJvYiBIZXJyaW5nDQo+IDxyb2JoK2R0QGtlcm5lbC5vcmc+Ow0KPiA+ID4gTWFyayBSdXRs
YW5kIDxtYXJrLnJ1dGxhbmRAYXJtLmNvbT47IG9wZW4gbGlzdDpPUEVOIEZJUk1XQVJFIEFORA0K
PiA+ID4gRkxBVFRFTkVEIERFVklDRSBUUkVFIEJJTkRJTkdTIDxkZXZpY2V0cmVlQHZnZXIua2Vy
bmVsLm9yZz47DQo+ID4gPiBsaW51eHBwYy0gZGV2IDxsaW51eHBwYy1kZXZAbGlzdHMub3psYWJz
Lm9yZz47IGxrbWwNCj4gPiA+IDxsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnPjsgbW9kZXJh
dGVkIGxpc3Q6QVJNL0ZSRUVTQ0FMRSBJTVggLw0KPiA+ID4gTVhDIEFSTSBBUkNISVRFQ1RVUkUg
PGxpbnV4LWFybS0ga2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmc+DQo+ID4gPiBTdWJqZWN0OiBS
ZTogW1BBVENIIDMvM10gc29jOiBmc2w6IGFkZCBSQ1BNIGRyaXZlcg0KPiA+ID4NCj4gPiA+IE9u
IFR1ZSwgU2VwIDQsIDIwMTggYXQgOTo1OCBQTSBXYW5nLCBEb25nc2hlbmcNCj4gPGRvbmdzaGVu
Zy53YW5nQGh4dC0NCj4gPiA+IHNlbWl0ZWNoLmNvbT4gd3JvdGU6DQo+ID4gPiA+DQo+ID4gPiA+
IFBsZWFzZSBjaGFuZ2UgeW91ciBjb21tZW50cyBzdHlsZS4NCj4gPiA+DQo+ID4gPiBBbHRob3Vn
aCB0aGlzIGRvZXNuJ3QgZ2V0IGludG8gdGhlIExpbnV4IGtlcm5lbCBjb2Rpbmcgc3R5bGUNCj4g
PiA+IGRvY3VtZW50YXRpb24geWV0LCBMaW51cyBzZWVtcyBjaGFuZ2VkIGhpcyBtaW5kIHRvIHBy
ZWZlciAvLyB0aGFuIC8qDQo+ID4gPiAqLyBjb21tZW50IHN0eWxlIG5vdy4NCj4gPiA+IGh0dHBz
Oi8vZW1lYTAxLnNhZmVsaW5rcy5wcm90ZWN0aW9uLm91dGxvb2suY29tLz91cmw9aHR0cHMlM0El
MkYlMkZsDQo+ID4gPg0KPiBrbWwgLm9yZyUyRmxrbWwlMkYyMDE3JTJGMTElMkYyNSUyRjEzMyZh
bXA7ZGF0YT0wMiU3QzAxJTdDcmFuLncNCj4gYW5nXw0KPiA+ID4NCj4gMSU0MG54cC5jb20lN0Nj
MGQ4OGU2NjkwMzg0ZTAyYjk1MTA4ZDYxMmRlYzIzNSU3QzY4NmVhMWQzYmMyYjRjDQo+ID4gPg0K
PiA2ZmE5MmNkOTljNWMzMDE2MzUlN0MwJTdDMCU3QzYzNjcxNzE0NTI4NTEyNjIwMCZhbXA7c2Rh
dGE9SklvQ1pwDQo+ID4gPg0KPiBXaFJ5Vzc2RXFnU2ZsZlREQTFmMGdNUUdLYSUyRmNidlNjNUNP
JTJGdyUzRCZhbXA7cmVzZXJ2ZWQ9MA0KPiA+ID4gU28gdGhlDQo+ID4gPiAvLyBzdHlsZSBzaG91
bGQgYmUgYWNjZXB0YWJsZSBmb3Igbm93Lg0KPiA+ID4NCj4gPiA+ID4NCj4gPiA+ID4gT24gMjAx
OC84LzMxIDExOjU2LCBSYW4gV2FuZyB3cm90ZToNCj4gPiA+ID4gPiBUaGUgTlhQJ3MgUW9ySVEg
UHJvY2Vzc29ycyBiYXNlZCBvbiBBUk0gQ29yZSBoYXZlIFJDUE0gbW9kdWxlDQo+ID4gPiA+ID4g
KFJ1biBDb250cm9sIGFuZCBQb3dlciBNYW5hZ2VtZW50KSwgd2hpY2ggcGVyZm9ybXMgYWxsDQo+
ID4gPiA+ID4gZGV2aWNlLWxldmVsIHRhc2tzIGFzc29jaWF0ZWQgd2l0aCBwb3dlciBtYW5hZ2Vt
ZW50IHN1Y2ggYXMNCj4gd2FrZXVwIHNvdXJjZSBjb250cm9sLg0KPiA+ID4gPiA+DQo+ID4gPiA+
ID4gVGhpcyBkcml2ZXIgZGVwZW5kcyBvbiBGU0wgcGxhdGZvcm0gUE0gZHJpdmVyIGZyYW1ld29y
ayB3aGljaA0KPiA+ID4gPiA+IGhlbHAgdG8gaXNvbGF0ZSB1c2VyIGFuZCBQTSBzZXJ2aWNlIHBy
b3ZpZGVyIChzdWNoIGFzIFJDUE0gZHJpdmVyKS4NCj4gPiA+ID4gPg0KPiA+ID4gPiA+IFNpZ25l
ZC1vZmYtYnk6IENoZW5odWkgWmhhbyA8Y2hlbmh1aS56aGFvQG54cC5jb20+DQo+ID4gPiA+ID4g
U2lnbmVkLW9mZi1ieTogWWluZyBaaGFuZyA8eWluZy56aGFuZzIyNDU1QG54cC5jb20+DQo+ID4g
PiA+ID4gU2lnbmVkLW9mZi1ieTogUmFuIFdhbmcgPHJhbi53YW5nXzFAbnhwLmNvbT4NCj4gPiA+
ID4gPiAtLS0NCj4gPiA+ID4gPiAgZHJpdmVycy9zb2MvZnNsL0tjb25maWcgICB8ICAgIDYgKysN
Cj4gPiA+ID4gPiAgZHJpdmVycy9zb2MvZnNsL01ha2VmaWxlICB8ICAgIDEgKw0KPiA+ID4gPiA+
ICBkcml2ZXJzL3NvYy9mc2wvbHMtcmNwbS5jIHwgIDE1Mw0KPiA+ID4gPiA+ICsrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KPiA+ID4gPiA+ICAzIGZpbGVzIGNo
YW5nZWQsIDE2MCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKSAgY3JlYXRlIG1vZGUNCj4g
PiA+ID4gPiAxMDA2NDQgZHJpdmVycy9zb2MvZnNsL2xzLXJjcG0uYw0KPiA+ID4gPiA+DQo+ID4g
PiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL2ZzbC9LY29uZmlnIGIvZHJpdmVycy9zb2Mv
ZnNsL0tjb25maWcNCj4gPiA+ID4gPiBpbmRleCA2NTE3NDEyLi44ODIzMzBkIDEwMDY0NA0KPiA+
ID4gPiA+IC0tLSBhL2RyaXZlcnMvc29jL2ZzbC9LY29uZmlnDQo+ID4gPiA+ID4gKysrIGIvZHJp
dmVycy9zb2MvZnNsL0tjb25maWcNCj4gPiA+ID4gPiBAQCAtMzAsMyArMzAsOSBAQCBjb25maWcg
RlNMX1BMQVRfUE0NCj4gPiA+ID4gPiAgICAgICAgIGhhdmUgdG8ga25vdyB0aGUgaW1wbGVtZW50
IGRldGFpbHMgb2Ygd2FrZXVwIGZ1bmN0aW9uIGl0DQo+IHJlcXVpcmUuDQo+ID4gPiA+ID4gICAg
ICAgICBCZXNpZGVzLCBpdCBpcyBhbHNvIGVhc3kgZm9yIHNlcnZpY2Ugc2lkZSB0byB1cGdyYWRl
IGl0cyBsb2dpYyB3aGVuDQo+ID4gPiA+ID4gICAgICAgICBkZXNpZ24gY2hhbmdlZCBhbmQgcmVt
YWluIHVzZXIgc2lkZSB1bmNoYW5nZWQuDQo+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ICtjb25maWcg
TFNfUkNQTQ0KPiA+ID4gPiA+ICsgICAgIGJvb2wgIkZyZWVzY2FsZSBSQ1BNIHN1cHBvcnQiDQo+
ID4gPiA+ID4gKyAgICAgZGVwZW5kcyBvbiAoRlNMX1BMQVRfUE0pDQo+ID4gPiA+ID4gKyAgICAg
aGVscA0KPiA+ID4gPiA+ICsgICAgICAgVGhpcyBmZWF0dXJlIGlzIHRvIGVuYWJsZSBzcGVjaWZp
ZWQgd2FrZXVwIHNvdXJjZSBmb3Igc3lzdGVtDQo+IHNsZWVwLg0KPiA+ID4gPiA+IGRpZmYgLS1n
aXQgYS9kcml2ZXJzL3NvYy9mc2wvTWFrZWZpbGUgYi9kcml2ZXJzL3NvYy9mc2wvTWFrZWZpbGUN
Cj4gPiA+ID4gPiBpbmRleCA4ZjlkYjIzLi40M2ZmNzFhIDEwMDY0NA0KPiA+ID4gPiA+IC0tLSBh
L2RyaXZlcnMvc29jL2ZzbC9NYWtlZmlsZQ0KPiA+ID4gPiA+ICsrKyBiL2RyaXZlcnMvc29jL2Zz
bC9NYWtlZmlsZQ0KPiA+ID4gPiA+IEBAIC03LDMgKzcsNCBAQCBvYmotJChDT05GSUdfUVVJQ0Nf
RU5HSU5FKSAgICAgICAgICAgICs9IHFlLw0KPiA+ID4gPiA+ICBvYmotJChDT05GSUdfQ1BNKSAg
ICAgICAgICAgICAgICAgICAgKz0gcWUvDQo+ID4gPiA+ID4gIG9iai0kKENPTkZJR19GU0xfR1VU
UykgICAgICAgICAgICAgICAgICAgICAgICs9IGd1dHMubw0KPiA+ID4gPiA+ICBvYmotJChDT05G
SUdfRlNMX1BMQVRfUE0pICAgICs9IHBsYXRfcG0ubw0KPiA+ID4gPiA+ICtvYmotJChDT05GSUdf
TFNfUkNQTSkgICAgICAgICAgICAgICAgKz0gbHMtcmNwbS5vDQo+ID4gPg0KPiA+ID4gUHJvYmFi
bHkgdXNlICJfIiBpbnN0ZWFkIG9mICItIiBmb3IgYWxpZ25tZW50Lg0KPiA+DQo+ID4gT0ssIHdp
bGwgdXBkYXRlIGluIG5leHQgdmVyc2lvbg0KPiA+DQo+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL2Ry
aXZlcnMvc29jL2ZzbC9scy1yY3BtLmMNCj4gPiA+ID4gPiBiL2RyaXZlcnMvc29jL2ZzbC9scy1y
Y3BtLmMgbmV3IGZpbGUgbW9kZSAxMDA2NDQgaW5kZXgNCj4gPiA+ID4gPiAwMDAwMDAwLi5iMGZl
Yjg4DQo+ID4gPiA+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ID4gPiA+ICsrKyBiL2RyaXZlcnMvc29j
L2ZzbC9scy1yY3BtLmMNCj4gPiA+ID4gPiBAQCAtMCwwICsxLDE1MyBAQA0KPiA+ID4gPiA+ICsv
LyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAvLyAvLyBwbGF0X3BtLmMgLSBGcmVl
c2NhbGUNCj4gPiA+ID4gPiArTGF5ZXJzY2FwZSBSQ1BNIGRyaXZlcg0KPiA+ID4NCj4gPiA+IFRo
ZSBmaWxlIG5hbWUgaGVyZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHJlYWwgZmlsZSBuYW1lLg0K
PiA+DQo+ID4gR290IGl0LCB3aWxsIGNvcnJlY3QgaXQuDQo+ID4NCj4gPiA+ID4gPiArLy8NCj4g
PiA+ID4gPiArLy8gQ29weXJpZ2h0IDIwMTggTlhQDQo+ID4gPiA+ID4gKy8vDQo+ID4gPiA+ID4g
Ky8vIEF1dGhvcjogUmFuIFdhbmcgPHJhbi53YW5nXzFAbnhwLmNvbT4sDQo+ID4gPg0KPiA+ID4g
V2hlcmUgZG8geW91IG5lZWQgdGhlIGNvbW1hIGluIHRoZSBlbmQ/DQo+ID4NCj4gPiBNeSBiYWQs
IHdpbGwgcmVtb3ZlIGNvbW1hIGluIG5leHQgdmVyc2lvbi4NCj4gPg0KPiA+ID4gPiA+ICsNCj4g
PiA+ID4gPiArI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4NCj4gPiA+ID4gPiArI2luY2x1ZGUgPGxp
bnV4L21vZHVsZS5oPg0KPiA+ID4gPiA+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNl
Lmg+ICNpbmNsdWRlDQo+ID4gPiA+ID4gKzxsaW51eC9vZl9hZGRyZXNzLmg+ICNpbmNsdWRlIDxs
aW51eC9zbGFiLmg+ICNpbmNsdWRlDQo+ID4gPiA+ID4gKzxzb2MvZnNsL3BsYXRfcG0uaD4NCj4g
PiA+ID4gPiArDQo+ID4gPiA+ID4gKyNkZWZpbmUgTUFYX0NPTVBBVElCTEVfTlVNICAgMTANCj4g
PiA+ID4gPiArDQo+ID4gPiA+ID4gK3N0cnVjdCByY3BtX3Qgew0KPiA+ID4gPiA+ICsgICAgIHN0
cnVjdCBkZXZpY2UgKmRldjsNCj4gPiA+ID4gPiArICAgICB2b2lkIF9faW9tZW0gKmlwcGRleHBj
cl9hZGRyOw0KPiA+ID4gPiA+ICsgICAgIGJvb2wgYmlnX2VuZGlhbjsgICAgICAgIC8qIEJpZy9M
aXR0bGUgZW5kaWFuIG9mIFJDUE0gbW9kdWxlICovDQo+ID4gPiA+ID4gK307DQo+ID4gPiA+ID4g
Kw0KPiA+ID4gPiA+ICsvLyByY3BtX2hhbmRsZSAtIENvbmZpZ3VyZSBSQ1BNIHJlZyBhY2NvcmRp
bmcgdG8gd2FrZSB1cCBzb3VyY2UNCj4gPiA+ID4gPiArcmVxdWVzdCAvLyBAdXNlcl9kZXY6IHBv
aW50ZXIgdG8gdXNlcidzIGRldmljZSBzdHJ1Y3QgLy8gQGZsYWc6DQo+ID4gPiA+ID4gK3RvDQo+
ID4gPiA+ID4gK2VuYWJsZSh0cnVlKSBvciBkaXNhYmxlKGZhbHNlKSB3YWtldXAgc291cmNlIC8v
IEBoYW5kbGVfcHJpdjoNCj4gPiA+ID4gPiArcG9pbnRlciB0byBzdHJ1Y3QgcmNwbV90IGluc3Rh
bmNlIC8vIC8vIFJldHVybiAwIG9uIHN1Y2Nlc3MNCj4gPiA+ID4gPiArb3RoZXIgbmVnYXRpdmUg
ZXJybm8NCj4gPiA+DQo+ID4gPiBBbHRob3VnaCBMaW51cyBwcmVmZXJyZWQgdGhpcyAvLyBjb21t
ZW50IHN0eWxlLiAgSSdtIG5vdCBzdXJlIGlmDQo+ID4gPiB0aGlzIHdpbGwgYmUgaGFuZGxlZCBj
b3JyZWN0bHkgYnkgdGhlIGtlcm5lbC1kb2MgY29tcGlsZXIuDQo+ID4gPg0KPiBodHRwczovL2Vt
ZWEwMS5zYWZlbGlua3MucHJvdGVjdGlvbi5vdXRsb29rLmNvbS8/dXJsPWh0dHBzJTNBJTJGJTJG
dw0KPiA+ID4gdw0KPiA+ID4gdy5rZXJuZWwub3JnJTJGZG9jJTJGaHRtbCUyRnY0LjE4JTJGZG9j
LWd1aWRlJTJGa2VybmVsLQ0KPiA+ID4NCj4gZG9jLmh0bWwmYW1wO2RhdGE9MDIlN0MwMSU3Q3Jh
bi53YW5nXzElNDBueHAuY29tJTdDYzBkODhlNjY5MDM4DQo+ID4gPg0KPiA0ZTAyYjk1MTA4ZDYx
MmRlYzIzNSU3QzY4NmVhMWQzYmMyYjRjNmZhOTJjZDk5YzVjMzAxNjM1JTdDMCU3QzANCj4gPiA+
ICU3QzYzNjcxNzE0NTI4NTEyNjIwMCZhbXA7c2RhdGE9SDdHa1VOT0xWRyUyRkNjWkVTemh0SEJl
SEMNCj4gYk85DQo+ID4gPiAlMkZLNGs5RWRIMzBDeHEyJTJCTSUzRCZhbXA7cmVzZXJ2ZWQ9MA0K
PiA+DQo+ID4gU28sIGRvIHlvdSB0aGluayBJIG5lZWQgdG8gY2hhbmdlIGFsbCBjb21tZW50IHN0
eWxlIGJhY2sgdG8gJy8qIC4uLiAqLycgPw0KPiA+IEFjdHVhbGx5IEkgZmVlbCBhIGxpdHRsZSBi
aXQgY29uZnVzZWQgaGVyZS4NCj4gDQo+IEkgdGhpbmsgTGludXMncyBjb21tZW50IGFib3V0IC8v
IGNvbW1lbnQgc3R5bGUgYXBwbGllcyB0byBub3JtYWwgY29kZQ0KPiBjb21tZW50LiAgQnV0IGtl
cm5lbC1kb2MgY29tbWVudCBpcyBhIHNwZWNpYWwga2luZCBvZiBjb2RlIGNvbW1lbnQgdGhhdA0K
PiBuZWVkcyB0byBtZWV0IGNlcnRhaW4gcmVxdWlyZW1lbnRzLiAgUGVvcGxlIGNhbiB1c2UgdGhl
IHNjcmlwdHMva2VybmVsLWRvYw0KPiB0b29sIHRvIGdlbmVyYXRlIHJlYWRhYmxlIEFQSSBkb2N1
bWVudHMgZnJvbSB0aGUgc291cmNlIGNvZGUuICBJdCBsb29rcyBsaWtlDQo+IHlvdSB3YW50ZWQg
dG8gbWFrZSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRpb24gYWxpZ25lZCB3aXRoIHRoZSBrZXJuZWwt
ZG9jDQo+IGZvcm1hdCwgYnV0IGtlcm5lbC1kb2Mgc3BlY2lmaWNhbGx5IHJlcXVpcmVzIHRvIHVz
ZSB0aGUgLyogKi8gc3R5bGUoYXQgbGVhc3QgZm9yDQo+IG5vdykuDQoNCk9LLCB3aWxsIGNoYW5n
ZSBzdHlsZSBiYWNrIHRvIC8qICovLg0KDQpSZWdhcmRzLA0KUmFuDQoNCj4gUmVnYXJkcywNCj4g
TGVvDQo=
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-10 3:31 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-10 3:31 UTC (permalink / raw)
To: Leo Li
Cc: Mark Rutland, dongsheng.wang,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS, lkml,
Rob Herring, linuxppc-dev,
moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE
Hi Leo,
On 2018/9/7 4:51, Yang Li wrote:
>
> On Fri, Sep 7, 2018 at 4:51 AM Ran Wang <ran.wang_1@nxp.com> wrote:
> >
> > Hi Leo,
> >
> > On September 05, 2018 at 11:22 Yang Li wrote:
> > > -----Original Message-----
> > > From: Li Yang <leoyang.li@nxp.com>
> > > Sent: Wednesday, September 05, 2018 11:22
> > > To: dongsheng.wang@hxt-semitech.com
> > > Cc: Ran Wang <ran.wang_1@nxp.com>; Rob Herring
> <robh+dt@kernel.org>;
> > > Mark Rutland <mark.rutland@arm.com>; open list:OPEN FIRMWARE AND
> > > FLATTENED DEVICE TREE BINDINGS <devicetree@vger.kernel.org>;
> > > linuxppc- dev <linuxppc-dev@lists.ozlabs.org>; lkml
> > > <linux-kernel@vger.kernel.org>; moderated list:ARM/FREESCALE IMX /
> > > MXC ARM ARCHITECTURE <linux-arm- kernel@lists.infradead.org>
> > > Subject: Re: [PATCH 3/3] soc: fsl: add RCPM driver
> > >
> > > On Tue, Sep 4, 2018 at 9:58 PM Wang, Dongsheng
> <dongsheng.wang@hxt-
> > > 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%2F133&data=02%7C01%7Cran.w
> ang_
> > >
> 1%40nxp.com%7Cc0d88e6690384e02b95108d612dec235%7C686ea1d3bc2b4c
> > >
> 6fa92cd99c5c301635%7C0%7C0%7C636717145285126200&sdata=JIoCZp
> > >
> WhRyW76EqgSflfTDA1f0gMQGKa%2FcbvSc5CO%2Fw%3D&reserved=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 <chenhui.zhao@nxp.com>
> > > > > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > > > > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > > > > ---
> > > > > 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
> > > > > 0000000..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 <ran.wang_1@nxp.com>,
> > >
> > > Where do you need the comma in the end?
> >
> > My bad, will remove comma in next version.
> >
> > > > > +
> > > > > +#include <linux/init.h>
> > > > > +#include <linux/module.h>
> > > > > +#include <linux/platform_device.h> #include
> > > > > +<linux/of_address.h> #include <linux/slab.h> #include
> > > > > +<soc/fsl/plat_pm.h>
> > > > > +
> > > > > +#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://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fw
> > > w
> > > w.kernel.org%2Fdoc%2Fhtml%2Fv4.18%2Fdoc-guide%2Fkernel-
> > >
> doc.html&data=02%7C01%7Cran.wang_1%40nxp.com%7Cc0d88e669038
> > >
> 4e02b95108d612dec235%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0
> > > %7C636717145285126200&sdata=H7GkUNOLVG%2FCcZESzhtHBeHC
> bO9
> > > %2FK4k9EdH30Cxq2%2BM%3D&reserved=0
> >
> > So, do you think I need to change all comment style back to '/* ... */' ?
> > Actually I feel a little bit confused here.
>
> I think Linus's comment about // comment style applies to normal code
> comment. But kernel-doc comment is a special kind of code comment that
> needs to meet certain requirements. People can use the scripts/kernel-doc
> tool to generate readable API documents from the source code. It looks like
> you wanted to make the function description aligned with the kernel-doc
> format, but kernel-doc specifically requires to use the /* */ style(at least for
> now).
OK, will change style back to /* */.
Regards,
Ran
> Regards,
> Leo
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
2018-09-05 2:57 ` Wang, Dongsheng
(?)
(?)
@ 2018-09-07 9:32 ` Ran Wang
-1 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-07 9:32 UTC (permalink / raw)
To: Wang, Dongsheng, Leo Li, Rob Herring, Mark Rutland
Cc: devicetree, linuxppc-dev, linux-kernel, linux-arm-kernel
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 <chenhui.zhao@nxp.com>
> > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > ---
> > 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 0000000..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 <ran.wang_1@nxp.com>,
> > +
> > +#include <linux/init.h>
> > +#include <linux/module.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/of_address.h>
> > +#include <linux/slab.h>
> > +#include <soc/fsl/plat_pm.h>
> > +
> > +#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], &set_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],
> &set_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
> if (x) {
> ....
> ....
> } else {
>
> }
Got it!
> > + iowrite32(ippdexpcr, ippdexpcr_addr);
> > +
> > + return 0;
> > + }
> > + }
> > + }
> > +
> > + return -ENODEV;
> > +}
> > +
> > +static int ls_rcpm_probe(struct platform_device *pdev) {
> > + struct resource *r;
> > + struct rcpm_t *rcpm;
> > +
> > + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > + if (!r)
> > + return -ENODEV;
> > +
> > + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
> kzalloc is better.
OK
> > + if (!rcpm)
> > + return -ENOMEM;
> > +
> > + rcpm->big_endian = device_property_read_bool(&pdev->dev,
> > +"big-endian");
> > +
> > + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> > + if (IS_ERR(rcpm->ippdexpcr_addr))
> > + return PTR_ERR(rcpm->ippdexpcr_addr);
> > +
> > + rcpm->dev = &pdev->dev;
> > + platform_set_drvdata(pdev, rcpm);
> > +
> > + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm); }
> > +
> > +static int ls_rcpm_remove(struct platform_device *pdev) {
> > + struct rcpm_t *rcpm;
> Not need a table.
OK, thanks for your careful review.
Regards,
Ran
> Cheers,
> -Dongsheng
>
> > +
> > + rcpm = platform_get_drvdata(pdev);
> > + deregister_fsl_platform_wakeup_source(rcpm);
> > + kfree(rcpm);
> > +
> > + return 0;
> > +}
> > +
> > +static const struct of_device_id ls_rcpm_of_match[] = {
> > + { .compatible = "fsl,qoriq-rcpm-2.1", },
> > + {}
> > +};
> > +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> > +
> > +static struct platform_driver ls_rcpm_driver = {
> > + .driver = {
> > + .name = "ls-rcpm",
> > + .of_match_table = ls_rcpm_of_match,
> > + },
> > + .probe = ls_rcpm_probe,
> > + .remove = ls_rcpm_remove,
> > +};
> > +
> > +static int __init ls_rcpm_init(void)
> > +{
> > + return platform_driver_register(&ls_rcpm_driver);
> > +}
> > +subsys_initcall(ls_rcpm_init);
> > +
> > +static void __exit ls_rcpm_exit(void) {
> > + platform_driver_unregister(&ls_rcpm_driver);
> > +}
> > +module_exit(ls_rcpm_exit);
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-07 9:32 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-07 9:32 UTC (permalink / raw)
To: linux-arm-kernel
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 <chenhui.zhao@nxp.com>
> > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > ---
> > 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 0000000..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 <ran.wang_1@nxp.com>,
> > +
> > +#include <linux/init.h>
> > +#include <linux/module.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/of_address.h>
> > +#include <linux/slab.h>
> > +#include <soc/fsl/plat_pm.h>
> > +
> > +#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], &set_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],
> &set_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
> if (x) {
> ....
> ....
> } else {
>
> }
Got it!
> > + iowrite32(ippdexpcr, ippdexpcr_addr);
> > +
> > + return 0;
> > + }
> > + }
> > + }
> > +
> > + return -ENODEV;
> > +}
> > +
> > +static int ls_rcpm_probe(struct platform_device *pdev) {
> > + struct resource *r;
> > + struct rcpm_t *rcpm;
> > +
> > + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > + if (!r)
> > + return -ENODEV;
> > +
> > + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
> kzalloc is better.
OK
> > + if (!rcpm)
> > + return -ENOMEM;
> > +
> > + rcpm->big_endian = device_property_read_bool(&pdev->dev,
> > +"big-endian");
> > +
> > + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> > + if (IS_ERR(rcpm->ippdexpcr_addr))
> > + return PTR_ERR(rcpm->ippdexpcr_addr);
> > +
> > + rcpm->dev = &pdev->dev;
> > + platform_set_drvdata(pdev, rcpm);
> > +
> > + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm); }
> > +
> > +static int ls_rcpm_remove(struct platform_device *pdev) {
> > + struct rcpm_t *rcpm;
> Not need a table.
OK, thanks for your careful review.
Regards,
Ran
> Cheers,
> -Dongsheng
>
> > +
> > + rcpm = platform_get_drvdata(pdev);
> > + deregister_fsl_platform_wakeup_source(rcpm);
> > + kfree(rcpm);
> > +
> > + return 0;
> > +}
> > +
> > +static const struct of_device_id ls_rcpm_of_match[] = {
> > + { .compatible = "fsl,qoriq-rcpm-2.1", },
> > + {}
> > +};
> > +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> > +
> > +static struct platform_driver ls_rcpm_driver = {
> > + .driver = {
> > + .name = "ls-rcpm",
> > + .of_match_table = ls_rcpm_of_match,
> > + },
> > + .probe = ls_rcpm_probe,
> > + .remove = ls_rcpm_remove,
> > +};
> > +
> > +static int __init ls_rcpm_init(void)
> > +{
> > + return platform_driver_register(&ls_rcpm_driver);
> > +}
> > +subsys_initcall(ls_rcpm_init);
> > +
> > +static void __exit ls_rcpm_exit(void) {
> > + platform_driver_unregister(&ls_rcpm_driver);
> > +}
> > +module_exit(ls_rcpm_exit);
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-07 9:32 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-07 9:32 UTC (permalink / raw)
To: Wang, Dongsheng, Leo Li, Rob Herring, Mark Rutland
Cc: devicetree, linuxppc-dev, linux-kernel, linux-arm-kernel
SGkgRG9uZ3NoZW5nLA0KDQpPbiAyMDE4LzkvNSAxMDo1OCwgRG9uZ3NoZW5nIFdhbmcgd3JvdGU6
DQo+IA0KPiBQbGVhc2UgY2hhbmdlIHlvdXIgY29tbWVudHMgc3R5bGUuDQo+IA0KPiBPbiAyMDE4
LzgvMzEgMTE6NTYsIFJhbiBXYW5nIHdyb3RlOg0KPiA+IFRoZSBOWFAncyBRb3JJUSBQcm9jZXNz
b3JzIGJhc2VkIG9uIEFSTSBDb3JlIGhhdmUgUkNQTSBtb2R1bGUgKFJ1bg0KPiA+IENvbnRyb2wg
YW5kIFBvd2VyIE1hbmFnZW1lbnQpLCB3aGljaCBwZXJmb3JtcyBhbGwgZGV2aWNlLWxldmVsIHRh
c2tzDQo+ID4gYXNzb2NpYXRlZCB3aXRoIHBvd2VyIG1hbmFnZW1lbnQgc3VjaCBhcyB3YWtldXAg
c291cmNlIGNvbnRyb2wuDQo+ID4NCj4gPiBUaGlzIGRyaXZlciBkZXBlbmRzIG9uIEZTTCBwbGF0
Zm9ybSBQTSBkcml2ZXIgZnJhbWV3b3JrIHdoaWNoIGhlbHAgdG8NCj4gPiBpc29sYXRlIHVzZXIg
YW5kIFBNIHNlcnZpY2UgcHJvdmlkZXIgKHN1Y2ggYXMgUkNQTSBkcml2ZXIpLg0KPiA+DQo+ID4g
U2lnbmVkLW9mZi1ieTogQ2hlbmh1aSBaaGFvIDxjaGVuaHVpLnpoYW9AbnhwLmNvbT4NCj4gPiBT
aWduZWQtb2ZmLWJ5OiBZaW5nIFpoYW5nIDx5aW5nLnpoYW5nMjI0NTVAbnhwLmNvbT4NCj4gPiBT
aWduZWQtb2ZmLWJ5OiBSYW4gV2FuZyA8cmFuLndhbmdfMUBueHAuY29tPg0KPiA+IC0tLQ0KPiA+
ICBkcml2ZXJzL3NvYy9mc2wvS2NvbmZpZyAgIHwgICAgNiArKw0KPiA+ICBkcml2ZXJzL3NvYy9m
c2wvTWFrZWZpbGUgIHwgICAgMSArDQo+ID4gIGRyaXZlcnMvc29jL2ZzbC9scy1yY3BtLmMgfCAg
MTUzDQo+ID4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrDQo+
ID4gIDMgZmlsZXMgY2hhbmdlZCwgMTYwIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pICBj
cmVhdGUgbW9kZQ0KPiA+IDEwMDY0NCBkcml2ZXJzL3NvYy9mc2wvbHMtcmNwbS5jDQo+ID4NCj4g
PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvZnNsL0tjb25maWcgYi9kcml2ZXJzL3NvYy9mc2wv
S2NvbmZpZyBpbmRleA0KPiA+IDY1MTc0MTIuLjg4MjMzMGQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJp
dmVycy9zb2MvZnNsL0tjb25maWcNCj4gPiArKysgYi9kcml2ZXJzL3NvYy9mc2wvS2NvbmZpZw0K
PiA+IEBAIC0zMCwzICszMCw5IEBAIGNvbmZpZyBGU0xfUExBVF9QTQ0KPiA+ICAJICBoYXZlIHRv
IGtub3cgdGhlIGltcGxlbWVudCBkZXRhaWxzIG9mIHdha2V1cCBmdW5jdGlvbiBpdCByZXF1aXJl
Lg0KPiA+ICAJICBCZXNpZGVzLCBpdCBpcyBhbHNvIGVhc3kgZm9yIHNlcnZpY2Ugc2lkZSB0byB1
cGdyYWRlIGl0cyBsb2dpYyB3aGVuDQo+ID4gIAkgIGRlc2lnbiBjaGFuZ2VkIGFuZCByZW1haW4g
dXNlciBzaWRlIHVuY2hhbmdlZC4NCj4gPiArDQo+ID4gK2NvbmZpZyBMU19SQ1BNDQo+ID4gKwli
b29sICJGcmVlc2NhbGUgUkNQTSBzdXBwb3J0Ig0KPiA+ICsJZGVwZW5kcyBvbiAoRlNMX1BMQVRf
UE0pDQo+ID4gKwloZWxwDQo+ID4gKwkgIFRoaXMgZmVhdHVyZSBpcyB0byBlbmFibGUgc3BlY2lm
aWVkIHdha2V1cCBzb3VyY2UgZm9yIHN5c3RlbSBzbGVlcC4NCj4gPiBkaWZmIC0tZ2l0IGEvZHJp
dmVycy9zb2MvZnNsL01ha2VmaWxlIGIvZHJpdmVycy9zb2MvZnNsL01ha2VmaWxlIGluZGV4DQo+
ID4gOGY5ZGIyMy4uNDNmZjcxYSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL3NvYy9mc2wvTWFr
ZWZpbGUNCj4gPiArKysgYi9kcml2ZXJzL3NvYy9mc2wvTWFrZWZpbGUNCj4gPiBAQCAtNywzICs3
LDQgQEAgb2JqLSQoQ09ORklHX1FVSUNDX0VOR0lORSkJCSs9IHFlLw0KPiA+ICBvYmotJChDT05G
SUdfQ1BNKQkJCSs9IHFlLw0KPiA+ICBvYmotJChDT05GSUdfRlNMX0dVVFMpCQkJKz0gZ3V0cy5v
DQo+ID4gIG9iai0kKENPTkZJR19GU0xfUExBVF9QTSkJKz0gcGxhdF9wbS5vDQo+ID4gK29iai0k
KENPTkZJR19MU19SQ1BNKQkJKz0gbHMtcmNwbS5vDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv
c29jL2ZzbC9scy1yY3BtLmMgYi9kcml2ZXJzL3NvYy9mc2wvbHMtcmNwbS5jIG5ldw0KPiA+IGZp
bGUgbW9kZSAxMDA2NDQgaW5kZXggMDAwMDAwMC4uYjBmZWI4OA0KPiA+IC0tLSAvZGV2L251bGwN
Cj4gPiArKysgYi9kcml2ZXJzL3NvYy9mc2wvbHMtcmNwbS5jDQo+ID4gQEAgLTAsMCArMSwxNTMg
QEANCj4gPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjANCj4gPiArLy8NCj4g
PiArLy8gcGxhdF9wbS5jIC0gRnJlZXNjYWxlIExheWVyc2NhcGUgUkNQTSBkcml2ZXIgLy8gLy8g
Q29weXJpZ2h0IDIwMTgNCj4gPiArTlhQIC8vIC8vIEF1dGhvcjogUmFuIFdhbmcgPHJhbi53YW5n
XzFAbnhwLmNvbT4sDQo+ID4gKw0KPiA+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPg0KPiA+ICsj
aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9k
ZXZpY2UuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4NCj4gPiArI2luY2x1
ZGUgPGxpbnV4L3NsYWIuaD4NCj4gPiArI2luY2x1ZGUgPHNvYy9mc2wvcGxhdF9wbS5oPg0KPiA+
ICsNCj4gPiArI2RlZmluZSBNQVhfQ09NUEFUSUJMRV9OVU0JMTANCj4gPiArDQo+ID4gK3N0cnVj
dCByY3BtX3Qgew0KPiA+ICsJc3RydWN0IGRldmljZSAqZGV2Ow0KPiA+ICsJdm9pZCBfX2lvbWVt
ICppcHBkZXhwY3JfYWRkcjsNCj4gPiArCWJvb2wgYmlnX2VuZGlhbjsJLyogQmlnL0xpdHRsZSBl
bmRpYW4gb2YgUkNQTSBtb2R1bGUgKi8NCj4gPiArfTsNCj4gPiArDQo+ID4gKy8vIHJjcG1faGFu
ZGxlIC0gQ29uZmlndXJlIFJDUE0gcmVnIGFjY29yZGluZyB0byB3YWtlIHVwIHNvdXJjZQ0KPiA+
ICtyZXF1ZXN0IC8vIEB1c2VyX2RldjogcG9pbnRlciB0byB1c2VyJ3MgZGV2aWNlIHN0cnVjdCAv
LyBAZmxhZzogdG8NCj4gPiArZW5hYmxlKHRydWUpIG9yIGRpc2FibGUoZmFsc2UpIHdha2V1cCBz
b3VyY2UgLy8gQGhhbmRsZV9wcml2OiBwb2ludGVyDQo+ID4gK3RvIHN0cnVjdCByY3BtX3QgaW5z
dGFuY2UgLy8gLy8gUmV0dXJuIDAgb24gc3VjY2VzcyBvdGhlciBuZWdhdGl2ZQ0KPiA+ICtlcnJu
byBzdGF0aWMgaW50IHJjcG1faGFuZGxlKHN0cnVjdCBkZXZpY2UgKnVzZXJfZGV2LCBib29sIGZs
YWcsIHZvaWQNCj4gPiArKmhhbmRsZV9wcml2KSB7DQo+ID4gKwlzdHJ1Y3QgcmNwbV90ICpyY3Bt
Ow0KPiA+ICsJYm9vbCBiaWdfZW5kaWFuOw0KPiA+ICsJY29uc3QgY2hhciAgKmRldl9jb21wYXRp
YmxlX2FycmF5W01BWF9DT01QQVRJQkxFX05VTV07DQo+ID4gKwl2b2lkIF9faW9tZW0gKmlwcGRl
eHBjcl9hZGRyOw0KPiA+ICsJdTMyIGlwcGRleHBjcjsNCj4gPiArCXUzMiBzZXRfYml0Ow0KPiA+
ICsJaW50IHJldCwgbnVtLCBpOw0KPiA+ICsNCj4gPiArCXJjcG0gPSBoYW5kbGVfcHJpdjsNCj4g
PiArCWJpZ19lbmRpYW4gPSByY3BtLT5iaWdfZW5kaWFuOw0KPiA+ICsJaXBwZGV4cGNyX2FkZHIg
PSByY3BtLT5pcHBkZXhwY3JfYWRkcjsNCj4gPiArDQo+ID4gKwludW0gPSBkZXZpY2VfcHJvcGVy
dHlfcmVhZF9zdHJpbmdfYXJyYXkodXNlcl9kZXYsICJjb21wYXRpYmxlIiwNCj4gPiArCQkJZGV2
X2NvbXBhdGlibGVfYXJyYXksIE1BWF9DT01QQVRJQkxFX05VTSk7DQo+ID4gKwlpZiAobnVtIDwg
MCkNCj4gPiArCQlyZXR1cm4gbnVtOw0KPiA+ICsNCj4gPiArCWZvciAoaSA9IDA7IGkgPCBudW07
IGkrKykgew0KPiA+ICsJCWlmICghZGV2aWNlX3Byb3BlcnR5X3ByZXNlbnQocmNwbS0+ZGV2LA0K
PiA+ICsJCQkJCWRldl9jb21wYXRpYmxlX2FycmF5W2ldKSkNCj4gPiArCQkJY29udGludWU7DQo+
ID4gKwkJZWxzZSB7DQo+IFJlbW92ZSB0aGlzIGVsc2UuDQoNCkdvdCBpdCEgV2lsbCB1cGRhdGUg
aW4gbmV4dCB2ZXJzaW9uLg0KDQo+ID4gKwkJCXJldCA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3Uz
MihyY3BtLT5kZXYsDQo+ID4gKwkJCQkJZGV2X2NvbXBhdGlibGVfYXJyYXlbaV0sICZzZXRfYml0
KTsNCj4gPiArCQkJaWYgKHJldCkNCj4gPiArCQkJCXJldHVybiByZXQ7DQo+ID4gKw0KPiA+ICsJ
CQlpZiAoIWRldmljZV9wcm9wZXJ0eV9wcmVzZW50KHJjcG0tPmRldiwNCj4gPiArCQkJCQkJZGV2
X2NvbXBhdGlibGVfYXJyYXlbaV0pKQ0KPiBUaGlzIGhhcyBiZWVuIGNoZWNrZWQuIENvbnRpbnVl
ID8gb3IgcmV0dXJuIEVOT0RFVqO/DQoNClllcywgdGhpcyBjaGVja2luZyBpcyBub3QgbmVjZXNz
YXJ5LCB3aWxsIHJlbW92ZSBpbiBuZXh0IHZlcnNpb24NCg0KPiA+ICsJCQkJcmV0dXJuIC1FTk9E
RVY7DQo+ID4gKwkJCWVsc2Ugew0KPiBSZW1vdmUgdGhpcyBlbHNlLg0KDQpPSw0KDQo+ID4gKwkJ
CQlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIocmNwbS0+ZGV2LA0KPiA+ICsJCQkJCQlk
ZXZfY29tcGF0aWJsZV9hcnJheVtpXSwNCj4gJnNldF9iaXQpOw0KPiA+ICsJCQkJaWYgKHJldCkN
Cj4gPiArCQkJCQlyZXR1cm4gcmV0Ow0KPiA+ICsNCj4gPiArCQkJCWlmIChiaWdfZW5kaWFuKQ0K
PiA+ICsJCQkJCWlwcGRleHBjciA9DQo+IGlvcmVhZDMyYmUoaXBwZGV4cGNyX2FkZHIpOw0KPiA+
ICsJCQkJZWxzZQ0KPiA+ICsJCQkJCWlwcGRleHBjciA9DQo+IGlvcmVhZDMyKGlwcGRleHBjcl9h
ZGRyKTsNCj4gPiArDQo+ID4gKwkJCQlpZiAoZmxhZykNCj4gPiArCQkJCQlpcHBkZXhwY3IgfD0g
c2V0X2JpdDsNCj4gPiArCQkJCWVsc2UNCj4gPiArCQkJCQlpcHBkZXhwY3IgJj0gfnNldF9iaXQ7
DQo+ID4gKw0KPiA+ICsJCQkJaWYgKGJpZ19lbmRpYW4pIHsNCj4gPiArCQkJCQlpb3dyaXRlMzJi
ZShpcHBkZXhwY3IsDQo+IGlwcGRleHBjcl9hZGRyKTsNCj4gPiArCQkJCQlpcHBkZXhwY3IgPQ0K
PiBpb3JlYWQzMmJlKGlwcGRleHBjcl9hZGRyKTsNCj4gPiArCQkJCX0gZWxzZQ0KPiBpZiAoeCkg
ew0KPiAuLi4uDQo+IC4uLi4NCj4gfSAgZWxzZSB7DQo+IA0KPiB9DQoNCkdvdCBpdCENCg0KPiA+
ICsJCQkJCWlvd3JpdGUzMihpcHBkZXhwY3IsIGlwcGRleHBjcl9hZGRyKTsNCj4gPiArDQo+ID4g
KwkJCQlyZXR1cm4gMDsNCj4gPiArCQkJfQ0KPiA+ICsJCX0NCj4gPiArCX0NCj4gPiArDQo+ID4g
KwlyZXR1cm4gLUVOT0RFVjsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBsc19yY3Bt
X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpIHsNCj4gPiArCXN0cnVjdCByZXNv
dXJjZSAqcjsNCj4gPiArCXN0cnVjdCByY3BtX3QgKnJjcG07DQo+ID4gKw0KPiA+ICsJciA9IHBs
YXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7DQo+ID4gKwlpZiAo
IXIpDQo+ID4gKwkJcmV0dXJuIC1FTk9ERVY7DQo+ID4gKw0KPiA+ICsJcmNwbSA9IGttYWxsb2Mo
c2l6ZW9mKCpyY3BtKSwgR0ZQX0tFUk5FTCk7DQo+IGt6YWxsb2MgaXMgYmV0dGVyLg0KDQpPSw0K
DQo+ID4gKwlpZiAoIXJjcG0pDQo+ID4gKwkJcmV0dXJuIC1FTk9NRU07DQo+ID4gKw0KPiA+ICsJ
cmNwbS0+YmlnX2VuZGlhbiA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woJnBkZXYtPmRldiwN
Cj4gPiArImJpZy1lbmRpYW4iKTsNCj4gPiArDQo+ID4gKwlyY3BtLT5pcHBkZXhwY3JfYWRkciA9
IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByKTsNCj4gPiArCWlmIChJU19FUlIo
cmNwbS0+aXBwZGV4cGNyX2FkZHIpKQ0KPiA+ICsJCXJldHVybiBQVFJfRVJSKHJjcG0tPmlwcGRl
eHBjcl9hZGRyKTsNCj4gPiArDQo+ID4gKwlyY3BtLT5kZXYgPSAmcGRldi0+ZGV2Ow0KPiA+ICsJ
cGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcmNwbSk7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIHJl
Z2lzdGVyX2ZzbF9wbGF0Zm9ybV93YWtldXBfc291cmNlKHJjcG1faGFuZGxlLCByY3BtKTsgfQ0K
PiA+ICsNCj4gPiArc3RhdGljIGludCBsc19yY3BtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2
aWNlICpwZGV2KSB7DQo+ID4gKwlzdHJ1Y3QgcmNwbV90CSpyY3BtOw0KPiBOb3QgbmVlZCBhIHRh
YmxlLg0KDQpPSywgdGhhbmtzIGZvciB5b3VyIGNhcmVmdWwgcmV2aWV3Lg0KDQpSZWdhcmRzLA0K
UmFuDQogDQoNCj4gQ2hlZXJzLA0KPiAtRG9uZ3NoZW5nDQo+IA0KPiA+ICsNCj4gPiArCXJjcG0g
PSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsNCj4gPiArCWRlcmVnaXN0ZXJfZnNsX3BsYXRm
b3JtX3dha2V1cF9zb3VyY2UocmNwbSk7DQo+ID4gKwlrZnJlZShyY3BtKTsNCj4gPiArDQo+ID4g
KwlyZXR1cm4gMDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9k
ZXZpY2VfaWQgbHNfcmNwbV9vZl9tYXRjaFtdID0gew0KPiA+ICsJeyAuY29tcGF0aWJsZSA9ICJm
c2wscW9yaXEtcmNwbS0yLjEiLCB9LA0KPiA+ICsJe30NCj4gPiArfTsNCj4gPiArTU9EVUxFX0RF
VklDRV9UQUJMRShvZiwgbHNfcmNwbV9vZl9tYXRjaCk7DQo+ID4gKw0KPiA+ICtzdGF0aWMgc3Ry
dWN0IHBsYXRmb3JtX2RyaXZlciBsc19yY3BtX2RyaXZlciA9IHsNCj4gPiArCS5kcml2ZXIgPSB7
DQo+ID4gKwkJLm5hbWUgPSAibHMtcmNwbSIsDQo+ID4gKwkJLm9mX21hdGNoX3RhYmxlID0gbHNf
cmNwbV9vZl9tYXRjaCwNCj4gPiArCX0sDQo+ID4gKwkucHJvYmUgPSBsc19yY3BtX3Byb2JlLA0K
PiA+ICsJLnJlbW92ZSA9IGxzX3JjcG1fcmVtb3ZlLA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3Rh
dGljIGludCBfX2luaXQgbHNfcmNwbV9pbml0KHZvaWQpDQo+ID4gK3sNCj4gPiArCXJldHVybiBw
bGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmxzX3JjcG1fZHJpdmVyKTsNCj4gPiArfQ0KPiA+ICtz
dWJzeXNfaW5pdGNhbGwobHNfcmNwbV9pbml0KTsNCj4gPiArDQo+ID4gK3N0YXRpYyB2b2lkIF9f
ZXhpdCBsc19yY3BtX2V4aXQodm9pZCkgew0KPiA+ICsJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0
ZXIoJmxzX3JjcG1fZHJpdmVyKTsNCj4gPiArfQ0KPiA+ICttb2R1bGVfZXhpdChsc19yY3BtX2V4
aXQpOw0KPiANCg0K
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-07 9:32 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-07 9:32 UTC (permalink / raw)
To: Wang, Dongsheng, Leo Li, Rob Herring, Mark Rutland
Cc: devicetree, linuxppc-dev, linux-kernel, linux-arm-kernel
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 <chenhui.zhao@nxp.com>
> > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > ---
> > 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 0000000..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 <ran.wang_1@nxp.com>,
> > +
> > +#include <linux/init.h>
> > +#include <linux/module.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/of_address.h>
> > +#include <linux/slab.h>
> > +#include <soc/fsl/plat_pm.h>
> > +
> > +#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], &set_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],
> &set_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
> if (x) {
> ....
> ....
> } else {
>
> }
Got it!
> > + iowrite32(ippdexpcr, ippdexpcr_addr);
> > +
> > + return 0;
> > + }
> > + }
> > + }
> > +
> > + return -ENODEV;
> > +}
> > +
> > +static int ls_rcpm_probe(struct platform_device *pdev) {
> > + struct resource *r;
> > + struct rcpm_t *rcpm;
> > +
> > + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > + if (!r)
> > + return -ENODEV;
> > +
> > + rcpm = kmalloc(sizeof(*rcpm), GFP_KERNEL);
> kzalloc is better.
OK
> > + if (!rcpm)
> > + return -ENOMEM;
> > +
> > + rcpm->big_endian = device_property_read_bool(&pdev->dev,
> > +"big-endian");
> > +
> > + rcpm->ippdexpcr_addr = devm_ioremap_resource(&pdev->dev, r);
> > + if (IS_ERR(rcpm->ippdexpcr_addr))
> > + return PTR_ERR(rcpm->ippdexpcr_addr);
> > +
> > + rcpm->dev = &pdev->dev;
> > + platform_set_drvdata(pdev, rcpm);
> > +
> > + return register_fsl_platform_wakeup_source(rcpm_handle, rcpm); }
> > +
> > +static int ls_rcpm_remove(struct platform_device *pdev) {
> > + struct rcpm_t *rcpm;
> Not need a table.
OK, thanks for your careful review.
Regards,
Ran
> Cheers,
> -Dongsheng
>
> > +
> > + rcpm = platform_get_drvdata(pdev);
> > + deregister_fsl_platform_wakeup_source(rcpm);
> > + kfree(rcpm);
> > +
> > + return 0;
> > +}
> > +
> > +static const struct of_device_id ls_rcpm_of_match[] = {
> > + { .compatible = "fsl,qoriq-rcpm-2.1", },
> > + {}
> > +};
> > +MODULE_DEVICE_TABLE(of, ls_rcpm_of_match);
> > +
> > +static struct platform_driver ls_rcpm_driver = {
> > + .driver = {
> > + .name = "ls-rcpm",
> > + .of_match_table = ls_rcpm_of_match,
> > + },
> > + .probe = ls_rcpm_probe,
> > + .remove = ls_rcpm_remove,
> > +};
> > +
> > +static int __init ls_rcpm_init(void)
> > +{
> > + return platform_driver_register(&ls_rcpm_driver);
> > +}
> > +subsys_initcall(ls_rcpm_init);
> > +
> > +static void __exit ls_rcpm_exit(void) {
> > + platform_driver_unregister(&ls_rcpm_driver);
> > +}
> > +module_exit(ls_rcpm_exit);
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 3/3] soc: fsl: add RCPM driver
2018-08-31 3:52 ` Ran Wang
@ 2018-09-07 20:25 ` Scott Wood
-1 siblings, 0 replies; 50+ messages in thread
From: Scott Wood @ 2018-09-07 20:25 UTC (permalink / raw)
To: Ran Wang, Leo Li, Rob Herring, Mark Rutland
Cc: devicetree, linuxppc-dev, linux-kernel, linux-arm-kernel
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 <chenhui.zhao@nxp.com>
> Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> ---
> 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
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-07 20:25 ` Scott Wood
0 siblings, 0 replies; 50+ messages in thread
From: Scott Wood @ 2018-09-07 20:25 UTC (permalink / raw)
To: linux-arm-kernel
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 <chenhui.zhao@nxp.com>
> Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> ---
> 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
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
2018-09-07 20:25 ` Scott Wood
(?)
(?)
@ 2018-09-10 9:09 ` Ran Wang
-1 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-10 9:09 UTC (permalink / raw)
To: Scott Wood, Leo Li, Rob Herring, Mark Rutland
Cc: devicetree, linuxppc-dev, linux-kernel, linux-arm-kernel, linux-pm
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 <chenhui.zhao@nxp.com>
> > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > ---
> > 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
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-10 9:09 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-10 9:09 UTC (permalink / raw)
To: linux-arm-kernel
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 <chenhui.zhao@nxp.com>
> > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > ---
> > 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
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-10 9:09 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-10 9:09 UTC (permalink / raw)
To: Scott Wood, Leo Li, Rob Herring, Mark Rutland
Cc: devicetree, linuxppc-dev, linux-kernel, linux-arm-kernel, linux-pm
SGkgU2NvdHQsDQoNCk9uIDIwMTgvOS84IDE4OjE2LCBTY290dCBXb29kIHdyb3RlOg0KPiANCj4g
T24gRnJpLCAyMDE4LTA4LTMxIGF0IDExOjUyICswODAwLCBSYW4gV2FuZyB3cm90ZToNCj4gPiBU
aGUgTlhQJ3MgUW9ySVEgUHJvY2Vzc29ycyBiYXNlZCBvbiBBUk0gQ29yZSBoYXZlIFJDUE0gbW9k
dWxlIChSdW4NCj4gPiBDb250cm9sIGFuZCBQb3dlciBNYW5hZ2VtZW50KSwgd2hpY2ggcGVyZm9y
bXMgYWxsIGRldmljZS1sZXZlbCB0YXNrcw0KPiA+IGFzc29jaWF0ZWQgd2l0aCBwb3dlciBtYW5h
Z2VtZW50IHN1Y2ggYXMgd2FrZXVwIHNvdXJjZSBjb250cm9sLg0KPiA+DQo+ID4gVGhpcyBkcml2
ZXIgZGVwZW5kcyBvbiBGU0wgcGxhdGZvcm0gUE0gZHJpdmVyIGZyYW1ld29yayB3aGljaCBoZWxw
IHRvDQo+ID4gaXNvbGF0ZSB1c2VyIGFuZCBQTSBzZXJ2aWNlIHByb3ZpZGVyIChzdWNoIGFzIFJD
UE0gZHJpdmVyKS4NCj4gPg0KPiA+IFNpZ25lZC1vZmYtYnk6IENoZW5odWkgWmhhbyA8Y2hlbmh1
aS56aGFvQG54cC5jb20+DQo+ID4gU2lnbmVkLW9mZi1ieTogWWluZyBaaGFuZyA8eWluZy56aGFu
ZzIyNDU1QG54cC5jb20+DQo+ID4gU2lnbmVkLW9mZi1ieTogUmFuIFdhbmcgPHJhbi53YW5nXzFA
bnhwLmNvbT4NCj4gPiAtLS0NCj4gPiAgZHJpdmVycy9zb2MvZnNsL0tjb25maWcgICB8ICAgIDYg
KysNCj4gPiAgZHJpdmVycy9zb2MvZnNsL01ha2VmaWxlICB8ICAgIDEgKw0KPiA+ICBkcml2ZXJz
L3NvYy9mc2wvbHMtcmNwbS5jIHwgIDE1Mw0KPiA+ICsrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKw0KPiA+ICAzIGZpbGVzIGNoYW5nZWQsIDE2MCBpbnNlcnRpb25z
KCspLCAwIGRlbGV0aW9ucygtKSAgY3JlYXRlIG1vZGUNCj4gPiAxMDA2NDQgZHJpdmVycy9zb2Mv
ZnNsL2xzLXJjcG0uYw0KPiANCj4gSXMgdGhlcmUgYSByZWFzb24gd2h5IHRoaXMgaXMgTFMtc3Bl
Y2lmaWMsIG9yIGNvdWxkIGl0IGJlIHVzZWQgd2l0aCBQUEMgUkNQTQ0KPiBibG9ja3M/DQoNClRo
ZXkgaGF2ZSBkaWZmZXJlbnQgU1cgYXJjaCBkZXNpZ24gb24gbG93IHBvd2VyIG9wZXJhdGlvbjog
UFBDIFJDUE0NCmRyaXZlciBoYXMgdGFrZW4gY2FyZSBvZiBtb3N0IHRoaW5ncyBvZiBzdXNwZW5k
IGVudGVyICYgZXhpdC4gQW5kIExTIFJDUE0gZHJpdmVyDQp3aWxsIG9ubHkgaGFuZGxlIHdha2V1
cCBzb3VyY2UgY29uZmlndXJlIGFuZCBsZWZ0IHJlc3Qgd29yayB0byBzeXN0ZW0gZmlybXdhcmUN
CnRvIGRvLiBTbyB5b3UgbWlnaHQgYmUgYXdhcmUgdGhhdCBMUyBSQ1BNIHdpbGwgb25seSBnZXQg
Y2FsbCB3aGVuZXZlciBwbGF0X3BtDQpkcml2ZXIgQVBJIGlzIGNhbGxlZCByYXRoZXIgdGhhbiBz
eXN0ZW0gc3VzcGVuZCBiZWdpbiB3aGVyZS4NCg0KPiANCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVy
cy9zb2MvZnNsL0tjb25maWcgYi9kcml2ZXJzL3NvYy9mc2wvS2NvbmZpZyBpbmRleA0KPiA+IDY1
MTc0MTIuLjg4MjMzMGQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9zb2MvZnNsL0tjb25maWcN
Cj4gPiArKysgYi9kcml2ZXJzL3NvYy9mc2wvS2NvbmZpZw0KPiA+IEBAIC0zMCwzICszMCw5IEBA
IGNvbmZpZyBGU0xfUExBVF9QTQ0KPiA+ICAJICBoYXZlIHRvIGtub3cgdGhlIGltcGxlbWVudCBk
ZXRhaWxzIG9mIHdha2V1cCBmdW5jdGlvbiBpdCByZXF1aXJlLg0KPiA+ICAJICBCZXNpZGVzLCBp
dCBpcyBhbHNvIGVhc3kgZm9yIHNlcnZpY2Ugc2lkZSB0byB1cGdyYWRlIGl0cyBsb2dpYw0KPiA+
IHdoZW4NCj4gPiAgCSAgZGVzaWduIGNoYW5nZWQgYW5kIHJlbWFpbiB1c2VyIHNpZGUgdW5jaGFu
Z2VkLg0KPiA+ICsNCj4gPiArY29uZmlnIExTX1JDUE0NCj4gPiArCWJvb2wgIkZyZWVzY2FsZSBS
Q1BNIHN1cHBvcnQiDQo+ID4gKwlkZXBlbmRzIG9uIChGU0xfUExBVF9QTSkNCj4gDQo+IFdoeSBp
cyB0aGlzIHBhcmVudGhlc2l6ZWQ/DQoNCkJlY2F1c2Ugd2UnZCBsaWtlIHRvIGRlY291cGxlIFJD
UE0gZHJpdmVyIGFuZCBpdHMgdXNlci4NCkJlbmVmaXQgaXMgdGhhdCB3aWxsIGFsbG93IHVzZXIg
ZG9lc24ndCBoYXZlIHRvIGtub3cgd2hvIHdpbGwgc2VydmUgaXQgZm9yIHNvbWUgUE0NCmZlYXR1
cmVzIChzdWNoIGFzIHdha2UgdXAgc291cmNlIGNvbnRyb2wpLCBhbmQgcHJvdmlkZSBzb21lIGtp
bmQgb2YgZmxleGliaWxpdHkgd2hlbg0KZWl0aGVyIFJDTVAgb3IgdXNlciBkcml2ZXIgZXZvbHZl
IGluIHRoZSBmdXR1cmUuIFNvIEkgYWRkIGEgcGxhdF9wbSBkcml2ZXIgdG8gcHJldmVudA0Kd2Fr
ZSB1cCBJUCBrbm93aW5nIGFueSBpbmZvcm1hdGlvbiBvZiBSQ1BNLg0KDQpSZWdhcmRzLA0KUmFu
DQoNCj4gDQo+IC1TY290dA0KDQo=
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH 3/3] soc: fsl: add RCPM driver
@ 2018-09-10 9:09 ` Ran Wang
0 siblings, 0 replies; 50+ messages in thread
From: Ran Wang @ 2018-09-10 9:09 UTC (permalink / raw)
To: Scott Wood, Leo Li, Rob Herring, Mark Rutland
Cc: devicetree, linux-pm, linuxppc-dev, linux-kernel, linux-arm-kernel
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 <chenhui.zhao@nxp.com>
> > Signed-off-by: Ying Zhang <ying.zhang22455@nxp.com>
> > Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> > ---
> > 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
^ permalink raw reply [flat|nested] 50+ messages in thread
end of thread, other threads:[~2019-10-22 9:20 UTC | newest]
Thread overview: 50+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-17 2:47 [PATCH 1/3] PM: wakeup: Add routine to help fetch wakeup source object Ran Wang
2019-05-17 2:47 ` Ran Wang
2019-05-17 2:47 ` Ran Wang
2019-05-17 2:47 ` [PATCH 2/3] Documentation: dt: binding: fsl: Add 'little-endian' and update Chassis define Ran Wang
2019-05-17 2:47 ` Ran Wang
2019-05-17 2:47 ` Ran Wang
2019-06-13 22:07 ` Rob Herring
2019-06-13 22:07 ` Rob Herring
2019-06-13 22:07 ` Rob Herring
2019-06-13 22:07 ` Rob Herring
2019-05-17 2:47 ` [PATCH 3/3] soc: fsl: add RCPM driver Ran Wang
2019-05-17 2:47 ` Ran Wang
2019-05-17 2:47 ` Ran Wang
-- strict thread matches above, loose matches on Subject: below --
2019-10-22 7:51 [PATCH 1/3] PM: wakeup: Add routine to help fetch wakeup source object Ran Wang
2019-10-22 7:51 ` [PATCH 3/3] soc: fsl: add RCPM driver Ran Wang
2019-10-22 7:51 ` Ran Wang
2019-10-22 7:51 ` Ran Wang
2019-10-22 9:18 ` Rafael J. Wysocki
2019-10-22 9:18 ` Rafael J. Wysocki
2019-10-22 9:18 ` Rafael J. Wysocki
2018-08-31 3:52 [PATCH 1/3] soc: fsl: add Platform PM driver QorIQ platforms Ran Wang
2018-08-31 3:52 ` [PATCH 3/3] soc: fsl: add RCPM driver Ran Wang
2018-08-31 3:52 ` Ran Wang
2018-09-05 2:57 ` Wang, Dongsheng
2018-09-05 2:57 ` Wang, Dongsheng
2018-09-05 2:57 ` Wang, Dongsheng
2018-09-05 2:57 ` Wang, Dongsheng
2018-09-05 3:21 ` Li Yang
2018-09-05 3:21 ` Li Yang
2018-09-05 3:21 ` Li Yang
2018-09-05 3:21 ` Li Yang
2018-09-07 9:48 ` Ran Wang
2018-09-07 9:48 ` Ran Wang
2018-09-07 9:48 ` Ran Wang
2018-09-07 9:48 ` Ran Wang
2018-09-07 18:56 ` Li Yang
2018-09-07 18:56 ` Li Yang
2018-09-07 18:56 ` Li Yang
2018-09-10 3:31 ` Ran Wang
2018-09-10 3:31 ` Ran Wang
2018-09-10 3:31 ` Ran Wang
2018-09-10 3:31 ` Ran Wang
2018-09-07 9:32 ` Ran Wang
2018-09-07 9:32 ` Ran Wang
2018-09-07 9:32 ` Ran Wang
2018-09-07 9:32 ` Ran Wang
2018-09-07 20:25 ` Scott Wood
2018-09-07 20:25 ` Scott Wood
2018-09-10 9:09 ` Ran Wang
2018-09-10 9:09 ` Ran Wang
2018-09-10 9:09 ` Ran Wang
2018-09-10 9:09 ` Ran Wang
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.