Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1236490 > unrolled thread
| Started by | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| First post | 2015-09-30 18:20 +0200 |
| Last post | 2015-09-30 18:30 +0200 |
| Articles | 20 on this page of 22 — 5 participants |
Back to article view | Back to linux.kernel
[PATCH 00/16] ARM: at91: PMC driver rework Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
[PATCH 06/16] clk: at91: clk-main: factorize irq handling Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
Re: [PATCH 06/16] clk: at91: clk-main: factorize irq handling Boris Brezillon <boris.brezillon@free-electrons.com> - 2015-10-01 10:40 +0200
[PATCH 03/16] ARM: at91/dt: use syscon for PMC Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
[PATCH 07/16] clk: at91: make IRQ optional and register them later Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
[PATCH 11/16] ARM: at91: pm: simply call at91_pm_init Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
[PATCH 10/16] clk: at91: pmc: move pmc structures to C file Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
[PATCH 14/16] ARM: at91: remove useless includes and function prototypes Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
[PATCH 16/16] clk: at91: pmc: drop at91_pmc_base Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
[PATCH 02/16] clk: at91: system: don't try to free_irq when there is no IRQ Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
[PATCH 12/16] ARM: at91: pm: find and remap the pmc Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
[PATCH 15/16] usb: gadget: atmel: access the PMC using regmap Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
Re: [PATCH 15/16] usb: gadget: atmel: access the PMC using regmap Felipe Balbi <balbi@ti.com> - 2015-09-30 18:40 +0200
Re: [PATCH 15/16] usb: gadget: atmel: access the PMC using regmap Nicolas Ferre <nicolas.ferre@atmel.com> - 2015-09-30 18:40 +0200
Re: [PATCH 15/16] usb: gadget: atmel: access the PMC using regmap Felipe Balbi <balbi@ti.com> - 2015-09-30 18:50 +0200
Re: [PATCH 15/16] usb: gadget: atmel: access the PMC using regmap Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 19:00 +0200
Re: [PATCH 15/16] usb: gadget: atmel: access the PMC using regmap Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 19:10 +0200
[PATCH 01/16] clk: at91: utmi: use pmc_read when the at91_pmc is available Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
[PATCH 13/16] ARM: at91: pm: move idle functions to pm.c Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
[PATCH 08/16] clk: at91: only enable available IRQs Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:20 +0200
Re: [PATCH 08/16] clk: at91: only enable available IRQs Ludovic Desroches <ludovic.desroches@atmel.com> - 2015-10-01 10:30 +0200
Re: [PATCH 00/16] ARM: at91: PMC driver rework Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2015-09-30 18:30 +0200
Page 1 of 2 [1] 2 Next page →
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 00/16] ARM: at91: PMC driver rework |
| Message-ID | <qesgN-1GU-3@gated-at.bofh.it> |
Hi,
This patch set is a cleanup that properly separate drivers needing to access the
PMC (PM and USB) from the clock driver by exposing the PMC as a syscon.
This also allows to implement a fix for preempt-rt. Currently, at91 platform are
crashing when using preempt-rt because the irq handler are transformed in
threaded irq handler but at the time the pmc registers its clocks, it is not
possible to creat threads, leading to a NULL pointer dereference in the kernel.
The new infrastructure uses polling until it is late enough to register threaded
irqs.
:w
Cc: Felipe Balbi <balbi@ti.com>
Cc: linux-usb@vger.kernel.org
Alexandre Belloni (13):
clk: at91: utmi: use pmc_read when the at91_pmc is available
clk: at91: system: don't try to free_irq when there is no IRQ
ARM: at91/dt: use syscon for PMC
clk: at91: clk-main: factorize irq handling
clk: at91: make IRQ optional and register them later
clk: at91: pmc: merge at91_pmc_init in atmel_pmc_probe
clk: at91: pmc: move pmc structures to C file
ARM: at91: pm: simply call at91_pm_init
ARM: at91: pm: find and remap the pmc
ARM: at91: pm: move idle functions to pm.c
ARM: at91: remove useless includes and function prototypes
usb: gadget: atmel: access the PMC using regmap
clk: at91: pmc: drop at91_pmc_base
Boris Brezillon (3):
clk: at91: make use of syscon to share PMC registers in several
drivers
clk: at91: make use of syscon/regmap internally
clk: at91: only enable available IRQs
arch/arm/boot/dts/at91rm9200.dtsi | 2 +-
arch/arm/boot/dts/at91sam9260.dtsi | 2 +-
arch/arm/boot/dts/at91sam9261.dtsi | 2 +-
arch/arm/boot/dts/at91sam9263.dtsi | 2 +-
arch/arm/boot/dts/at91sam9g45.dtsi | 2 +-
arch/arm/boot/dts/at91sam9n12.dtsi | 2 +-
arch/arm/boot/dts/at91sam9rl.dtsi | 2 +-
arch/arm/boot/dts/at91sam9x5.dtsi | 2 +-
arch/arm/boot/dts/sama5d2.dtsi | 2 +-
arch/arm/boot/dts/sama5d3.dtsi | 2 +-
arch/arm/boot/dts/sama5d4.dtsi | 2 +-
arch/arm/mach-at91/Kconfig | 1 +
arch/arm/mach-at91/at91rm9200.c | 2 -
arch/arm/mach-at91/at91sam9.c | 2 -
arch/arm/mach-at91/generic.h | 13 +-
arch/arm/mach-at91/pm.c | 69 +++++-
arch/arm/mach-at91/sama5.c | 2 +-
drivers/clk/at91/clk-h32mx.c | 33 ++-
drivers/clk/at91/clk-main.c | 403 +++++++++++++++++++-------------
drivers/clk/at91/clk-master.c | 134 +++++++----
drivers/clk/at91/clk-peripheral.c | 131 +++++++----
drivers/clk/at91/clk-pll.c | 190 +++++++++------
drivers/clk/at91/clk-plldiv.c | 42 ++--
drivers/clk/at91/clk-programmable.c | 92 ++++----
drivers/clk/at91/clk-slow.c | 27 ++-
drivers/clk/at91/clk-smd.c | 54 +++--
drivers/clk/at91/clk-system.c | 128 ++++++----
drivers/clk/at91/clk-usb.c | 121 +++++-----
drivers/clk/at91/clk-utmi.c | 116 +++++----
drivers/clk/at91/pmc.c | 300 ++++++------------------
drivers/clk/at91/pmc.h | 93 +-------
drivers/usb/gadget/udc/atmel_usba_udc.c | 20 +-
drivers/usb/gadget/udc/atmel_usba_udc.h | 2 +
include/linux/clk/at91_pmc.h | 12 -
34 files changed, 1059 insertions(+), 950 deletions(-)
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 06/16] clk: at91: clk-main: factorize irq handling |
| Message-ID | <qesgN-1GU-7@gated-at.bofh.it> |
| In reply to | #1236490 |
The three different irq handlers are doing the same thing, factorize their
code in a generic irq handler.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
drivers/clk/at91/clk-main.c | 43 ++++++++++++++++---------------------------
1 file changed, 16 insertions(+), 27 deletions(-)
diff --git a/drivers/clk/at91/clk-main.c b/drivers/clk/at91/clk-main.c
index c1f119748bdc..79a380cd1f4e 100644
--- a/drivers/clk/at91/clk-main.c
+++ b/drivers/clk/at91/clk-main.c
@@ -71,12 +71,21 @@ struct clk_sam9x5_main {
#define to_clk_sam9x5_main(hw) container_of(hw, struct clk_sam9x5_main, hw)
-static irqreturn_t clk_main_osc_irq_handler(int irq, void *dev_id)
+/* Generic structure */
+struct clk_main {
+ struct clk_hw hw;
+ struct at91_pmc *pmc;
+ unsigned int irq;
+ wait_queue_head_t wait;
+};
+#define to_clk_main(hw) container_of(hw, struct clk_main, hw)
+
+static irqreturn_t clk_main_irq_handler(int irq, void *dev_id)
{
- struct clk_main_osc *osc = dev_id;
+ struct clk_main *clkmain = dev_id;
- wake_up(&osc->wait);
- disable_irq_nosync(osc->irq);
+ wake_up(&clkmain->wait);
+ disable_irq_nosync(clkmain->irq);
return IRQ_HANDLED;
}
@@ -185,7 +194,7 @@ at91_clk_register_main_osc(struct regmap *regmap,
init_waitqueue_head(&osc->wait);
irq_set_status_flags(osc->irq, IRQ_NOAUTOEN);
- ret = request_irq(osc->irq, clk_main_osc_irq_handler,
+ ret = request_irq(osc->irq, clk_main_irq_handler,
IRQF_TRIGGER_HIGH, name, osc);
if (ret) {
kfree(osc);
@@ -237,16 +246,6 @@ static void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np)
CLK_OF_DECLARE(at91rm9200_clk_main_osc, "atmel,at91rm9200-clk-main-osc",
of_at91rm9200_clk_main_osc_setup);
-static irqreturn_t clk_main_rc_osc_irq_handler(int irq, void *dev_id)
-{
- struct clk_main_rc_osc *osc = dev_id;
-
- wake_up(&osc->wait);
- disable_irq_nosync(osc->irq);
-
- return IRQ_HANDLED;
-}
-
static bool clk_main_rc_osc_ready(struct regmap *regmap)
{
unsigned int status;
@@ -361,7 +360,7 @@ at91_clk_register_main_rc_osc(struct regmap *regmap,
init_waitqueue_head(&osc->wait);
irq_set_status_flags(osc->irq, IRQ_NOAUTOEN);
- ret = request_irq(osc->irq, clk_main_rc_osc_irq_handler,
+ ret = request_irq(osc->irq, clk_main_irq_handler,
IRQF_TRIGGER_HIGH, name, osc);
if (ret)
return ERR_PTR(ret);
@@ -529,16 +528,6 @@ static void __init of_at91rm9200_clk_main_setup(struct device_node *np)
CLK_OF_DECLARE(at91rm9200_clk_main, "atmel,at91rm9200-clk-main",
of_at91rm9200_clk_main_setup);
-static irqreturn_t clk_sam9x5_main_irq_handler(int irq, void *dev_id)
-{
- struct clk_sam9x5_main *clkmain = dev_id;
-
- wake_up(&clkmain->wait);
- disable_irq_nosync(clkmain->irq);
-
- return IRQ_HANDLED;
-}
-
static inline bool clk_sam9x5_main_ready(struct regmap *regmap)
{
unsigned int status;
@@ -657,7 +646,7 @@ at91_clk_register_sam9x5_main(struct regmap *regmap,
clkmain->parent = status & AT91_PMC_MOSCEN ? 1 : 0;
init_waitqueue_head(&clkmain->wait);
irq_set_status_flags(clkmain->irq, IRQ_NOAUTOEN);
- ret = request_irq(clkmain->irq, clk_sam9x5_main_irq_handler,
+ ret = request_irq(clkmain->irq, clk_main_irq_handler,
IRQF_TRIGGER_HIGH, name, clkmain);
if (ret)
return ERR_PTR(ret);
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Boris Brezillon <boris.brezillon@free-electrons.com> |
|---|---|
| Date | 2015-10-01 10:40 +0200 |
| Subject | Re: [PATCH 06/16] clk: at91: clk-main: factorize irq handling |
| Message-ID | <qeHzc-76i-25@gated-at.bofh.it> |
| In reply to | #1236491 |
Hi Alexandre,
On Wed, 30 Sep 2015 18:10:59 +0200
Alexandre Belloni <alexandre.belloni@free-electrons.com> wrote:
> The three different irq handlers are doing the same thing, factorize their
> code in a generic irq handler.
>
> Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
> ---
> drivers/clk/at91/clk-main.c | 43 ++++++++++++++++---------------------------
> 1 file changed, 16 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/clk/at91/clk-main.c b/drivers/clk/at91/clk-main.c
> index c1f119748bdc..79a380cd1f4e 100644
> --- a/drivers/clk/at91/clk-main.c
> +++ b/drivers/clk/at91/clk-main.c
> @@ -71,12 +71,21 @@ struct clk_sam9x5_main {
>
> #define to_clk_sam9x5_main(hw) container_of(hw, struct clk_sam9x5_main, hw)
>
> -static irqreturn_t clk_main_osc_irq_handler(int irq, void *dev_id)
> +/* Generic structure */
> +struct clk_main {
> + struct clk_hw hw;
> + struct at91_pmc *pmc;
> + unsigned int irq;
> + wait_queue_head_t wait;
> +};
> +#define to_clk_main(hw) container_of(hw, struct clk_main, hw)
It wasn't clear to me at first glance that this structure was actually
a base struct for the clk_main_rc_osc and clk_sam9x5_main struct.
Maybe you should rename it into struct clk_main_base and then replace
the hw, pmc, irq and fields in the child structures by a base field.
Something like:
struct clk_sam9x5_main {
struct clk_main_base base;
u8 parent;
};
struct clk_main_rc_osc {
struct clk_main_base base;
unsigned long frequency;
unsigned long accuracy;
};
Also, it would avoid any problem if someone decides to change the field
oder in one of those structures.
Best Regards,
Boris
--
Boris Brezillon, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 03/16] ARM: at91/dt: use syscon for PMC |
| Message-ID | <qesgN-1GU-9@gated-at.bofh.it> |
| In reply to | #1236490 |
The PMC is not only used to drive the clocks but also has some registers
related to other functions. One of those is for example the USB gadget
bias.
Using a syscon allows to properly separate those functions.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
arch/arm/boot/dts/at91rm9200.dtsi | 2 +-
arch/arm/boot/dts/at91sam9260.dtsi | 2 +-
arch/arm/boot/dts/at91sam9261.dtsi | 2 +-
arch/arm/boot/dts/at91sam9263.dtsi | 2 +-
arch/arm/boot/dts/at91sam9g45.dtsi | 2 +-
arch/arm/boot/dts/at91sam9n12.dtsi | 2 +-
arch/arm/boot/dts/at91sam9rl.dtsi | 2 +-
arch/arm/boot/dts/at91sam9x5.dtsi | 2 +-
arch/arm/boot/dts/sama5d2.dtsi | 2 +-
arch/arm/boot/dts/sama5d3.dtsi | 2 +-
arch/arm/boot/dts/sama5d4.dtsi | 2 +-
11 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/arch/arm/boot/dts/at91rm9200.dtsi b/arch/arm/boot/dts/at91rm9200.dtsi
index 60edd8baebb8..39eb1e3fc6b8 100644
--- a/arch/arm/boot/dts/at91rm9200.dtsi
+++ b/arch/arm/boot/dts/at91rm9200.dtsi
@@ -97,7 +97,7 @@
};
pmc: pmc@fffffc00 {
- compatible = "atmel,at91rm9200-pmc";
+ compatible = "atmel,at91rm9200-pmc", "syscon";
reg = <0xfffffc00 0x100>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller;
diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi
index be9c027ddd97..d4884dd1c243 100644
--- a/arch/arm/boot/dts/at91sam9260.dtsi
+++ b/arch/arm/boot/dts/at91sam9260.dtsi
@@ -100,7 +100,7 @@
};
pmc: pmc@fffffc00 {
- compatible = "atmel,at91sam9260-pmc";
+ compatible = "atmel,at91sam9260-pmc", "syscon";
reg = <0xfffffc00 0x100>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller;
diff --git a/arch/arm/boot/dts/at91sam9261.dtsi b/arch/arm/boot/dts/at91sam9261.dtsi
index ce1e3e94a40c..5e09de4eb9cd 100644
--- a/arch/arm/boot/dts/at91sam9261.dtsi
+++ b/arch/arm/boot/dts/at91sam9261.dtsi
@@ -568,7 +568,7 @@
};
pmc: pmc@fffffc00 {
- compatible = "atmel,at91rm9200-pmc";
+ compatible = "atmel,at91rm9200-pmc", "syscon";
reg = <0xfffffc00 0x100>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller;
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi
index f1f5fa3a9e6e..93446420af25 100644
--- a/arch/arm/boot/dts/at91sam9263.dtsi
+++ b/arch/arm/boot/dts/at91sam9263.dtsi
@@ -93,7 +93,7 @@
};
pmc: pmc@fffffc00 {
- compatible = "atmel,at91rm9200-pmc";
+ compatible = "atmel,at91rm9200-pmc", "syscon";
reg = <0xfffffc00 0x100>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller;
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi
index 18b8b9e29704..af8b708ac312 100644
--- a/arch/arm/boot/dts/at91sam9g45.dtsi
+++ b/arch/arm/boot/dts/at91sam9g45.dtsi
@@ -114,7 +114,7 @@
};
pmc: pmc@fffffc00 {
- compatible = "atmel,at91sam9g45-pmc";
+ compatible = "atmel,at91sam9g45-pmc", "syscon";
reg = <0xfffffc00 0x100>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller;
diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi
index 32bc9a189db0..95569a87b6c9 100644
--- a/arch/arm/boot/dts/at91sam9n12.dtsi
+++ b/arch/arm/boot/dts/at91sam9n12.dtsi
@@ -97,7 +97,7 @@
};
pmc: pmc@fffffc00 {
- compatible = "atmel,at91sam9n12-pmc";
+ compatible = "atmel,at91sam9n12-pmc", "syscon";
reg = <0xfffffc00 0x200>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller;
diff --git a/arch/arm/boot/dts/at91sam9rl.dtsi b/arch/arm/boot/dts/at91sam9rl.dtsi
index a0b90aedd3b8..6d829db4e887 100644
--- a/arch/arm/boot/dts/at91sam9rl.dtsi
+++ b/arch/arm/boot/dts/at91sam9rl.dtsi
@@ -814,7 +814,7 @@
};
pmc: pmc@fffffc00 {
- compatible = "atmel,at91sam9g45-pmc";
+ compatible = "atmel,at91sam9g45-pmc", "syscon";
reg = <0xfffffc00 0x100>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller;
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi
index 747d8f070a5c..0a0ea6bce1b9 100644
--- a/arch/arm/boot/dts/at91sam9x5.dtsi
+++ b/arch/arm/boot/dts/at91sam9x5.dtsi
@@ -105,7 +105,7 @@
};
pmc: pmc@fffffc00 {
- compatible = "atmel,at91sam9x5-pmc";
+ compatible = "atmel,at91sam9x5-pmc", "syscon";
reg = <0xfffffc00 0x100>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller;
diff --git a/arch/arm/boot/dts/sama5d2.dtsi b/arch/arm/boot/dts/sama5d2.dtsi
index 034cd48ae28b..780c8afc7600 100644
--- a/arch/arm/boot/dts/sama5d2.dtsi
+++ b/arch/arm/boot/dts/sama5d2.dtsi
@@ -286,7 +286,7 @@
};
pmc: pmc@f0014000 {
- compatible = "atmel,sama5d2-pmc";
+ compatible = "atmel,sama5d2-pmc", "syscon";
reg = <0xf0014000 0x160>;
interrupts = <74 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller;
diff --git a/arch/arm/boot/dts/sama5d3.dtsi b/arch/arm/boot/dts/sama5d3.dtsi
index 7fa276515f11..fa054b28c2c3 100644
--- a/arch/arm/boot/dts/sama5d3.dtsi
+++ b/arch/arm/boot/dts/sama5d3.dtsi
@@ -906,7 +906,7 @@
};
pmc: pmc@fffffc00 {
- compatible = "atmel,sama5d3-pmc";
+ compatible = "atmel,sama5d3-pmc", "syscon";
reg = <0xfffffc00 0x120>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller;
diff --git a/arch/arm/boot/dts/sama5d4.dtsi b/arch/arm/boot/dts/sama5d4.dtsi
index 8d1de29e8da1..3ab2c83ecc8b 100644
--- a/arch/arm/boot/dts/sama5d4.dtsi
+++ b/arch/arm/boot/dts/sama5d4.dtsi
@@ -386,7 +386,7 @@
};
pmc: pmc@f0018000 {
- compatible = "atmel,sama5d3-pmc";
+ compatible = "atmel,sama5d3-pmc", "syscon";
reg = <0xf0018000 0x120>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller;
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 07/16] clk: at91: make IRQ optional and register them later |
| Message-ID | <qesgO-1GU-13@gated-at.bofh.it> |
| In reply to | #1236490 |
The AT91 clock drivers make use of IRQs to avoid polling when waiting for
some clocks to be enabled. Unfortunately, this leads to a crash when those
IRQs are threaded (which happens when using preempt-rt) because they are
registered before thread creation is possible.
Use polling on those clocks until the IRQ is registered and register the
IRQ at module probe time.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
drivers/clk/at91/clk-main.c | 152 ++++++++++++++++++++++--------------------
drivers/clk/at91/clk-master.c | 74 ++++++++++++++------
drivers/clk/at91/clk-pll.c | 75 +++++++++++++++------
drivers/clk/at91/clk-system.c | 79 +++++++++++++++-------
drivers/clk/at91/clk-utmi.c | 75 ++++++++++++++-------
drivers/clk/at91/pmc.c | 98 ++++++++++++---------------
6 files changed, 336 insertions(+), 217 deletions(-)
diff --git a/drivers/clk/at91/clk-main.c b/drivers/clk/at91/clk-main.c
index 79a380cd1f4e..ab8824d78a68 100644
--- a/drivers/clk/at91/clk-main.c
+++ b/drivers/clk/at91/clk-main.c
@@ -8,6 +8,7 @@
*
*/
+#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/clkdev.h>
#include <linux/clk/at91_pmc.h>
@@ -22,6 +23,8 @@
#include <linux/regmap.h>
#include <linux/sched.h>
#include <linux/wait.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
#include "pmc.h"
@@ -117,9 +120,13 @@ static int clk_main_osc_prepare(struct clk_hw *hw)
}
while (!clk_main_osc_ready(regmap)) {
- enable_irq(osc->irq);
- wait_event(osc->wait,
- clk_main_osc_ready(regmap));
+ if (osc->irq) {
+ enable_irq(osc->irq);
+ wait_event(osc->wait,
+ clk_main_osc_ready(regmap));
+ } else {
+ cpu_relax();
+ }
}
return 0;
@@ -165,17 +172,15 @@ static const struct clk_ops main_osc_ops = {
static struct clk * __init
at91_clk_register_main_osc(struct regmap *regmap,
- unsigned int irq,
const char *name,
const char *parent_name,
bool bypass)
{
- int ret;
struct clk_main_osc *osc;
struct clk *clk = NULL;
struct clk_init_data init;
- if (!irq || !name || !parent_name)
+ if (!name || !parent_name)
return ERR_PTR(-EINVAL);
osc = kzalloc(sizeof(*osc), GFP_KERNEL);
@@ -190,16 +195,6 @@ at91_clk_register_main_osc(struct regmap *regmap,
osc->hw.init = &init;
osc->regmap = regmap;
- osc->irq = irq;
-
- init_waitqueue_head(&osc->wait);
- irq_set_status_flags(osc->irq, IRQ_NOAUTOEN);
- ret = request_irq(osc->irq, clk_main_irq_handler,
- IRQF_TRIGGER_HIGH, name, osc);
- if (ret) {
- kfree(osc);
- return ERR_PTR(ret);
- }
if (bypass)
regmap_update_bits(regmap,
@@ -208,10 +203,8 @@ at91_clk_register_main_osc(struct regmap *regmap,
AT91_PMC_OSCBYPASS | AT91_PMC_KEY);
clk = clk_register(NULL, &osc->hw);
- if (IS_ERR(clk)) {
- free_irq(irq, osc);
+ if (IS_ERR(clk))
kfree(osc);
- }
return clk;
}
@@ -219,7 +212,6 @@ at91_clk_register_main_osc(struct regmap *regmap,
static void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np)
{
struct clk *clk;
- unsigned int irq;
const char *name = np->name;
const char *parent_name;
struct regmap *regmap;
@@ -233,11 +225,7 @@ static void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np)
if (IS_ERR(regmap))
return;
- irq = irq_of_parse_and_map(np, 0);
- if (!irq)
- return;
-
- clk = at91_clk_register_main_osc(regmap, irq, name, parent_name, bypass);
+ clk = at91_clk_register_main_osc(regmap, name, parent_name, bypass);
if (IS_ERR(clk))
return;
@@ -269,9 +257,13 @@ static int clk_main_rc_osc_prepare(struct clk_hw *hw)
AT91_PMC_MOSCRCEN | AT91_PMC_KEY);
while (!clk_main_rc_osc_ready(regmap)) {
- enable_irq(osc->irq);
- wait_event(osc->wait,
- clk_main_rc_osc_ready(regmap));
+ if (osc->irq) {
+ enable_irq(osc->irq);
+ wait_event(osc->wait,
+ clk_main_rc_osc_ready(regmap));
+ } else {
+ cpu_relax();
+ }
}
return 0;
@@ -330,11 +322,9 @@ static const struct clk_ops main_rc_osc_ops = {
static struct clk * __init
at91_clk_register_main_rc_osc(struct regmap *regmap,
- unsigned int irq,
const char *name,
u32 frequency, u32 accuracy)
{
- int ret;
struct clk_main_rc_osc *osc;
struct clk *clk = NULL;
struct clk_init_data init;
@@ -354,22 +344,12 @@ at91_clk_register_main_rc_osc(struct regmap *regmap,
osc->hw.init = &init;
osc->regmap = regmap;
- osc->irq = irq;
osc->frequency = frequency;
osc->accuracy = accuracy;
- init_waitqueue_head(&osc->wait);
- irq_set_status_flags(osc->irq, IRQ_NOAUTOEN);
- ret = request_irq(osc->irq, clk_main_irq_handler,
- IRQF_TRIGGER_HIGH, name, osc);
- if (ret)
- return ERR_PTR(ret);
-
clk = clk_register(NULL, &osc->hw);
- if (IS_ERR(clk)) {
- free_irq(irq, osc);
+ if (IS_ERR(clk))
kfree(osc);
- }
return clk;
}
@@ -377,7 +357,6 @@ at91_clk_register_main_rc_osc(struct regmap *regmap,
static void __init of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np)
{
struct clk *clk;
- unsigned int irq;
u32 frequency = 0;
u32 accuracy = 0;
const char *name = np->name;
@@ -387,16 +366,11 @@ static void __init of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np)
of_property_read_u32(np, "clock-frequency", &frequency);
of_property_read_u32(np, "clock-accuracy", &accuracy);
- irq = irq_of_parse_and_map(np, 0);
- if (!irq)
- return;
-
regmap = syscon_node_to_regmap(of_get_parent(np));
if (IS_ERR(regmap))
return;
- clk = at91_clk_register_main_rc_osc(regmap, irq, name, frequency,
- accuracy);
+ clk = at91_clk_register_main_rc_osc(regmap, name, frequency, accuracy);
if (IS_ERR(clk))
return;
@@ -543,9 +517,13 @@ static int clk_sam9x5_main_prepare(struct clk_hw *hw)
struct regmap *regmap = clkmain->regmap;
while (!clk_sam9x5_main_ready(regmap)) {
- enable_irq(clkmain->irq);
- wait_event(clkmain->wait,
- clk_sam9x5_main_ready(regmap));
+ if (clkmain->irq) {
+ enable_irq(clkmain->irq);
+ wait_event(clkmain->wait,
+ clk_sam9x5_main_ready(regmap));
+ } else {
+ cpu_relax();
+ }
}
return clk_main_probe_frequency(regmap);
@@ -584,9 +562,13 @@ static int clk_sam9x5_main_set_parent(struct clk_hw *hw, u8 index)
regmap_write(regmap, AT91_CKGR_MOR, tmp & ~AT91_PMC_MOSCSEL);
while (!clk_sam9x5_main_ready(regmap)) {
- enable_irq(clkmain->irq);
- wait_event(clkmain->wait,
- clk_sam9x5_main_ready(regmap));
+ if (clkmain->irq) {
+ enable_irq(clkmain->irq);
+ wait_event(clkmain->wait,
+ clk_sam9x5_main_ready(regmap));
+ } else {
+ cpu_relax();
+ }
}
return 0;
@@ -612,12 +594,10 @@ static const struct clk_ops sam9x5_main_ops = {
static struct clk * __init
at91_clk_register_sam9x5_main(struct regmap *regmap,
- unsigned int irq,
const char *name,
const char **parent_names,
int num_parents)
{
- int ret;
struct clk_sam9x5_main *clkmain;
struct clk *clk = NULL;
struct clk_init_data init;
@@ -641,21 +621,12 @@ at91_clk_register_sam9x5_main(struct regmap *regmap,
clkmain->hw.init = &init;
clkmain->regmap = regmap;
- clkmain->irq = irq;
regmap_read(clkmain->regmap, AT91_CKGR_MOR, &status);
clkmain->parent = status & AT91_PMC_MOSCEN ? 1 : 0;
- init_waitqueue_head(&clkmain->wait);
- irq_set_status_flags(clkmain->irq, IRQ_NOAUTOEN);
- ret = request_irq(clkmain->irq, clk_main_irq_handler,
- IRQF_TRIGGER_HIGH, name, clkmain);
- if (ret)
- return ERR_PTR(ret);
clk = clk_register(NULL, &clkmain->hw);
- if (IS_ERR(clk)) {
- free_irq(clkmain->irq, clkmain);
+ if (IS_ERR(clk))
kfree(clkmain);
- }
return clk;
}
@@ -665,7 +636,6 @@ static void __init of_at91sam9x5_clk_main_setup(struct device_node *np)
struct clk *clk;
const char *parent_names[2];
int num_parents;
- unsigned int irq;
const char *name = np->name;
struct regmap *regmap;
@@ -680,11 +650,7 @@ static void __init of_at91sam9x5_clk_main_setup(struct device_node *np)
of_property_read_string(np, "clock-output-names", &name);
- irq = irq_of_parse_and_map(np, 0);
- if (!irq)
- return;
-
- clk = at91_clk_register_sam9x5_main(regmap, irq, name, parent_names,
+ clk = at91_clk_register_sam9x5_main(regmap, name, parent_names,
num_parents);
if (IS_ERR(clk))
return;
@@ -693,3 +659,45 @@ static void __init of_at91sam9x5_clk_main_setup(struct device_node *np)
}
CLK_OF_DECLARE(at91sam9x5_clk_main, "atmel,at91sam9x5-clk-main",
of_at91sam9x5_clk_main_setup);
+
+static const struct of_device_id atmel_clk_main_dt_ids[] = {
+ { .compatible = "atmel,at91rm9200-clk-main-osc" },
+ { .compatible = "atmel,at91sam9x5-clk-main-rc-osc" },
+ { .compatible = "atmel,at91sam9x5-clk-main" },
+ { /* sentinel */ }
+};
+
+static int __init atmel_clk_main_probe(struct platform_device *pdev)
+{
+ struct of_phandle_args clkspec = { .np = pdev->dev.of_node};
+ struct clk_main *clkmain;
+ struct clk_hw *hw;
+ int ret;
+
+ hw = __clk_get_hw(of_clk_get_from_provider(&clkspec));
+ if (!hw)
+ return -ENODEV;
+
+ clkmain = to_clk_main(hw);
+ clkmain->irq = platform_get_irq(pdev, 0);
+ if (!clkmain->irq)
+ return 0;
+
+ init_waitqueue_head(&clkmain->wait);
+ irq_set_status_flags(clkmain->irq, IRQ_NOAUTOEN);
+ ret = devm_request_irq(&pdev->dev, clkmain->irq, clk_main_irq_handler,
+ IRQF_TRIGGER_HIGH, __clk_get_name(hw->clk),
+ clkmain);
+ if (ret)
+ clkmain->irq = 0;
+
+ return ret;
+}
+
+static struct platform_driver atmel_clk_main = {
+ .driver = {
+ .name = "atmel-clk-main",
+ .of_match_table = atmel_clk_main_dt_ids,
+ },
+};
+module_platform_driver_probe(atmel_clk_main, atmel_clk_main_probe);
diff --git a/drivers/clk/at91/clk-master.c b/drivers/clk/at91/clk-master.c
index 8d94ddfc9c72..700d0cbf5cd4 100644
--- a/drivers/clk/at91/clk-master.c
+++ b/drivers/clk/at91/clk-master.c
@@ -8,12 +8,15 @@
*
*/
+#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/clkdev.h>
#include <linux/clk/at91_pmc.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/wait.h>
#include <linux/sched.h>
@@ -77,9 +80,13 @@ static int clk_master_prepare(struct clk_hw *hw)
struct clk_master *master = to_clk_master(hw);
while (!clk_master_ready(master->regmap)) {
- enable_irq(master->irq);
- wait_event(master->wait,
- clk_master_ready(master->regmap));
+ if (master->irq) {
+ enable_irq(master->irq);
+ wait_event(master->wait,
+ clk_master_ready(master->regmap));
+ } else {
+ cpu_relax();
+ }
}
return 0;
@@ -143,13 +150,12 @@ static const struct clk_ops master_ops = {
};
static struct clk * __init
-at91_clk_register_master(struct regmap *regmap, unsigned int irq,
+at91_clk_register_master(struct regmap *regmap,
const char *name, int num_parents,
const char **parent_names,
const struct clk_master_layout *layout,
const struct clk_master_characteristics *characteristics)
{
- int ret;
struct clk_master *master;
struct clk *clk = NULL;
struct clk_init_data init;
@@ -171,19 +177,9 @@ at91_clk_register_master(struct regmap *regmap, unsigned int irq,
master->layout = layout;
master->characteristics = characteristics;
master->regmap = regmap;
- master->irq = irq;
- init_waitqueue_head(&master->wait);
- irq_set_status_flags(master->irq, IRQ_NOAUTOEN);
- ret = request_irq(master->irq, clk_master_irq_handler,
- IRQF_TRIGGER_HIGH, "clk-master", master);
- if (ret) {
- kfree(master);
- return ERR_PTR(ret);
- }
clk = clk_register(NULL, &master->hw);
if (IS_ERR(clk)) {
- free_irq(master->irq, master);
kfree(master);
}
@@ -233,7 +229,6 @@ of_at91_clk_master_setup(struct device_node *np,
{
struct clk *clk;
int num_parents;
- unsigned int irq;
const char *parent_names[MASTER_SOURCE_MAX];
const char *name = np->name;
struct clk_master_characteristics *characteristics;
@@ -255,11 +250,7 @@ of_at91_clk_master_setup(struct device_node *np,
if (IS_ERR(regmap))
return;
- irq = irq_of_parse_and_map(np, 0);
- if (!irq)
- goto out_free_characteristics;
-
- clk = at91_clk_register_master(regmap, irq, name, num_parents,
+ clk = at91_clk_register_master(regmap, name, num_parents,
parent_names, layout,
characteristics);
if (IS_ERR(clk))
@@ -285,3 +276,44 @@ static void __init of_at91sam9x5_clk_master_setup(struct device_node *np)
}
CLK_OF_DECLARE(at91sam9x5_clk_master, "atmel,at91sam9x5-clk-master",
of_at91sam9x5_clk_master_setup);
+
+static const struct of_device_id atmel_clk_master_dt_ids[] = {
+ { .compatible = "atmel,at91rm9200-clk-master" },
+ { .compatible = "atmel,at91sam9x5-clk-master" },
+ { /* sentinel */ }
+};
+
+static int __init atmel_clk_master_probe(struct platform_device *pdev)
+{
+ struct of_phandle_args clkspec = { .np = pdev->dev.of_node};
+ struct clk_master *master;
+ struct clk_hw *hw;
+ int ret;
+
+ hw = __clk_get_hw(of_clk_get_from_provider(&clkspec));
+ if (!hw)
+ return -ENODEV;
+
+ master = to_clk_master(hw);
+ master->irq = platform_get_irq(pdev, 0);
+ if (!master->irq)
+ return 0;
+
+ init_waitqueue_head(&master->wait);
+ irq_set_status_flags(master->irq, IRQ_NOAUTOEN);
+ ret = devm_request_irq(&pdev->dev, master->irq, clk_master_irq_handler,
+ IRQF_TRIGGER_HIGH, __clk_get_name(hw->clk),
+ master);
+ if (ret)
+ master->irq = 0;
+
+ return ret;
+}
+
+static struct platform_driver atmel_clk_master = {
+ .driver = {
+ .name = "atmel-clk-master",
+ .of_match_table = atmel_clk_master_dt_ids,
+ },
+};
+module_platform_driver_probe(atmel_clk_master, atmel_clk_master_probe);
diff --git a/drivers/clk/at91/clk-pll.c b/drivers/clk/at91/clk-pll.c
index 5f4c6ce628e0..0cf69865c2c8 100644
--- a/drivers/clk/at91/clk-pll.c
+++ b/drivers/clk/at91/clk-pll.c
@@ -8,6 +8,7 @@
*
*/
+#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/clkdev.h>
#include <linux/clk/at91_pmc.h>
@@ -21,6 +22,8 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
#include <linux/regmap.h>
#include "pmc.h"
@@ -128,9 +131,13 @@ static int clk_pll_prepare(struct clk_hw *hw)
((pll->mul & layout->mul_mask) << layout->mul_shift));
while (!clk_pll_ready(regmap, pll->id)) {
- enable_irq(pll->irq);
- wait_event(pll->wait,
- clk_pll_ready(regmap, pll->id));
+ if (pll->irq) {
+ enable_irq(pll->irq);
+ wait_event(pll->wait,
+ clk_pll_ready(regmap, pll->id));
+ } else {
+ cpu_relax();
+ }
}
return 0;
@@ -320,7 +327,7 @@ static const struct clk_ops pll_ops = {
};
static struct clk * __init
-at91_clk_register_pll(struct regmap *regmap, unsigned int irq, const char *name,
+at91_clk_register_pll(struct regmap *regmap, const char *name,
const char *parent_name, u8 id,
const struct clk_pll_layout *layout,
const struct clk_pll_characteristics *characteristics)
@@ -328,7 +335,6 @@ at91_clk_register_pll(struct regmap *regmap, unsigned int irq, const char *name,
struct clk_pll *pll;
struct clk *clk = NULL;
struct clk_init_data init;
- int ret;
int offset = PLL_REG(id);
unsigned int pllr;
@@ -350,22 +356,12 @@ at91_clk_register_pll(struct regmap *regmap, unsigned int irq, const char *name,
pll->layout = layout;
pll->characteristics = characteristics;
pll->regmap = regmap;
- pll->irq = irq;
regmap_read(regmap, offset, &pllr);
pll->div = PLL_DIV(pllr);
pll->mul = PLL_MUL(pllr, layout);
- init_waitqueue_head(&pll->wait);
- irq_set_status_flags(pll->irq, IRQ_NOAUTOEN);
- ret = request_irq(pll->irq, clk_pll_irq_handler, IRQF_TRIGGER_HIGH,
- id ? "clk-pllb" : "clk-plla", pll);
- if (ret) {
- kfree(pll);
- return ERR_PTR(ret);
- }
clk = clk_register(NULL, &pll->hw);
if (IS_ERR(clk)) {
- free_irq(pll->irq, pll);
kfree(pll);
}
@@ -499,7 +495,6 @@ of_at91_clk_pll_setup(struct device_node *np,
const struct clk_pll_layout *layout)
{
u32 id;
- unsigned int irq;
struct clk *clk;
struct regmap *regmap;
const char *parent_name;
@@ -521,11 +516,7 @@ of_at91_clk_pll_setup(struct device_node *np,
if (!characteristics)
return;
- irq = irq_of_parse_and_map(np, 0);
- if (!irq)
- return;
-
- clk = at91_clk_register_pll(regmap, irq, name, parent_name, id, layout,
+ clk = at91_clk_register_pll(regmap, name, parent_name, id, layout,
characteristics);
if (IS_ERR(clk))
goto out_free_characteristics;
@@ -564,3 +555,45 @@ static void __init of_sama5d3_clk_pll_setup(struct device_node *np)
}
CLK_OF_DECLARE(sama5d3_clk_pll, "atmel,sama5d3-clk-pll",
of_sama5d3_clk_pll_setup);
+
+static const struct of_device_id atmel_clk_pll_dt_ids[] = {
+ { .compatible = "atmel,at91rm9200-clk-pll" },
+ { .compatible = "atmel,at91sam9g45-clk-pll" },
+ { .compatible = "atmel,at91sam9g20-clk-pllb" },
+ { .compatible = "atmel,sama5d3-clk-pll" },
+ { /* sentinel */ }
+};
+
+static int __init atmel_clk_pll_probe(struct platform_device *pdev)
+{
+ struct of_phandle_args clkspec = { .np = pdev->dev.of_node};
+ struct clk_pll *pll;
+ struct clk_hw *hw;
+ int ret;
+
+ hw = __clk_get_hw(of_clk_get_from_provider(&clkspec));
+ if (!hw)
+ return -ENODEV;
+
+ pll = to_clk_pll(hw);
+ pll->irq = platform_get_irq(pdev, 0);
+ if (!pll->irq)
+ return 0;
+
+ init_waitqueue_head(&pll->wait);
+ irq_set_status_flags(pll->irq, IRQ_NOAUTOEN);
+ ret = devm_request_irq(&pdev->dev, pll->irq, clk_pll_irq_handler,
+ IRQF_TRIGGER_HIGH, __clk_get_name(hw->clk), pll);
+ if (ret)
+ pll->irq = 0;
+
+ return ret;
+}
+
+static struct platform_driver atmel_clk_pll = {
+ .driver = {
+ .name = "atmel-clk-pll",
+ .of_match_table = atmel_clk_pll_dt_ids,
+ },
+};
+module_platform_driver_probe(atmel_clk_pll, atmel_clk_pll_probe);
diff --git a/drivers/clk/at91/clk-system.c b/drivers/clk/at91/clk-system.c
index 0593adf1bf4b..d5fc7bbcc6b3 100644
--- a/drivers/clk/at91/clk-system.c
+++ b/drivers/clk/at91/clk-system.c
@@ -8,6 +8,7 @@
*
*/
+#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/clkdev.h>
#include <linux/clk/at91_pmc.h>
@@ -20,6 +21,8 @@
#include <linux/wait.h>
#include <linux/sched.h>
#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
#include <linux/regmap.h>
#include "pmc.h"
@@ -41,6 +44,7 @@ static inline int is_pck(int id)
{
return (id >= 8) && (id <= 15);
}
+
static irqreturn_t clk_system_irq_handler(int irq, void *dev_id)
{
struct clk_system *sys = (struct clk_system *)dev_id;
@@ -114,12 +118,11 @@ static const struct clk_ops system_ops = {
static struct clk * __init
at91_clk_register_system(struct regmap *regmap, const char *name,
- const char *parent_name, u8 id, int irq)
+ const char *parent_name, u8 id)
{
struct clk_system *sys;
struct clk *clk = NULL;
struct clk_init_data init;
- int ret;
if (!parent_name || id > SYSTEM_MAX_ID)
return ERR_PTR(-EINVAL);
@@ -137,24 +140,10 @@ at91_clk_register_system(struct regmap *regmap, const char *name,
sys->id = id;
sys->hw.init = &init;
sys->regmap = regmap;
- sys->irq = irq;
- if (irq) {
- init_waitqueue_head(&sys->wait);
- irq_set_status_flags(sys->irq, IRQ_NOAUTOEN);
- ret = request_irq(sys->irq, clk_system_irq_handler,
- IRQF_TRIGGER_HIGH, name, sys);
- if (ret) {
- kfree(sys);
- return ERR_PTR(ret);
- }
- }
clk = clk_register(NULL, &sys->hw);
- if (IS_ERR(clk)) {
- if (irq)
- free_irq(sys->irq, sys);
+ if (IS_ERR(clk))
kfree(sys);
- }
return clk;
}
@@ -162,7 +151,6 @@ at91_clk_register_system(struct regmap *regmap, const char *name,
static void __init of_at91rm9200_clk_sys_setup(struct device_node *np)
{
int num;
- int irq = 0;
u32 id;
struct clk *clk;
const char *name;
@@ -185,13 +173,9 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np)
if (of_property_read_string(np, "clock-output-names", &name))
name = sysclknp->name;
- if (is_pck(id))
- irq = irq_of_parse_and_map(sysclknp, 0);
-
parent_name = of_clk_get_parent_name(sysclknp, 0);
- clk = at91_clk_register_system(regmap, name, parent_name, id,
- irq);
+ clk = at91_clk_register_system(regmap, name, parent_name, id);
if (IS_ERR(clk))
continue;
@@ -200,3 +184,52 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np)
}
CLK_OF_DECLARE(at91rm9200_clk_sys, "atmel,at91rm9200-clk-system",
of_at91rm9200_clk_sys_setup);
+
+static const struct of_device_id atmel_clk_sys_dt_ids[] = {
+ { .compatible = "atmel,at91rm9200-clk-system" },
+ { /* sentinel */ }
+};
+
+static int __init atmel_clk_sys_probe(struct platform_device *pdev)
+{
+ struct device_node *np = pdev->dev.of_node;
+ struct device_node *sysclknp;
+
+ for_each_child_of_node(np, sysclknp) {
+ struct of_phandle_args clkspec = { .np = sysclknp};
+ struct clk_hw *hw;
+ struct clk_system *sys;
+ int err;
+
+ hw = __clk_get_hw(of_clk_get_from_provider(&clkspec));
+ if (!hw)
+ continue;
+
+ sys = to_clk_system(hw);
+ if (!is_pck(sys->id))
+ continue;
+
+ sys->irq = irq_of_parse_and_map(sysclknp, 0);
+ if (!sys->irq)
+ continue;
+
+ init_waitqueue_head(&sys->wait);
+ irq_set_status_flags(sys->irq, IRQ_NOAUTOEN);
+ err = devm_request_irq(&pdev->dev, sys->irq,
+ clk_system_irq_handler,
+ IRQF_TRIGGER_HIGH,
+ __clk_get_name(hw->clk), sys);
+ if (err)
+ sys->irq = 0;
+ }
+
+ return 0;
+}
+
+static struct platform_driver atmel_clk_sys = {
+ .driver = {
+ .name = "atmel-clk-sys",
+ .of_match_table = atmel_clk_sys_dt_ids,
+ },
+};
+module_platform_driver_probe(atmel_clk_sys, atmel_clk_sys_probe);
diff --git a/drivers/clk/at91/clk-utmi.c b/drivers/clk/at91/clk-utmi.c
index 58a310e5768c..1f2fbf3bd13e 100644
--- a/drivers/clk/at91/clk-utmi.c
+++ b/drivers/clk/at91/clk-utmi.c
@@ -8,6 +8,7 @@
*
*/
+#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/clkdev.h>
#include <linux/clk/at91_pmc.h>
@@ -20,6 +21,8 @@
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
#include <linux/regmap.h>
#include "pmc.h"
@@ -63,9 +66,13 @@ static int clk_utmi_prepare(struct clk_hw *hw)
regmap_update_bits(utmi->regmap, AT91_CKGR_UCKR, uckr, uckr);
while (!clk_utmi_ready(utmi->regmap)) {
- enable_irq(utmi->irq);
- wait_event(utmi->wait,
- clk_utmi_ready(utmi->regmap));
+ if (utmi->irq) {
+ enable_irq(utmi->irq);
+ wait_event(utmi->wait,
+ clk_utmi_ready(utmi->regmap));
+ } else {
+ cpu_relax();
+ }
}
return 0;
@@ -100,10 +107,9 @@ static const struct clk_ops utmi_ops = {
};
static struct clk * __init
-at91_clk_register_utmi(struct regmap *regmap, unsigned int irq,
+at91_clk_register_utmi(struct regmap *regmap,
const char *name, const char *parent_name)
{
- int ret;
struct clk_utmi *utmi;
struct clk *clk = NULL;
struct clk_init_data init;
@@ -120,28 +126,16 @@ at91_clk_register_utmi(struct regmap *regmap, unsigned int irq,
utmi->hw.init = &init;
utmi->regmap = regmap;
- utmi->irq = irq;
- init_waitqueue_head(&utmi->wait);
- irq_set_status_flags(utmi->irq, IRQ_NOAUTOEN);
- ret = request_irq(utmi->irq, clk_utmi_irq_handler,
- IRQF_TRIGGER_HIGH, "clk-utmi", utmi);
- if (ret) {
- kfree(utmi);
- return ERR_PTR(ret);
- }
clk = clk_register(NULL, &utmi->hw);
- if (IS_ERR(clk)) {
- free_irq(utmi->irq, utmi);
+ if (IS_ERR(clk))
kfree(utmi);
- }
return clk;
}
static void __init of_at91sam9x5_clk_utmi_setup(struct device_node *np)
{
- unsigned int irq;
struct clk *clk;
const char *parent_name;
const char *name = np->name;
@@ -151,15 +145,11 @@ static void __init of_at91sam9x5_clk_utmi_setup(struct device_node *np)
of_property_read_string(np, "clock-output-names", &name);
- irq = irq_of_parse_and_map(np, 0);
- if (!irq)
- return;
-
regmap = syscon_node_to_regmap(of_get_parent(np));
if (IS_ERR(regmap))
return;
- clk = at91_clk_register_utmi(regmap, irq, name, parent_name);
+ clk = at91_clk_register_utmi(regmap, name, parent_name);
if (IS_ERR(clk))
return;
@@ -168,3 +158,42 @@ static void __init of_at91sam9x5_clk_utmi_setup(struct device_node *np)
}
CLK_OF_DECLARE(at91sam9x5_clk_utmi, "atmel,at91sam9x5-clk-utmi",
of_at91sam9x5_clk_utmi_setup);
+
+static const struct of_device_id atmel_clk_utmi_dt_ids[] = {
+ { .compatible = "atmel,at91sam9x5-clk-utmi" },
+ { /* sentinel */ }
+};
+
+static int __init atmel_clk_utmi_probe(struct platform_device *pdev)
+{
+ struct of_phandle_args clkspec = { .np = pdev->dev.of_node};
+ struct clk_utmi *utmi;
+ struct clk_hw *hw;
+ int ret;
+
+ hw = __clk_get_hw(of_clk_get_from_provider(&clkspec));
+ if (!hw)
+ return -ENODEV;
+
+ utmi = to_clk_utmi(hw);
+ utmi->irq = platform_get_irq(pdev, 0);
+ if (!utmi->irq)
+ return 0;
+
+ init_waitqueue_head(&utmi->wait);
+ irq_set_status_flags(utmi->irq, IRQ_NOAUTOEN);
+ ret = devm_request_irq(&pdev->dev, utmi->irq, clk_utmi_irq_handler,
+ IRQF_TRIGGER_HIGH, __clk_get_name(hw->clk), utmi);
+ if (ret)
+ utmi->irq = 0;
+
+ return ret;
+}
+
+static struct platform_driver atmel_clk_utmi = {
+ .driver = {
+ .name = "atmel-clk-utmi",
+ .of_match_table = atmel_clk_utmi_dt_ids,
+ },
+};
+module_platform_driver_probe(atmel_clk_utmi, atmel_clk_utmi_probe);
diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c
index a1cc7afc5885..6c1f08a73373 100644
--- a/drivers/clk/at91/pmc.c
+++ b/drivers/clk/at91/pmc.c
@@ -20,6 +20,9 @@
#include <linux/irqdomain.h>
#include <linux/of_irq.h>
#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <asm/proc-fns.h>
@@ -240,32 +243,29 @@ static struct at91_pmc *__init at91_pmc_init(struct device_node *np,
pmc->virq = virq;
pmc->caps = caps;
- pmc->irqdomain = irq_domain_add_linear(np, 32, &pmc_irq_ops, pmc);
- if (!pmc->irqdomain)
- goto out_free_pmc;
-
- regmap_write(pmc->regmap, AT91_PMC_IDR, 0xffffffff);
- if (request_irq(pmc->virq, pmc_irq_handler,
- IRQF_SHARED | IRQF_COND_SUSPEND, "pmc", pmc))
- goto out_remove_irqdomain;
-
return pmc;
-
-out_remove_irqdomain:
- irq_domain_remove(pmc->irqdomain);
-out_free_pmc:
- kfree(pmc);
-
- return NULL;
}
-static void __init of_at91_pmc_setup(struct device_node *np,
- const struct at91_pmc_caps *caps)
+static const struct of_device_id atmel_pmc_dt_ids[] = {
+ { .compatible = "atmel,at91rm9200-pmc", .data = &at91rm9200_caps },
+ { .compatible = "atmel,at91sam9260-pmc", .data = &at91sam9260_caps },
+ { .compatible = "atmel,at91sam9g45-pmc", .data = &at91sam9g45_caps },
+ { .compatible = "atmel,at91sam9n12-pmc", .data = &at91sam9n12_caps },
+ { .compatible = "atmel,at91sam9x5-pmc", .data = &at91sam9x5_caps },
+ { .compatible = "atmel,sama5d3-pmc", .data = &sama5d3_caps },
+ { /* sentinel */ },
+};
+
+static int __init atmel_pmc_probe(struct platform_device *pdev)
{
+ const struct of_device_id *of_id;
+ const struct at91_pmc_caps *caps;
+ struct device_node *np = pdev->dev.of_node;
struct at91_pmc *pmc;
void __iomem *regbase = of_iomap(np, 0);
struct regmap *regmap;
int virq;
+ int ret = 0;
regmap = syscon_node_to_regmap(np);
if (IS_ERR(regmap))
@@ -273,51 +273,35 @@ static void __init of_at91_pmc_setup(struct device_node *np,
virq = irq_of_parse_and_map(np, 0);
if (!virq)
- return;
+ return 0;
+
+ of_id = of_match_device(atmel_pmc_dt_ids, &pdev->dev);
+ caps = of_id->data;
pmc = at91_pmc_init(np, regmap, regbase, virq, caps);
if (!pmc)
- return;
-}
+ return 0;
-static void __init of_at91rm9200_pmc_setup(struct device_node *np)
-{
- of_at91_pmc_setup(np, &at91rm9200_caps);
-}
-CLK_OF_DECLARE(at91rm9200_clk_pmc, "atmel,at91rm9200-pmc",
- of_at91rm9200_pmc_setup);
-
-static void __init of_at91sam9260_pmc_setup(struct device_node *np)
-{
- of_at91_pmc_setup(np, &at91sam9260_caps);
-}
-CLK_OF_DECLARE(at91sam9260_clk_pmc, "atmel,at91sam9260-pmc",
- of_at91sam9260_pmc_setup);
+ pmc->irqdomain = irq_domain_add_linear(pdev->dev.of_node, 32,
+ &pmc_irq_ops, pmc);
+ if (!pmc->irqdomain)
+ return 0;
-static void __init of_at91sam9g45_pmc_setup(struct device_node *np)
-{
- of_at91_pmc_setup(np, &at91sam9g45_caps);
-}
-CLK_OF_DECLARE(at91sam9g45_clk_pmc, "atmel,at91sam9g45-pmc",
- of_at91sam9g45_pmc_setup);
+ regmap_write(pmc->regmap, AT91_PMC_IDR, 0xffffffff);
+ ret = request_irq(pmc->virq, pmc_irq_handler,
+ IRQF_SHARED | IRQF_COND_SUSPEND, "pmc", pmc);
+ if (ret)
+ return ret;
-static void __init of_at91sam9n12_pmc_setup(struct device_node *np)
-{
- of_at91_pmc_setup(np, &at91sam9n12_caps);
-}
-CLK_OF_DECLARE(at91sam9n12_clk_pmc, "atmel,at91sam9n12-pmc",
- of_at91sam9n12_pmc_setup);
+ of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
-static void __init of_at91sam9x5_pmc_setup(struct device_node *np)
-{
- of_at91_pmc_setup(np, &at91sam9x5_caps);
+ return 0;
}
-CLK_OF_DECLARE(at91sam9x5_clk_pmc, "atmel,at91sam9x5-pmc",
- of_at91sam9x5_pmc_setup);
-static void __init of_sama5d3_pmc_setup(struct device_node *np)
-{
- of_at91_pmc_setup(np, &sama5d3_caps);
-}
-CLK_OF_DECLARE(sama5d3_clk_pmc, "atmel,sama5d3-pmc",
- of_sama5d3_pmc_setup);
+static struct platform_driver atmel_pmc = {
+ .driver = {
+ .name = "atmel-pmc",
+ .of_match_table = atmel_pmc_dt_ids,
+ },
+};
+module_platform_driver_probe(atmel_pmc, atmel_pmc_probe);
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 11/16] ARM: at91: pm: simply call at91_pm_init |
| Message-ID | <qesgO-1GU-35@gated-at.bofh.it> |
| In reply to | #1236490 |
at91_pm_init() doesn't return a value, as is the case for its callers, simply call it instead of returning its non-existent return value. Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> --- arch/arm/mach-at91/pm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 80e277cfcc8b..5c2b60c5a2a1 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c @@ -427,7 +427,7 @@ void __init at91sam9260_pm_init(void) at91_dt_ramc(); at91_pm_data.memctrl = AT91_MEMCTRL_SDRAMC; at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP; - return at91_pm_init(); + at91_pm_init(); } void __init at91sam9g45_pm_init(void) @@ -435,7 +435,7 @@ void __init at91sam9g45_pm_init(void) at91_dt_ramc(); at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP; at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR; - return at91_pm_init(); + at91_pm_init(); } void __init at91sam9x5_pm_init(void) @@ -443,5 +443,5 @@ void __init at91sam9x5_pm_init(void) at91_dt_ramc(); at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP; at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR; - return at91_pm_init(); + at91_pm_init(); } -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 10/16] clk: at91: pmc: move pmc structures to C file |
| Message-ID | <qesgO-1GU-25@gated-at.bofh.it> |
| In reply to | #1236490 |
pmc.c is now the only user of struct at91_pmc*, move their definition in
the C file.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
drivers/clk/at91/pmc.c | 12 ++++++++++++
drivers/clk/at91/pmc.h | 12 ------------
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c
index acc8f518b392..3aa886849304 100644
--- a/drivers/clk/at91/pmc.c
+++ b/drivers/clk/at91/pmc.c
@@ -29,6 +29,18 @@
#include "pmc.h"
+struct at91_pmc_caps {
+ u32 available_irqs;
+};
+
+struct at91_pmc {
+ struct regmap *regmap;
+ int virq;
+ const struct at91_pmc_caps *caps;
+ struct irq_domain *irqdomain;
+ u32 imr;
+};
+
void __iomem *at91_pmc_base;
EXPORT_SYMBOL_GPL(at91_pmc_base);
diff --git a/drivers/clk/at91/pmc.h b/drivers/clk/at91/pmc.h
index 3b96c53c194c..550a461c7201 100644
--- a/drivers/clk/at91/pmc.h
+++ b/drivers/clk/at91/pmc.h
@@ -24,18 +24,6 @@ struct clk_range {
#define CLK_RANGE(MIN, MAX) {.min = MIN, .max = MAX,}
-struct at91_pmc_caps {
- u32 available_irqs;
-};
-
-struct at91_pmc {
- struct regmap *regmap;
- int virq;
- const struct at91_pmc_caps *caps;
- struct irq_domain *irqdomain;
- u32 imr;
-};
-
int of_at91_get_clk_range(struct device_node *np, const char *propname,
struct clk_range *range);
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 14/16] ARM: at91: remove useless includes and function prototypes |
| Message-ID | <qesgO-1GU-29@gated-at.bofh.it> |
| In reply to | #1236490 |
Remove leftover from the previous cleanup Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> --- arch/arm/mach-at91/generic.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index d224e195706a..28ca57a2060f 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h @@ -11,13 +11,6 @@ #ifndef _AT91_GENERIC_H #define _AT91_GENERIC_H -#include <linux/of.h> -#include <linux/reboot.h> - - /* Map io */ -extern void __init at91_map_io(void); -extern void __init at91_alt_map_io(void); - #ifdef CONFIG_PM extern void __init at91rm9200_pm_init(void); extern void __init at91sam9260_pm_init(void); -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 16/16] clk: at91: pmc: drop at91_pmc_base |
| Message-ID | <qesgP-1GU-53@gated-at.bofh.it> |
| In reply to | #1236490 |
at91_pmc_base is not used anymore, remove it along with at91_pmc_read and
at91_pmc_write.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
drivers/clk/at91/pmc.c | 5 -----
include/linux/clk/at91_pmc.h | 12 ------------
2 files changed, 17 deletions(-)
diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c
index 3e150967b45e..79d8cbc74be5 100644
--- a/drivers/clk/at91/pmc.c
+++ b/drivers/clk/at91/pmc.c
@@ -41,9 +41,6 @@ struct at91_pmc {
u32 imr;
};
-void __iomem *at91_pmc_base;
-EXPORT_SYMBOL_GPL(at91_pmc_base);
-
int of_at91_get_clk_range(struct device_node *np, const char *propname,
struct clk_range *range)
{
@@ -240,8 +237,6 @@ static int __init atmel_pmc_probe(struct platform_device *pdev)
int virq;
int ret = 0;
- at91_pmc_base = of_iomap(np, 0);
-
regmap = syscon_node_to_regmap(np);
if (IS_ERR(regmap))
panic("Could not retrieve syscon regmap");
diff --git a/include/linux/clk/at91_pmc.h b/include/linux/clk/at91_pmc.h
index 7669f7618f39..b80b98b4df63 100644
--- a/include/linux/clk/at91_pmc.h
+++ b/include/linux/clk/at91_pmc.h
@@ -16,18 +16,6 @@
#ifndef AT91_PMC_H
#define AT91_PMC_H
-#ifndef __ASSEMBLY__
-extern void __iomem *at91_pmc_base;
-
-#define at91_pmc_read(field) \
- readl_relaxed(at91_pmc_base + field)
-
-#define at91_pmc_write(field, value) \
- writel_relaxed(value, at91_pmc_base + field)
-#else
-.extern at91_pmc_base
-#endif
-
#define AT91_PMC_SCER 0x00 /* System Clock Enable Register */
#define AT91_PMC_SCDR 0x04 /* System Clock Disable Register */
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 02/16] clk: at91: system: don't try to free_irq when there is no IRQ |
| Message-ID | <qesgP-1GU-55@gated-at.bofh.it> |
| In reply to | #1236490 |
In the error path of at91_clk_register_system(), sys->irq is freed
unconditionally but it may not exist or be request at all.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
drivers/clk/at91/clk-system.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/clk/at91/clk-system.c b/drivers/clk/at91/clk-system.c
index 58008b3e8bc1..3f5314344286 100644
--- a/drivers/clk/at91/clk-system.c
+++ b/drivers/clk/at91/clk-system.c
@@ -138,7 +138,8 @@ at91_clk_register_system(struct at91_pmc *pmc, const char *name,
clk = clk_register(NULL, &sys->hw);
if (IS_ERR(clk)) {
- free_irq(sys->irq, sys);
+ if (irq)
+ free_irq(sys->irq, sys);
kfree(sys);
}
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 12/16] ARM: at91: pm: find and remap the pmc |
| Message-ID | <qesgP-1GU-57@gated-at.bofh.it> |
| In reply to | #1236490 |
To avoid relying on at91_pmc_read(), find the pmc node and remap it
locally.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
arch/arm/mach-at91/pm.c | 32 ++++++++++++++++++++++++++------
1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c
index 5c2b60c5a2a1..1dee29b33ff9 100644
--- a/arch/arm/mach-at91/pm.c
+++ b/arch/arm/mach-at91/pm.c
@@ -35,6 +35,8 @@
#include "generic.h"
#include "pm.h"
+void __iomem *pmc;
+
/*
* FIXME: this is needed to communicate between the pinctrl driver and
* the PM implementation in the machine. Possibly part of the PM
@@ -85,7 +87,7 @@ static int at91_pm_verify_clocks(void)
unsigned long scsr;
int i;
- scsr = at91_pmc_read(AT91_PMC_SCSR);
+ scsr = readl(pmc + AT91_PMC_SCSR);
/* USB must not be using PLLB */
if ((scsr & at91_pm_data.uhp_udp_mask) != 0) {
@@ -99,8 +101,7 @@ static int at91_pm_verify_clocks(void)
if ((scsr & (AT91_PMC_PCK0 << i)) == 0)
continue;
-
- css = at91_pmc_read(AT91_PMC_PCKR(i)) & AT91_PMC_CSS;
+ css = readl(pmc + AT91_PMC_PCKR(i)) & AT91_PMC_CSS;
if (css != AT91_PMC_CSS_SLOW) {
pr_err("AT91: PM - Suspend-to-RAM with PCK%d src %d\n", i, css);
return 0;
@@ -143,8 +144,8 @@ static void at91_pm_suspend(suspend_state_t state)
flush_cache_all();
outer_disable();
- at91_suspend_sram_fn(at91_pmc_base, at91_ramc_base[0],
- at91_ramc_base[1], pm_data);
+ at91_suspend_sram_fn(pmc, at91_ramc_base[0],
+ at91_ramc_base[1], pm_data);
outer_resume();
}
@@ -394,13 +395,32 @@ static void __init at91_pm_sram_init(void)
&at91_pm_suspend_in_sram, at91_pm_suspend_in_sram_sz);
}
+static const struct of_device_id atmel_pmc_ids[] = {
+ { .compatible = "atmel,at91rm9200-pmc" },
+ { .compatible = "atmel,at91sam9260-pmc" },
+ { .compatible = "atmel,at91sam9g45-pmc" },
+ { .compatible = "atmel,at91sam9n12-pmc" },
+ { .compatible = "atmel,at91sam9x5-pmc" },
+ { .compatible = "atmel,sama5d3-pmc" },
+ { /* sentinel */ },
+};
+
static void __init at91_pm_init(void)
{
- at91_pm_sram_init();
+ struct device_node *pmc_np;
if (at91_cpuidle_device.dev.platform_data)
platform_device_register(&at91_cpuidle_device);
+ pmc_np = of_find_matching_node(NULL, atmel_pmc_ids);
+ pmc = of_iomap(pmc_np, 0);
+ if (!pmc) {
+ pr_info("AT91: PM not supported, PMC not found");
+ return;
+ }
+
+ at91_pm_sram_init();
+
if (at91_suspend_sram_fn)
suspend_set_ops(&at91_pm_ops);
else
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 15/16] usb: gadget: atmel: access the PMC using regmap |
| Message-ID | <qesgP-1GU-61@gated-at.bofh.it> |
| In reply to | #1236490 |
Use regmap to access the PMC to avoid using at91_pmc_read and
at91_pmc_write.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
Cc: Felipe Balbi <balbi@ti.com>
Cc: linux-usb@vger.kernel.org
drivers/usb/gadget/udc/atmel_usba_udc.c | 20 ++++++++++----------
drivers/usb/gadget/udc/atmel_usba_udc.h | 2 ++
2 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c
index 3dfada8d6061..40977cd832af 100644
--- a/drivers/usb/gadget/udc/atmel_usba_udc.c
+++ b/drivers/usb/gadget/udc/atmel_usba_udc.c
@@ -17,7 +17,9 @@
#include <linux/device.h>
#include <linux/dma-mapping.h>
#include <linux/list.h>
+#include <linux/mfd/syscon.h>
#include <linux/platform_device.h>
+#include <linux/regmap.h>
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
#include <linux/usb/atmel_usba_udc.h>
@@ -1888,20 +1890,15 @@ static int atmel_usba_stop(struct usb_gadget *gadget)
#ifdef CONFIG_OF
static void at91sam9rl_toggle_bias(struct usba_udc *udc, int is_on)
{
- unsigned int uckr = at91_pmc_read(AT91_CKGR_UCKR);
-
- if (is_on)
- at91_pmc_write(AT91_CKGR_UCKR, uckr | AT91_PMC_BIASEN);
- else
- at91_pmc_write(AT91_CKGR_UCKR, uckr & ~(AT91_PMC_BIASEN));
+ regmap_update_bits(udc->pmc, AT91_CKGR_UCKR, AT91_PMC_BIASEN,
+ is_on ? AT91_PMC_BIASEN : 0);
}
static void at91sam9g45_pulse_bias(struct usba_udc *udc)
{
- unsigned int uckr = at91_pmc_read(AT91_CKGR_UCKR);
-
- at91_pmc_write(AT91_CKGR_UCKR, uckr & ~(AT91_PMC_BIASEN));
- at91_pmc_write(AT91_CKGR_UCKR, uckr | AT91_PMC_BIASEN);
+ regmap_update_bits(udc->pmc, AT91_CKGR_UCKR, AT91_PMC_BIASEN, 0);
+ regmap_update_bits(udc->pmc, AT91_CKGR_UCKR, AT91_PMC_BIASEN,
+ AT91_PMC_BIASEN);
}
static const struct usba_udc_errata at91sam9rl_errata = {
@@ -1938,6 +1935,9 @@ static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev,
return ERR_PTR(-EINVAL);
udc->errata = match->data;
+ udc->pmc = syscon_regmap_lookup_by_compatible("atmel,at91sam9g45-pmc");
+ if (udc->errata && IS_ERR(udc->pmc))
+ return ERR_CAST(udc->pmc);
udc->num_ep = 0;
diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.h b/drivers/usb/gadget/udc/atmel_usba_udc.h
index ea448a344767..3e1c9d589dfa 100644
--- a/drivers/usb/gadget/udc/atmel_usba_udc.h
+++ b/drivers/usb/gadget/udc/atmel_usba_udc.h
@@ -354,6 +354,8 @@ struct usba_udc {
struct dentry *debugfs_root;
struct dentry *debugfs_regs;
#endif
+
+ struct regmap *pmc;
};
static inline struct usba_ep *to_usba_ep(struct usb_ep *ep)
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Felipe Balbi <balbi@ti.com> |
|---|---|
| Date | 2015-09-30 18:40 +0200 |
| Subject | Re: [PATCH 15/16] usb: gadget: atmel: access the PMC using regmap |
| Message-ID | <qesA9-23w-15@gated-at.bofh.it> |
| In reply to | #1236506 |
[Multipart message — attachments visible in raw view] — view raw
On Wed, Sep 30, 2015 at 06:11:08PM +0200, Alexandre Belloni wrote: > Use regmap to access the PMC to avoid using at91_pmc_read and > at91_pmc_write. > > Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> can I take this through my tree or does it have any dependences with the rest of the series ? cheers -- balbi
[toc] | [prev] | [next] | [standalone]
| From | Nicolas Ferre <nicolas.ferre@atmel.com> |
|---|---|
| Date | 2015-09-30 18:40 +0200 |
| Subject | Re: [PATCH 15/16] usb: gadget: atmel: access the PMC using regmap |
| Message-ID | <qesA9-23w-13@gated-at.bofh.it> |
| In reply to | #1236524 |
Le 30/09/2015 18:31, Felipe Balbi a écrit : > On Wed, Sep 30, 2015 at 06:11:08PM +0200, Alexandre Belloni wrote: >> Use regmap to access the PMC to avoid using at91_pmc_read and >> at91_pmc_write. >> >> Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> > > can I take this through my tree or does it have any dependences with the rest of > the series ? Hi Felipe, Well, I have the feeling that these changes would require the regmap to be in place before using it. So yes, it has a strong dependency with the rest of the series (and DT modifications like the 06/16 patch actually). So, I think that Alexandre would agree with me that we should take the whole series with us through the arm-soc tree. An alternative would be to delay the inclusion of the USB part a little bit... Thanks for the heads-up Felipe, Bye, -- Nicolas Ferre -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Felipe Balbi <balbi@ti.com> |
|---|---|
| Date | 2015-09-30 18:50 +0200 |
| Subject | Re: [PATCH 15/16] usb: gadget: atmel: access the PMC using regmap |
| Message-ID | <qesJQ-2eW-9@gated-at.bofh.it> |
| In reply to | #1236526 |
[Multipart message — attachments visible in raw view] — view raw
On Wed, Sep 30, 2015 at 06:39:03PM +0200, Nicolas Ferre wrote: > Le 30/09/2015 18:31, Felipe Balbi a écrit : > > On Wed, Sep 30, 2015 at 06:11:08PM +0200, Alexandre Belloni wrote: > >> Use regmap to access the PMC to avoid using at91_pmc_read and > >> at91_pmc_write. > >> > >> Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> > > > > can I take this through my tree or does it have any dependences with the rest of > > the series ? > > Hi Felipe, > > Well, I have the feeling that these changes would require the regmap to > be in place before using it. So yes, it has a strong dependency with the > rest of the series (and DT modifications like the 06/16 patch actually). > > So, I think that Alexandre would agree with me that we should take the > whole series with us through the arm-soc tree. An alternative would be > to delay the inclusion of the USB part a little bit... > > Thanks for the heads-up Felipe, Bye, hey no problem. I have no objections to $subject: Acked-by: Felipe Balbi <balbi@ti.com> -- balbi
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 19:00 +0200 |
| Subject | Re: [PATCH 15/16] usb: gadget: atmel: access the PMC using regmap |
| Message-ID | <qesTw-2qP-9@gated-at.bofh.it> |
| In reply to | #1236524 |
Hi, On 30/09/2015 at 11:31:02 -0500, Felipe Balbi wrote : > On Wed, Sep 30, 2015 at 06:11:08PM +0200, Alexandre Belloni wrote: > > Use regmap to access the PMC to avoid using at91_pmc_read and > > at91_pmc_write. > > > > Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> > > can I take this through my tree or does it have any dependences with the rest of > the series ? > This actually depend on the DT change. I'd say that we can safely assume that the DT change will land in the next kernel version so you could take that patch in your tree. Nicolas, what is your opinion? -- Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 19:10 +0200 |
| Subject | Re: [PATCH 15/16] usb: gadget: atmel: access the PMC using regmap |
| Message-ID | <qet3c-2QO-21@gated-at.bofh.it> |
| In reply to | #1236544 |
On 30/09/2015 at 18:59:17 +0200, Alexandre Belloni wrote : > Hi, > > On 30/09/2015 at 11:31:02 -0500, Felipe Balbi wrote : > > On Wed, Sep 30, 2015 at 06:11:08PM +0200, Alexandre Belloni wrote: > > > Use regmap to access the PMC to avoid using at91_pmc_read and > > > at91_pmc_write. > > > > > > Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> > > > > can I take this through my tree or does it have any dependences with the rest of > > the series ? > > > > This actually depend on the DT change. I'd say that we can safely assume > that the DT change will land in the next kernel version so you could > take that patch in your tree. > > Nicolas, what is your opinion? > Ok, I'm late to the battle :) -- Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 01/16] clk: at91: utmi: use pmc_read when the at91_pmc is available |
| Message-ID | <qesgQ-1GU-67@gated-at.bofh.it> |
| In reply to | #1236490 |
at91_pmc_read is a workaround to allow external drivers to acces some
registers of the PMC. There is no need for it in clk-utmi.c as we aready
have a pointer to the struct at91_pmc.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
drivers/clk/at91/clk-utmi.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/clk/at91/clk-utmi.c b/drivers/clk/at91/clk-utmi.c
index 30dd697b1668..ca561e90a60f 100644
--- a/drivers/clk/at91/clk-utmi.c
+++ b/drivers/clk/at91/clk-utmi.c
@@ -47,7 +47,7 @@ static int clk_utmi_prepare(struct clk_hw *hw)
{
struct clk_utmi *utmi = to_clk_utmi(hw);
struct at91_pmc *pmc = utmi->pmc;
- u32 tmp = at91_pmc_read(AT91_CKGR_UCKR) | AT91_PMC_UPLLEN |
+ u32 tmp = pmc_read(pmc, AT91_CKGR_UCKR) | AT91_PMC_UPLLEN |
AT91_PMC_UPLLCOUNT | AT91_PMC_BIASEN;
pmc_write(pmc, AT91_CKGR_UCKR, tmp);
@@ -73,7 +73,7 @@ static void clk_utmi_unprepare(struct clk_hw *hw)
{
struct clk_utmi *utmi = to_clk_utmi(hw);
struct at91_pmc *pmc = utmi->pmc;
- u32 tmp = at91_pmc_read(AT91_CKGR_UCKR) & ~AT91_PMC_UPLLEN;
+ u32 tmp = pmc_read(pmc, AT91_CKGR_UCKR) & ~AT91_PMC_UPLLEN;
pmc_write(pmc, AT91_CKGR_UCKR, tmp);
}
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 13/16] ARM: at91: pm: move idle functions to pm.c |
| Message-ID | <qesgQ-1GU-65@gated-at.bofh.it> |
| In reply to | #1236490 |
Avoid using code from clk/at91 for PM.
This also has the bonus effect of setting arm_pm_idle for sama5 platforms.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
arch/arm/mach-at91/at91rm9200.c | 2 --
arch/arm/mach-at91/at91sam9.c | 2 --
arch/arm/mach-at91/generic.h | 6 ++----
arch/arm/mach-at91/pm.c | 37 ++++++++++++++++++++++++++++++++-----
arch/arm/mach-at91/sama5.c | 2 +-
drivers/clk/at91/pmc.c | 15 ---------------
6 files changed, 35 insertions(+), 29 deletions(-)
diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c
index c1a7c6cc00e1..63b4fa25b48a 100644
--- a/arch/arm/mach-at91/at91rm9200.c
+++ b/arch/arm/mach-at91/at91rm9200.c
@@ -12,7 +12,6 @@
#include <linux/of_platform.h>
#include <asm/mach/arch.h>
-#include <asm/system_misc.h>
#include "generic.h"
#include "soc.h"
@@ -33,7 +32,6 @@ static void __init at91rm9200_dt_device_init(void)
of_platform_populate(NULL, of_default_bus_match_table, NULL, soc_dev);
- arm_pm_idle = at91rm9200_idle;
at91rm9200_pm_init();
}
diff --git a/arch/arm/mach-at91/at91sam9.c b/arch/arm/mach-at91/at91sam9.c
index 7eb64f763034..cada2a6412b3 100644
--- a/arch/arm/mach-at91/at91sam9.c
+++ b/arch/arm/mach-at91/at91sam9.c
@@ -62,8 +62,6 @@ static void __init at91sam9_common_init(void)
soc_dev = soc_device_to_device(soc);
of_platform_populate(NULL, of_default_bus_match_table, NULL, soc_dev);
-
- arm_pm_idle = at91sam9_idle;
}
static void __init at91sam9_dt_device_init(void)
diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h
index b0fa7dc7286d..d224e195706a 100644
--- a/arch/arm/mach-at91/generic.h
+++ b/arch/arm/mach-at91/generic.h
@@ -18,20 +18,18 @@
extern void __init at91_map_io(void);
extern void __init at91_alt_map_io(void);
-/* idle */
-extern void at91rm9200_idle(void);
-extern void at91sam9_idle(void);
-
#ifdef CONFIG_PM
extern void __init at91rm9200_pm_init(void);
extern void __init at91sam9260_pm_init(void);
extern void __init at91sam9g45_pm_init(void);
extern void __init at91sam9x5_pm_init(void);
+extern void __init sama5_pm_init(void);
#else
static inline void __init at91rm9200_pm_init(void) { }
static inline void __init at91sam9260_pm_init(void) { }
static inline void __init at91sam9g45_pm_init(void) { }
static inline void __init at91sam9x5_pm_init(void) { }
+static inline void __init sama5_pm_init(void) { }
#endif
#endif /* _AT91_GENERIC_H */
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c
index 1dee29b33ff9..34f7f034c589 100644
--- a/arch/arm/mach-at91/pm.c
+++ b/arch/arm/mach-at91/pm.c
@@ -31,6 +31,7 @@
#include <asm/mach/irq.h>
#include <asm/fncpy.h>
#include <asm/cacheflush.h>
+#include <asm/system_misc.h>
#include "generic.h"
#include "pm.h"
@@ -349,6 +350,21 @@ static __init void at91_dt_ramc(void)
at91_pm_set_standby(standby);
}
+void at91rm9200_idle(void)
+{
+ /*
+ * Disable the processor clock. The processor will be automatically
+ * re-enabled by an interrupt or by a reset.
+ */
+ writel(AT91_PMC_PCK, pmc + AT91_PMC_SCDR);
+}
+
+void at91sam9_idle(void)
+{
+ writel(AT91_PMC_PCK, pmc + AT91_PMC_SCDR);
+ cpu_do_idle();
+}
+
static void __init at91_pm_sram_init(void)
{
struct gen_pool *sram_pool;
@@ -405,7 +421,7 @@ static const struct of_device_id atmel_pmc_ids[] = {
{ /* sentinel */ },
};
-static void __init at91_pm_init(void)
+static void __init at91_pm_init(void (*pm_idle)(void))
{
struct device_node *pmc_np;
@@ -419,6 +435,9 @@ static void __init at91_pm_init(void)
return;
}
+ if (pm_idle)
+ arm_pm_idle = pm_idle;
+
at91_pm_sram_init();
if (at91_suspend_sram_fn)
@@ -439,7 +458,7 @@ void __init at91rm9200_pm_init(void)
at91_pm_data.uhp_udp_mask = AT91RM9200_PMC_UHP | AT91RM9200_PMC_UDP;
at91_pm_data.memctrl = AT91_MEMCTRL_MC;
- at91_pm_init();
+ at91_pm_init(at91rm9200_idle);
}
void __init at91sam9260_pm_init(void)
@@ -447,7 +466,7 @@ void __init at91sam9260_pm_init(void)
at91_dt_ramc();
at91_pm_data.memctrl = AT91_MEMCTRL_SDRAMC;
at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP;
- at91_pm_init();
+ at91_pm_init(at91sam9_idle);
}
void __init at91sam9g45_pm_init(void)
@@ -455,7 +474,7 @@ void __init at91sam9g45_pm_init(void)
at91_dt_ramc();
at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP;
at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR;
- at91_pm_init();
+ at91_pm_init(at91sam9_idle);
}
void __init at91sam9x5_pm_init(void)
@@ -463,5 +482,13 @@ void __init at91sam9x5_pm_init(void)
at91_dt_ramc();
at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP;
at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR;
- at91_pm_init();
+ at91_pm_init(at91sam9_idle);
+}
+
+void __init sama5_pm_init(void)
+{
+ at91_dt_ramc();
+ at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP;
+ at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR;
+ at91_pm_init(NULL);
}
diff --git a/arch/arm/mach-at91/sama5.c b/arch/arm/mach-at91/sama5.c
index d9cf6799aec0..df8fdf1cf66d 100644
--- a/arch/arm/mach-at91/sama5.c
+++ b/arch/arm/mach-at91/sama5.c
@@ -51,7 +51,7 @@ static void __init sama5_dt_device_init(void)
soc_dev = soc_device_to_device(soc);
of_platform_populate(NULL, of_default_bus_match_table, NULL, soc_dev);
- at91sam9x5_pm_init();
+ sama5_pm_init();
}
static const char *const sama5_dt_board_compat[] __initconst = {
diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c
index 3aa886849304..3e150967b45e 100644
--- a/drivers/clk/at91/pmc.c
+++ b/drivers/clk/at91/pmc.c
@@ -44,21 +44,6 @@ struct at91_pmc {
void __iomem *at91_pmc_base;
EXPORT_SYMBOL_GPL(at91_pmc_base);
-void at91rm9200_idle(void)
-{
- /*
- * Disable the processor clock. The processor will be automatically
- * re-enabled by an interrupt or by a reset.
- */
- at91_pmc_write(AT91_PMC_SCDR, AT91_PMC_PCK);
-}
-
-void at91sam9_idle(void)
-{
- at91_pmc_write(AT91_PMC_SCDR, AT91_PMC_PCK);
- cpu_do_idle();
-}
-
int of_at91_get_clk_range(struct device_node *np, const char *propname,
struct clk_range *range)
{
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alexandre Belloni <alexandre.belloni@free-electrons.com> |
|---|---|
| Date | 2015-09-30 18:20 +0200 |
| Subject | [PATCH 08/16] clk: at91: only enable available IRQs |
| Message-ID | <qesgP-1GU-49@gated-at.bofh.it> |
| In reply to | #1236490 |
From: Boris Brezillon <boris.brezillon@free-electrons.com> Only enable available IRQs in case writing to a reserved bit has an armful effect. Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> --- drivers/clk/at91/pmc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c index 6c1f08a73373..45dd32bf2531 100644 --- a/drivers/clk/at91/pmc.c +++ b/drivers/clk/at91/pmc.c @@ -287,7 +287,7 @@ static int __init atmel_pmc_probe(struct platform_device *pdev) if (!pmc->irqdomain) return 0; - regmap_write(pmc->regmap, AT91_PMC_IDR, 0xffffffff); + regmap_write(pmc->regmap, AT91_PMC_IDR, pmc->caps->available_irqs); ret = request_irq(pmc->virq, pmc_irq_handler, IRQF_SHARED | IRQF_COND_SUSPEND, "pmc", pmc); if (ret) -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
Page 1 of 2 [1] 2 Next page →
Back to top | Article view | linux.kernel
csiph-web