* [PATCH v2 0/7] DT bindings for the jz4740-rtc driver @ 2016-10-30 23:02 Paul Cercueil [not found] ` <20161030230247.20538-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-31 20:39 ` [PATCH v3 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC Paul Cercueil 0 siblings, 2 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-30 23:02 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA This patch set is a v2 of a patchset I sent in March. The previous patch 5/5 was garbage and has been dropped. It was garbage, for two reasons: - It enforced the jz4740-rtc as the system power controller in the SoC devicetree file, which introduced policy (maybe the jz4740-based boards want to use something else as the system power controller) - It added the 'system-power-controller' entry not to the jz4740-rtc driver node, but to the 'rtc' clock node... I don't know how that slipped in, but I apologise for that. I need to raise my QA standards. For the rest: 1/7: No change 2/7: - Remove 'interrupt-parent' of the list of required properties - Add the -msec suffix for the DT entries that represent time 3/7: No change 4/7: - Get a handle to the 'rtc' clock in the probe function, to handle errors early - Call clk_prepare_enable() on the 'rtc' clock before calling clk_get_rate() - Use the -msec suffix for the OF properties that deal with time - Use of_property_read_32() instead of device_property_read_u32() 5/7, 6/7, 7/7: New patches -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20161030230247.20538-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org>]
* [PATCH v2 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC [not found] ` <20161030230247.20538-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> @ 2016-10-30 23:02 ` Paul Cercueil 2016-10-30 23:02 ` [PATCH v2 2/7] Documentation: dt: Add binding info for jz4740-rtc driver Paul Cercueil ` (5 subsequent siblings) 6 siblings, 0 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-30 23:02 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil The RTC unit present in the JZ4780 works mostly the same as the one in the JZ4740. The major difference is that register writes need to be explicitly enabled, by writing a magic code (0xA55A) to a "write enable" register before each access. Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- drivers/rtc/Kconfig | 6 +++--- drivers/rtc/rtc-jz4740.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 5 deletions(-) v2: No change diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 4cbea34..1d0ae30 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -1550,10 +1550,10 @@ config RTC_DRV_MPC5121 config RTC_DRV_JZ4740 tristate "Ingenic JZ4740 SoC" - depends on MACH_JZ4740 || COMPILE_TEST + depends on MACH_INGENIC || COMPILE_TEST help - If you say yes here you get support for the Ingenic JZ4740 SoC RTC - controller. + If you say yes here you get support for the Ingenic JZ47xx SoCs RTC + controllers. This driver can also be buillt as a module. If so, the module will be called rtc-jz4740. diff --git a/drivers/rtc/rtc-jz4740.c b/drivers/rtc/rtc-jz4740.c index 5e14651..c616efe 100644 --- a/drivers/rtc/rtc-jz4740.c +++ b/drivers/rtc/rtc-jz4740.c @@ -29,6 +29,10 @@ #define JZ_REG_RTC_HIBERNATE 0x20 #define JZ_REG_RTC_SCRATCHPAD 0x34 +/* The following are present on the jz4780 */ +#define JZ_REG_RTC_WENR 0x3C +#define JZ_RTC_WENR_WEN BIT(31) + #define JZ_RTC_CTRL_WRDY BIT(7) #define JZ_RTC_CTRL_1HZ BIT(6) #define JZ_RTC_CTRL_1HZ_IRQ BIT(5) @@ -37,8 +41,17 @@ #define JZ_RTC_CTRL_AE BIT(2) #define JZ_RTC_CTRL_ENABLE BIT(0) +/* Magic value to enable writes on jz4780 */ +#define JZ_RTC_WENR_MAGIC 0xA55A + +enum jz4740_rtc_type { + ID_JZ4740, + ID_JZ4780, +}; + struct jz4740_rtc { void __iomem *base; + enum jz4740_rtc_type type; struct rtc_device *rtc; @@ -64,11 +77,33 @@ static int jz4740_rtc_wait_write_ready(struct jz4740_rtc *rtc) return timeout ? 0 : -EIO; } +static inline int jz4780_rtc_enable_write(struct jz4740_rtc *rtc) +{ + uint32_t ctrl; + int ret, timeout = 1000; + + ret = jz4740_rtc_wait_write_ready(rtc); + if (ret != 0) + return ret; + + writel(JZ_RTC_WENR_MAGIC, rtc->base + JZ_REG_RTC_WENR); + + do { + ctrl = readl(rtc->base + JZ_REG_RTC_WENR); + } while (!(ctrl & JZ_RTC_WENR_WEN) && --timeout); + + return timeout ? 0 : -EIO; +} + static inline int jz4740_rtc_reg_write(struct jz4740_rtc *rtc, size_t reg, uint32_t val) { - int ret; - ret = jz4740_rtc_wait_write_ready(rtc); + int ret = 0; + + if (rtc->type >= ID_JZ4780) + ret = jz4780_rtc_enable_write(rtc); + if (ret == 0) + ret = jz4740_rtc_wait_write_ready(rtc); if (ret == 0) writel(val, rtc->base + reg); @@ -216,11 +251,14 @@ static int jz4740_rtc_probe(struct platform_device *pdev) struct jz4740_rtc *rtc; uint32_t scratchpad; struct resource *mem; + const struct platform_device_id *id = platform_get_device_id(pdev); rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); if (!rtc) return -ENOMEM; + rtc->type = id->driver_data; + rtc->irq = platform_get_irq(pdev, 0); if (rtc->irq < 0) { dev_err(&pdev->dev, "Failed to get platform irq\n"); @@ -295,12 +333,20 @@ static const struct dev_pm_ops jz4740_pm_ops = { #define JZ4740_RTC_PM_OPS NULL #endif /* CONFIG_PM */ +static const struct platform_device_id jz4740_rtc_ids[] = { + { "jz4740-rtc", ID_JZ4740 }, + { "jz4780-rtc", ID_JZ4780 }, + {} +}; +MODULE_DEVICE_TABLE(platform, jz4740_rtc_ids); + static struct platform_driver jz4740_rtc_driver = { .probe = jz4740_rtc_probe, .driver = { .name = "jz4740-rtc", .pm = JZ4740_RTC_PM_OPS, }, + .id_table = jz4740_rtc_ids, }; module_platform_driver(jz4740_rtc_driver); -- 2.9.3 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 2/7] Documentation: dt: Add binding info for jz4740-rtc driver [not found] ` <20161030230247.20538-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-30 23:02 ` [PATCH v2 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC Paul Cercueil @ 2016-10-30 23:02 ` Paul Cercueil [not found] ` <20161030230247.20538-3-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-30 23:02 ` [PATCH v2 3/7] rtc: rtc-jz4740: Add support for devicetree Paul Cercueil ` (4 subsequent siblings) 6 siblings, 1 reply; 20+ messages in thread From: Paul Cercueil @ 2016-10-30 23:02 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil This commit adds documentation for the device-tree bindings of the jz4740-rtc driver, which supports the RTC unit present in the JZ4740 and JZ4780 SoCs from Ingenic. Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- .../devicetree/bindings/rtc/ingenic,jz4740-rtc.txt | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt v2: - Remove 'interrupt-parent' of the list of required properties - Add the -msec suffix for the DT entries that represent time diff --git a/Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt b/Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt new file mode 100644 index 0000000..df97594 --- /dev/null +++ b/Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt @@ -0,0 +1,37 @@ +JZ4740 and similar SoCs real-time clock driver + +Required properties: + +- compatible: One of: + - "ingenic,jz4740-rtc" - for use with the JZ4740 SoC + - "ingenic,jz4780-rtc" - for use with the JZ4780 SoC +- reg: Address range of rtc register set +- interrupts: IRQ number for the alarm interrupt +- clocks: phandle to the "rtc" clock +- clock-names: must be "rtc" + +Optional properties: +- system-power-controller: To use this component as the + system power controller +- reset-pin-assert-time-msec: Reset pin low-level assertion + time after wakeup (default 60ms; range 0-125ms if RTC clock + at 32 kHz) +- min-wakeup-pin-assert-time-msec: Minimum wakeup pin assertion + time (default 100ms; range 0-2s if RTC clock at 32 kHz) + +Example: + +rtc@10003000 { + compatible = "ingenic,jz4740-rtc"; + reg = <0x10003000 0x3F>; + + interrupt-parent = <&intc>; + interrupts = <32>; + + clocks = <&rtc_clock>; + clock-names = "rtc"; + + system-power-controller; + reset-pin-assert-time-msec = <60>; + min-wakeup-pin-assert-time-msec = <100>; +}; -- 2.9.3 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 20+ messages in thread
[parent not found: <20161030230247.20538-3-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org>]
* Re: [PATCH v2 2/7] Documentation: dt: Add binding info for jz4740-rtc driver [not found] ` <20161030230247.20538-3-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> @ 2016-10-31 6:39 ` Rob Herring 2016-10-31 9:48 ` Sergei Shtylyov 1 sibling, 0 replies; 20+ messages in thread From: Rob Herring @ 2016-10-31 6:39 UTC (permalink / raw) To: Paul Cercueil Cc: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA On Mon, Oct 31, 2016 at 12:02:42AM +0100, Paul Cercueil wrote: > This commit adds documentation for the device-tree bindings of the > jz4740-rtc driver, which supports the RTC unit present in the JZ4740 and > JZ4780 SoCs from Ingenic. > > Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> > Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> > --- > .../devicetree/bindings/rtc/ingenic,jz4740-rtc.txt | 37 ++++++++++++++++++++++ > 1 file changed, 37 insertions(+) > create mode 100644 Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt > > v2: > - Remove 'interrupt-parent' of the list of required properties > - Add the -msec suffix for the DT entries that represent time Sorry, I told you the wrong suffix. It should be '-ms' as documented in .../bindings/property-units.txt. I never can remember which is why I wrote the doc to begin with. With that fix, Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/7] Documentation: dt: Add binding info for jz4740-rtc driver [not found] ` <20161030230247.20538-3-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-31 6:39 ` Rob Herring @ 2016-10-31 9:48 ` Sergei Shtylyov 1 sibling, 0 replies; 20+ messages in thread From: Sergei Shtylyov @ 2016-10-31 9:48 UTC (permalink / raw) To: Paul Cercueil, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Hello. On 10/31/2016 2:02 AM, Paul Cercueil wrote: > This commit adds documentation for the device-tree bindings of the > jz4740-rtc driver, which supports the RTC unit present in the JZ4740 and > JZ4780 SoCs from Ingenic. > > Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> > Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> > --- > .../devicetree/bindings/rtc/ingenic,jz4740-rtc.txt | 37 ++++++++++++++++++++++ > 1 file changed, 37 insertions(+) > create mode 100644 Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt > > v2: > - Remove 'interrupt-parent' of the list of required properties > - Add the -msec suffix for the DT entries that represent time > > diff --git a/Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt b/Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt > new file mode 100644 > index 0000000..df97594 > --- /dev/null > +++ b/Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt > @@ -0,0 +1,37 @@ [...] > +Example: > + > +rtc@10003000 { > + compatible = "ingenic,jz4740-rtc"; > + reg = <0x10003000 0x3F>; Are you sure it's not 0x40? It's a size, not a limit... [...] MBR, Sergei -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 3/7] rtc: rtc-jz4740: Add support for devicetree [not found] ` <20161030230247.20538-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-30 23:02 ` [PATCH v2 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC Paul Cercueil 2016-10-30 23:02 ` [PATCH v2 2/7] Documentation: dt: Add binding info for jz4740-rtc driver Paul Cercueil @ 2016-10-30 23:02 ` Paul Cercueil 2016-10-30 23:02 ` [PATCH v2 4/7] rtc: jz4740_rtc: Add support for acting as the system power controller Paul Cercueil ` (3 subsequent siblings) 6 siblings, 0 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-30 23:02 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil See Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt for a description of the bindings. Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- drivers/rtc/rtc-jz4740.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) v2: No change diff --git a/drivers/rtc/rtc-jz4740.c b/drivers/rtc/rtc-jz4740.c index c616efe..4213554 100644 --- a/drivers/rtc/rtc-jz4740.c +++ b/drivers/rtc/rtc-jz4740.c @@ -17,6 +17,7 @@ #include <linux/io.h> #include <linux/kernel.h> #include <linux/module.h> +#include <linux/of_device.h> #include <linux/platform_device.h> #include <linux/rtc.h> #include <linux/slab.h> @@ -245,6 +246,13 @@ void jz4740_rtc_poweroff(struct device *dev) } EXPORT_SYMBOL_GPL(jz4740_rtc_poweroff); +static const struct of_device_id jz4740_rtc_of_match[] = { + { .compatible = "ingenic,jz4740-rtc", .data = (void *) ID_JZ4740 }, + { .compatible = "ingenic,jz4780-rtc", .data = (void *) ID_JZ4780 }, + {}, +}; +MODULE_DEVICE_TABLE(of, jz4740_rtc_of_match); + static int jz4740_rtc_probe(struct platform_device *pdev) { int ret; @@ -252,12 +260,17 @@ static int jz4740_rtc_probe(struct platform_device *pdev) uint32_t scratchpad; struct resource *mem; const struct platform_device_id *id = platform_get_device_id(pdev); + const struct of_device_id *of_id = of_match_device( + jz4740_rtc_of_match, &pdev->dev); rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); if (!rtc) return -ENOMEM; - rtc->type = id->driver_data; + if (of_id) + rtc->type = (enum jz4740_rtc_type) of_id->data; + else + rtc->type = id->driver_data; rtc->irq = platform_get_irq(pdev, 0); if (rtc->irq < 0) { @@ -345,6 +358,7 @@ static struct platform_driver jz4740_rtc_driver = { .driver = { .name = "jz4740-rtc", .pm = JZ4740_RTC_PM_OPS, + .of_match_table = of_match_ptr(jz4740_rtc_of_match), }, .id_table = jz4740_rtc_ids, }; -- 2.9.3 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 4/7] rtc: jz4740_rtc: Add support for acting as the system power controller [not found] ` <20161030230247.20538-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> ` (2 preceding siblings ...) 2016-10-30 23:02 ` [PATCH v2 3/7] rtc: rtc-jz4740: Add support for devicetree Paul Cercueil @ 2016-10-30 23:02 ` Paul Cercueil 2016-10-30 23:02 ` [PATCH v2 5/7] MIPS: jz4740: DTS: Probe the jz4740-rtc driver from devicetree Paul Cercueil ` (2 subsequent siblings) 6 siblings, 0 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-30 23:02 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil The 'system-power-controller' singleton entry can be used in the devicetree node of the jz4740-rtc driver to specify that the driver is granted the right to power off the system through the registers of the RTC unit. See the documentation for more details: Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- drivers/rtc/rtc-jz4740.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) v2: - Get a handle to the 'rtc' clock in the probe function, to handle errors early - Call clk_prepare_enable() on the 'rtc' clock before calling clk_get_rate() - Use the -msec suffix for the OF properties that deal with time - Use of_property_read_32() instead of device_property_read_u32() diff --git a/drivers/rtc/rtc-jz4740.c b/drivers/rtc/rtc-jz4740.c index 4213554..3f9d0da 100644 --- a/drivers/rtc/rtc-jz4740.c +++ b/drivers/rtc/rtc-jz4740.c @@ -14,11 +14,13 @@ * */ +#include <linux/clk.h> #include <linux/io.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/of_device.h> #include <linux/platform_device.h> +#include <linux/reboot.h> #include <linux/rtc.h> #include <linux/slab.h> #include <linux/spinlock.h> @@ -28,6 +30,8 @@ #define JZ_REG_RTC_SEC_ALARM 0x08 #define JZ_REG_RTC_REGULATOR 0x0C #define JZ_REG_RTC_HIBERNATE 0x20 +#define JZ_REG_RTC_WAKEUP_FILTER 0x24 +#define JZ_REG_RTC_RESET_COUNTER 0x28 #define JZ_REG_RTC_SCRATCHPAD 0x34 /* The following are present on the jz4780 */ @@ -45,6 +49,9 @@ /* Magic value to enable writes on jz4780 */ #define JZ_RTC_WENR_MAGIC 0xA55A +#define JZ_RTC_WAKEUP_FILTER_MASK 0x0000FFE0 +#define JZ_RTC_RESET_COUNTER_MASK 0x00000FE0 + enum jz4740_rtc_type { ID_JZ4740, ID_JZ4780, @@ -55,12 +62,18 @@ struct jz4740_rtc { enum jz4740_rtc_type type; struct rtc_device *rtc; + struct clk *clk; int irq; spinlock_t lock; + + unsigned int min_wakeup_pin_assert_time; + unsigned int reset_pin_assert_time; }; +static struct device *dev_for_power_off; + static inline uint32_t jz4740_rtc_reg_read(struct jz4740_rtc *rtc, size_t reg) { return readl(rtc->base + reg); @@ -246,6 +259,46 @@ void jz4740_rtc_poweroff(struct device *dev) } EXPORT_SYMBOL_GPL(jz4740_rtc_poweroff); +static void jz4740_rtc_power_off(void) +{ + struct jz4740_rtc *rtc = dev_get_drvdata(dev_for_power_off); + unsigned long rtc_rate; + unsigned long wakeup_filter_ticks; + unsigned long reset_counter_ticks; + + clk_prepare_enable(rtc->clk); + + rtc_rate = clk_get_rate(rtc->clk); + + /* + * Set minimum wakeup pin assertion time: 100 ms. + * Range is 0 to 2 sec if RTC is clocked at 32 kHz. + */ + wakeup_filter_ticks = + (rtc->min_wakeup_pin_assert_time * rtc_rate) / 1000; + if (wakeup_filter_ticks < JZ_RTC_WAKEUP_FILTER_MASK) + wakeup_filter_ticks &= JZ_RTC_WAKEUP_FILTER_MASK; + else + wakeup_filter_ticks = JZ_RTC_WAKEUP_FILTER_MASK; + jz4740_rtc_reg_write(rtc, + JZ_REG_RTC_WAKEUP_FILTER, wakeup_filter_ticks); + + /* + * Set reset pin low-level assertion time after wakeup: 60 ms. + * Range is 0 to 125 ms if RTC is clocked at 32 kHz. + */ + reset_counter_ticks = (rtc->reset_pin_assert_time * rtc_rate) / 1000; + if (reset_counter_ticks < JZ_RTC_RESET_COUNTER_MASK) + reset_counter_ticks &= JZ_RTC_RESET_COUNTER_MASK; + else + reset_counter_ticks = JZ_RTC_RESET_COUNTER_MASK; + jz4740_rtc_reg_write(rtc, + JZ_REG_RTC_RESET_COUNTER, reset_counter_ticks); + + jz4740_rtc_poweroff(dev_for_power_off); + machine_halt(); +} + static const struct of_device_id jz4740_rtc_of_match[] = { { .compatible = "ingenic,jz4740-rtc", .data = (void *) ID_JZ4740 }, { .compatible = "ingenic,jz4780-rtc", .data = (void *) ID_JZ4780 }, @@ -262,6 +315,7 @@ static int jz4740_rtc_probe(struct platform_device *pdev) const struct platform_device_id *id = platform_get_device_id(pdev); const struct of_device_id *of_id = of_match_device( jz4740_rtc_of_match, &pdev->dev); + struct device_node *np = pdev->dev.of_node; rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); if (!rtc) @@ -283,6 +337,12 @@ static int jz4740_rtc_probe(struct platform_device *pdev) if (IS_ERR(rtc->base)) return PTR_ERR(rtc->base); + rtc->clk = devm_clk_get(&pdev->dev, "rtc"); + if (IS_ERR(rtc->clk)) { + dev_err(&pdev->dev, "Failed to get RTC clock\n"); + return PTR_ERR(rtc->clk); + } + spin_lock_init(&rtc->lock); platform_set_drvdata(pdev, rtc); @@ -314,6 +374,27 @@ static int jz4740_rtc_probe(struct platform_device *pdev) } } + if (np && of_device_is_system_power_controller(np)) { + if (!pm_power_off) { + /* Default: 60ms */ + rtc->reset_pin_assert_time = 60; + of_property_read_u32(np, "reset-pin-assert-time-msec", + &rtc->reset_pin_assert_time); + + /* Default: 100ms */ + rtc->min_wakeup_pin_assert_time = 100; + of_property_read_u32(np, + "min-wakeup-pin-assert-time-msec", + &rtc->min_wakeup_pin_assert_time); + + dev_for_power_off = &pdev->dev; + pm_power_off = jz4740_rtc_power_off; + } else { + dev_warn(&pdev->dev, + "Poweroff handler already present!\n"); + } + } + return 0; } -- 2.9.3 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 5/7] MIPS: jz4740: DTS: Probe the jz4740-rtc driver from devicetree [not found] ` <20161030230247.20538-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> ` (3 preceding siblings ...) 2016-10-30 23:02 ` [PATCH v2 4/7] rtc: jz4740_rtc: Add support for acting as the system power controller Paul Cercueil @ 2016-10-30 23:02 ` Paul Cercueil [not found] ` <20161030230247.20538-6-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-30 23:02 ` [PATCH v2 6/7] MIPS: qi_lb60: Probe RTC driver from DT and use it as power controller Paul Cercueil 2016-10-30 23:02 ` [PATCH v2 7/7] MIPS: jz4740: Remove obsolete code Paul Cercueil 6 siblings, 1 reply; 20+ messages in thread From: Paul Cercueil @ 2016-10-30 23:02 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil Now that the jz4740-rtc driver supports devicetree, we can add a devicetree node for it. Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- arch/mips/boot/dts/ingenic/jz4740.dtsi | 11 +++++++++++ 1 file changed, 11 insertions(+) v2: Previous patch 5/5 was garbage. This is a new patch. diff --git a/arch/mips/boot/dts/ingenic/jz4740.dtsi b/arch/mips/boot/dts/ingenic/jz4740.dtsi index f6ae6ed..c6acd6a 100644 --- a/arch/mips/boot/dts/ingenic/jz4740.dtsi +++ b/arch/mips/boot/dts/ingenic/jz4740.dtsi @@ -44,6 +44,17 @@ #clock-cells = <1>; }; + rtc_dev: jz4740-rtc@10003000 { + compatible = "ingenic,jz4740-rtc"; + reg = <0x10003000 0x40>; + + interrupt-parent = <&intc>; + interrupts = <15>; + + clocks = <&cgu JZ4740_CLK_RTC>; + clock-names = "rtc"; + }; + uart0: serial@10030000 { compatible = "ingenic,jz4740-uart"; reg = <0x10030000 0x100>; -- 2.9.3 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 20+ messages in thread
[parent not found: <20161030230247.20538-6-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org>]
* Re: [PATCH v2 5/7] MIPS: jz4740: DTS: Probe the jz4740-rtc driver from devicetree [not found] ` <20161030230247.20538-6-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> @ 2016-10-31 9:50 ` Sergei Shtylyov 0 siblings, 0 replies; 20+ messages in thread From: Sergei Shtylyov @ 2016-10-31 9:50 UTC (permalink / raw) To: Paul Cercueil, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Hello. On 10/31/2016 2:02 AM, Paul Cercueil wrote: > Now that the jz4740-rtc driver supports devicetree, we can add a > devicetree node for it. > > Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> > Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> > --- > arch/mips/boot/dts/ingenic/jz4740.dtsi | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > v2: Previous patch 5/5 was garbage. This is a new patch. > > diff --git a/arch/mips/boot/dts/ingenic/jz4740.dtsi b/arch/mips/boot/dts/ingenic/jz4740.dtsi > index f6ae6ed..c6acd6a 100644 > --- a/arch/mips/boot/dts/ingenic/jz4740.dtsi > +++ b/arch/mips/boot/dts/ingenic/jz4740.dtsi > @@ -44,6 +44,17 @@ > #clock-cells = <1>; > }; > > + rtc_dev: jz4740-rtc@10003000 { Just "rtc@10003000" to comply with the DT spec. [...] MBR, Sergei -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 6/7] MIPS: qi_lb60: Probe RTC driver from DT and use it as power controller [not found] ` <20161030230247.20538-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> ` (4 preceding siblings ...) 2016-10-30 23:02 ` [PATCH v2 5/7] MIPS: jz4740: DTS: Probe the jz4740-rtc driver from devicetree Paul Cercueil @ 2016-10-30 23:02 ` Paul Cercueil 2016-10-30 23:02 ` [PATCH v2 7/7] MIPS: jz4740: Remove obsolete code Paul Cercueil 6 siblings, 0 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-30 23:02 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil Since we already have a devicetree node for the jz4740-rtc driver, we don't have to probe it from platform code. Besides, using the jz4740-rtc driver as the power controller for the qi_lb60 platform allows us to remove the jz4740 platform power-off code, since this is the only jz4740-based board upstream. Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- arch/mips/boot/dts/ingenic/qi_lb60.dts | 4 ++++ arch/mips/jz4740/board-qi_lb60.c | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) v2: New patch in this series diff --git a/arch/mips/boot/dts/ingenic/qi_lb60.dts b/arch/mips/boot/dts/ingenic/qi_lb60.dts index 2414d63..be1a7d3 100644 --- a/arch/mips/boot/dts/ingenic/qi_lb60.dts +++ b/arch/mips/boot/dts/ingenic/qi_lb60.dts @@ -13,3 +13,7 @@ &ext { clock-frequency = <12000000>; }; + +&rtc_dev { + system-power-controller; +}; diff --git a/arch/mips/jz4740/board-qi_lb60.c b/arch/mips/jz4740/board-qi_lb60.c index 258fd03..a5bd94b 100644 --- a/arch/mips/jz4740/board-qi_lb60.c +++ b/arch/mips/jz4740/board-qi_lb60.c @@ -438,7 +438,6 @@ static struct platform_device *jz_platform_devices[] __initdata = { &jz4740_pcm_device, &jz4740_i2s_device, &jz4740_codec_device, - &jz4740_rtc_device, &jz4740_adc_device, &jz4740_pwm_device, &jz4740_dma_device, -- 2.9.3 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 7/7] MIPS: jz4740: Remove obsolete code [not found] ` <20161030230247.20538-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> ` (5 preceding siblings ...) 2016-10-30 23:02 ` [PATCH v2 6/7] MIPS: qi_lb60: Probe RTC driver from DT and use it as power controller Paul Cercueil @ 2016-10-30 23:02 ` Paul Cercueil 6 siblings, 0 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-30 23:02 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil This commit removes two things: - The platform_device that corresponds to the RTC driver, since we now probe this driver from devicetree; - The platform power-off code, since all the jz4740-based platforms are now using the jz4740-rtc driver as the system power controller. Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- arch/mips/include/asm/mach-jz4740/platform.h | 1 - arch/mips/jz4740/platform.c | 21 ---------- arch/mips/jz4740/reset.c | 63 ---------------------------- 3 files changed, 85 deletions(-) v2: New patch in this series diff --git a/arch/mips/include/asm/mach-jz4740/platform.h b/arch/mips/include/asm/mach-jz4740/platform.h index 073b8bf..3645974 100644 --- a/arch/mips/include/asm/mach-jz4740/platform.h +++ b/arch/mips/include/asm/mach-jz4740/platform.h @@ -22,7 +22,6 @@ extern struct platform_device jz4740_udc_device; extern struct platform_device jz4740_udc_xceiv_device; extern struct platform_device jz4740_mmc_device; -extern struct platform_device jz4740_rtc_device; extern struct platform_device jz4740_i2c_device; extern struct platform_device jz4740_nand_device; extern struct platform_device jz4740_framebuffer_device; diff --git a/arch/mips/jz4740/platform.c b/arch/mips/jz4740/platform.c index 2f1dab3..5b7cdd6 100644 --- a/arch/mips/jz4740/platform.c +++ b/arch/mips/jz4740/platform.c @@ -88,27 +88,6 @@ struct platform_device jz4740_mmc_device = { .resource = jz4740_mmc_resources, }; -/* RTC controller */ -static struct resource jz4740_rtc_resources[] = { - { - .start = JZ4740_RTC_BASE_ADDR, - .end = JZ4740_RTC_BASE_ADDR + 0x38 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = JZ4740_IRQ_RTC, - .end = JZ4740_IRQ_RTC, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device jz4740_rtc_device = { - .name = "jz4740-rtc", - .id = -1, - .num_resources = ARRAY_SIZE(jz4740_rtc_resources), - .resource = jz4740_rtc_resources, -}; - /* I2C controller */ static struct resource jz4740_i2c_resources[] = { { diff --git a/arch/mips/jz4740/reset.c b/arch/mips/jz4740/reset.c index 954e669..67780c4 100644 --- a/arch/mips/jz4740/reset.c +++ b/arch/mips/jz4740/reset.c @@ -57,71 +57,8 @@ static void jz4740_restart(char *command) jz4740_halt(); } -#define JZ_REG_RTC_CTRL 0x00 -#define JZ_REG_RTC_HIBERNATE 0x20 -#define JZ_REG_RTC_WAKEUP_FILTER 0x24 -#define JZ_REG_RTC_RESET_COUNTER 0x28 - -#define JZ_RTC_CTRL_WRDY BIT(7) -#define JZ_RTC_WAKEUP_FILTER_MASK 0x0000FFE0 -#define JZ_RTC_RESET_COUNTER_MASK 0x00000FE0 - -static inline void jz4740_rtc_wait_ready(void __iomem *rtc_base) -{ - uint32_t ctrl; - - do { - ctrl = readl(rtc_base + JZ_REG_RTC_CTRL); - } while (!(ctrl & JZ_RTC_CTRL_WRDY)); -} - -static void jz4740_power_off(void) -{ - void __iomem *rtc_base = ioremap(JZ4740_RTC_BASE_ADDR, 0x38); - unsigned long wakeup_filter_ticks; - unsigned long reset_counter_ticks; - struct clk *rtc_clk; - unsigned long rtc_rate; - - rtc_clk = clk_get(NULL, "rtc"); - if (IS_ERR(rtc_clk)) - panic("unable to get RTC clock"); - rtc_rate = clk_get_rate(rtc_clk); - clk_put(rtc_clk); - - /* - * Set minimum wakeup pin assertion time: 100 ms. - * Range is 0 to 2 sec if RTC is clocked at 32 kHz. - */ - wakeup_filter_ticks = (100 * rtc_rate) / 1000; - if (wakeup_filter_ticks < JZ_RTC_WAKEUP_FILTER_MASK) - wakeup_filter_ticks &= JZ_RTC_WAKEUP_FILTER_MASK; - else - wakeup_filter_ticks = JZ_RTC_WAKEUP_FILTER_MASK; - jz4740_rtc_wait_ready(rtc_base); - writel(wakeup_filter_ticks, rtc_base + JZ_REG_RTC_WAKEUP_FILTER); - - /* - * Set reset pin low-level assertion time after wakeup: 60 ms. - * Range is 0 to 125 ms if RTC is clocked at 32 kHz. - */ - reset_counter_ticks = (60 * rtc_rate) / 1000; - if (reset_counter_ticks < JZ_RTC_RESET_COUNTER_MASK) - reset_counter_ticks &= JZ_RTC_RESET_COUNTER_MASK; - else - reset_counter_ticks = JZ_RTC_RESET_COUNTER_MASK; - jz4740_rtc_wait_ready(rtc_base); - writel(reset_counter_ticks, rtc_base + JZ_REG_RTC_RESET_COUNTER); - - jz4740_rtc_wait_ready(rtc_base); - writel(1, rtc_base + JZ_REG_RTC_HIBERNATE); - - jz4740_halt(); -} - void jz4740_reset_init(void) { _machine_restart = jz4740_restart; _machine_halt = jz4740_halt; - pm_power_off = jz4740_power_off; } -- 2.9.3 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v3 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC 2016-10-30 23:02 [PATCH v2 0/7] DT bindings for the jz4740-rtc driver Paul Cercueil [not found] ` <20161030230247.20538-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> @ 2016-10-31 20:39 ` Paul Cercueil [not found] ` <20161031203951.5444-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-31 20:39 ` [PATCH v3 4/7] rtc: jz4740_rtc: Add support for acting as the system power controller Paul Cercueil 1 sibling, 2 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-31 20:39 UTC (permalink / raw) To: rtc-linux, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree, linux-kernel, linux-mips Cc: Paul Cercueil The RTC unit present in the JZ4780 works mostly the same as the one in the JZ4740. The major difference is that register writes need to be explicitly enabled, by writing a magic code (0xA55A) to a "write enable" register before each access. Signed-off-by: Paul Cercueil <paul@crapouillou.net> Acked-by: Maarten ter Huurne <maarten@treewalker.org> --- drivers/rtc/Kconfig | 6 +++--- drivers/rtc/rtc-jz4740.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 5 deletions(-) v2: No change v3: No change diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 4cbea34..1d0ae30 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -1550,10 +1550,10 @@ config RTC_DRV_MPC5121 config RTC_DRV_JZ4740 tristate "Ingenic JZ4740 SoC" - depends on MACH_JZ4740 || COMPILE_TEST + depends on MACH_INGENIC || COMPILE_TEST help - If you say yes here you get support for the Ingenic JZ4740 SoC RTC - controller. + If you say yes here you get support for the Ingenic JZ47xx SoCs RTC + controllers. This driver can also be buillt as a module. If so, the module will be called rtc-jz4740. diff --git a/drivers/rtc/rtc-jz4740.c b/drivers/rtc/rtc-jz4740.c index 5e14651..c616efe 100644 --- a/drivers/rtc/rtc-jz4740.c +++ b/drivers/rtc/rtc-jz4740.c @@ -29,6 +29,10 @@ #define JZ_REG_RTC_HIBERNATE 0x20 #define JZ_REG_RTC_SCRATCHPAD 0x34 +/* The following are present on the jz4780 */ +#define JZ_REG_RTC_WENR 0x3C +#define JZ_RTC_WENR_WEN BIT(31) + #define JZ_RTC_CTRL_WRDY BIT(7) #define JZ_RTC_CTRL_1HZ BIT(6) #define JZ_RTC_CTRL_1HZ_IRQ BIT(5) @@ -37,8 +41,17 @@ #define JZ_RTC_CTRL_AE BIT(2) #define JZ_RTC_CTRL_ENABLE BIT(0) +/* Magic value to enable writes on jz4780 */ +#define JZ_RTC_WENR_MAGIC 0xA55A + +enum jz4740_rtc_type { + ID_JZ4740, + ID_JZ4780, +}; + struct jz4740_rtc { void __iomem *base; + enum jz4740_rtc_type type; struct rtc_device *rtc; @@ -64,11 +77,33 @@ static int jz4740_rtc_wait_write_ready(struct jz4740_rtc *rtc) return timeout ? 0 : -EIO; } +static inline int jz4780_rtc_enable_write(struct jz4740_rtc *rtc) +{ + uint32_t ctrl; + int ret, timeout = 1000; + + ret = jz4740_rtc_wait_write_ready(rtc); + if (ret != 0) + return ret; + + writel(JZ_RTC_WENR_MAGIC, rtc->base + JZ_REG_RTC_WENR); + + do { + ctrl = readl(rtc->base + JZ_REG_RTC_WENR); + } while (!(ctrl & JZ_RTC_WENR_WEN) && --timeout); + + return timeout ? 0 : -EIO; +} + static inline int jz4740_rtc_reg_write(struct jz4740_rtc *rtc, size_t reg, uint32_t val) { - int ret; - ret = jz4740_rtc_wait_write_ready(rtc); + int ret = 0; + + if (rtc->type >= ID_JZ4780) + ret = jz4780_rtc_enable_write(rtc); + if (ret == 0) + ret = jz4740_rtc_wait_write_ready(rtc); if (ret == 0) writel(val, rtc->base + reg); @@ -216,11 +251,14 @@ static int jz4740_rtc_probe(struct platform_device *pdev) struct jz4740_rtc *rtc; uint32_t scratchpad; struct resource *mem; + const struct platform_device_id *id = platform_get_device_id(pdev); rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); if (!rtc) return -ENOMEM; + rtc->type = id->driver_data; + rtc->irq = platform_get_irq(pdev, 0); if (rtc->irq < 0) { dev_err(&pdev->dev, "Failed to get platform irq\n"); @@ -295,12 +333,20 @@ static const struct dev_pm_ops jz4740_pm_ops = { #define JZ4740_RTC_PM_OPS NULL #endif /* CONFIG_PM */ +static const struct platform_device_id jz4740_rtc_ids[] = { + { "jz4740-rtc", ID_JZ4740 }, + { "jz4780-rtc", ID_JZ4780 }, + {} +}; +MODULE_DEVICE_TABLE(platform, jz4740_rtc_ids); + static struct platform_driver jz4740_rtc_driver = { .probe = jz4740_rtc_probe, .driver = { .name = "jz4740-rtc", .pm = JZ4740_RTC_PM_OPS, }, + .id_table = jz4740_rtc_ids, }; module_platform_driver(jz4740_rtc_driver); -- 2.9.3 ^ permalink raw reply related [flat|nested] 20+ messages in thread
[parent not found: <20161031203951.5444-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org>]
* [PATCH v3 2/7] Documentation: dt: Add binding info for jz4740-rtc driver [not found] ` <20161031203951.5444-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> @ 2016-10-31 20:39 ` Paul Cercueil 2016-10-31 21:16 ` Rob Herring 2016-10-31 20:39 ` [PATCH v3 3/7] rtc: rtc-jz4740: Add support for devicetree Paul Cercueil ` (4 subsequent siblings) 5 siblings, 1 reply; 20+ messages in thread From: Paul Cercueil @ 2016-10-31 20:39 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil This commit adds documentation for the device-tree bindings of the jz4740-rtc driver, which supports the RTC unit present in the JZ4740 and JZ4780 SoCs from Ingenic. Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- .../devicetree/bindings/rtc/ingenic,jz4740-rtc.txt | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt v2: - Remove 'interrupt-parent' of the list of required properties - Add the -msec suffix for the DT entries that represent time v3: - Replace the -msec suffix by -ms - Change the register area size from 0x3F to 0x40 diff --git a/Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt b/Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt new file mode 100644 index 0000000..df97594 --- /dev/null +++ b/Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt @@ -0,0 +1,37 @@ +JZ4740 and similar SoCs real-time clock driver + +Required properties: + +- compatible: One of: + - "ingenic,jz4740-rtc" - for use with the JZ4740 SoC + - "ingenic,jz4780-rtc" - for use with the JZ4780 SoC +- reg: Address range of rtc register set +- interrupts: IRQ number for the alarm interrupt +- clocks: phandle to the "rtc" clock +- clock-names: must be "rtc" + +Optional properties: +- system-power-controller: To use this component as the + system power controller +- reset-pin-assert-time-ms: Reset pin low-level assertion + time after wakeup (default 60ms; range 0-125ms if RTC clock + at 32 kHz) +- min-wakeup-pin-assert-time-ms: Minimum wakeup pin assertion + time (default 100ms; range 0-2s if RTC clock at 32 kHz) + +Example: + +rtc@10003000 { + compatible = "ingenic,jz4740-rtc"; + reg = <0x10003000 0x40>; + + interrupt-parent = <&intc>; + interrupts = <32>; + + clocks = <&rtc_clock>; + clock-names = "rtc"; + + system-power-controller; + reset-pin-assert-time-ms = <60>; + min-wakeup-pin-assert-time-ms = <100>; +}; -- 2.9.3 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH v3 2/7] Documentation: dt: Add binding info for jz4740-rtc driver 2016-10-31 20:39 ` [PATCH v3 2/7] Documentation: dt: Add binding info for jz4740-rtc driver Paul Cercueil @ 2016-10-31 21:16 ` Rob Herring 0 siblings, 0 replies; 20+ messages in thread From: Rob Herring @ 2016-10-31 21:16 UTC (permalink / raw) To: Paul Cercueil Cc: open list:REAL TIME CLOCK (RTC) SUBSYSTEM, Alessandro Zummo, Alexandre Belloni, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Linux-MIPS On Mon, Oct 31, 2016 at 3:39 PM, Paul Cercueil <paul@crapouillou.net> wrote: > This commit adds documentation for the device-tree bindings of the > jz4740-rtc driver, which supports the RTC unit present in the JZ4740 and > JZ4780 SoCs from Ingenic. > > Signed-off-by: Paul Cercueil <paul@crapouillou.net> > Acked-by: Maarten ter Huurne <maarten@treewalker.org> > --- > .../devicetree/bindings/rtc/ingenic,jz4740-rtc.txt | 37 ++++++++++++++++++++++ > 1 file changed, 37 insertions(+) > create mode 100644 Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt Acked-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v3 3/7] rtc: rtc-jz4740: Add support for devicetree [not found] ` <20161031203951.5444-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-31 20:39 ` [PATCH v3 2/7] Documentation: dt: Add binding info for jz4740-rtc driver Paul Cercueil @ 2016-10-31 20:39 ` Paul Cercueil 2016-10-31 20:39 ` [PATCH v3 5/7] MIPS: jz4740: DTS: Probe the jz4740-rtc driver from devicetree Paul Cercueil ` (3 subsequent siblings) 5 siblings, 0 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-31 20:39 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil See Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt for a description of the bindings. Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- drivers/rtc/rtc-jz4740.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) v2: No change v3: No change diff --git a/drivers/rtc/rtc-jz4740.c b/drivers/rtc/rtc-jz4740.c index c616efe..4213554 100644 --- a/drivers/rtc/rtc-jz4740.c +++ b/drivers/rtc/rtc-jz4740.c @@ -17,6 +17,7 @@ #include <linux/io.h> #include <linux/kernel.h> #include <linux/module.h> +#include <linux/of_device.h> #include <linux/platform_device.h> #include <linux/rtc.h> #include <linux/slab.h> @@ -245,6 +246,13 @@ void jz4740_rtc_poweroff(struct device *dev) } EXPORT_SYMBOL_GPL(jz4740_rtc_poweroff); +static const struct of_device_id jz4740_rtc_of_match[] = { + { .compatible = "ingenic,jz4740-rtc", .data = (void *) ID_JZ4740 }, + { .compatible = "ingenic,jz4780-rtc", .data = (void *) ID_JZ4780 }, + {}, +}; +MODULE_DEVICE_TABLE(of, jz4740_rtc_of_match); + static int jz4740_rtc_probe(struct platform_device *pdev) { int ret; @@ -252,12 +260,17 @@ static int jz4740_rtc_probe(struct platform_device *pdev) uint32_t scratchpad; struct resource *mem; const struct platform_device_id *id = platform_get_device_id(pdev); + const struct of_device_id *of_id = of_match_device( + jz4740_rtc_of_match, &pdev->dev); rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); if (!rtc) return -ENOMEM; - rtc->type = id->driver_data; + if (of_id) + rtc->type = (enum jz4740_rtc_type) of_id->data; + else + rtc->type = id->driver_data; rtc->irq = platform_get_irq(pdev, 0); if (rtc->irq < 0) { @@ -345,6 +358,7 @@ static struct platform_driver jz4740_rtc_driver = { .driver = { .name = "jz4740-rtc", .pm = JZ4740_RTC_PM_OPS, + .of_match_table = of_match_ptr(jz4740_rtc_of_match), }, .id_table = jz4740_rtc_ids, }; -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v3 5/7] MIPS: jz4740: DTS: Probe the jz4740-rtc driver from devicetree [not found] ` <20161031203951.5444-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-31 20:39 ` [PATCH v3 2/7] Documentation: dt: Add binding info for jz4740-rtc driver Paul Cercueil 2016-10-31 20:39 ` [PATCH v3 3/7] rtc: rtc-jz4740: Add support for devicetree Paul Cercueil @ 2016-10-31 20:39 ` Paul Cercueil 2016-10-31 20:39 ` [PATCH v3 6/7] MIPS: qi_lb60: Probe RTC driver from DT and use it as power controller Paul Cercueil ` (2 subsequent siblings) 5 siblings, 0 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-31 20:39 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil Now that the jz4740-rtc driver supports devicetree, we can add a devicetree node for it. Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- arch/mips/boot/dts/ingenic/jz4740.dtsi | 11 +++++++++++ 1 file changed, 11 insertions(+) v2: Previous patch 5/5 was garbage. This is a new patch. v3: Changed 'jz4740-rtc@10003000' to 'rtc@10003000' diff --git a/arch/mips/boot/dts/ingenic/jz4740.dtsi b/arch/mips/boot/dts/ingenic/jz4740.dtsi index f6ae6ed..c6acd6a 100644 --- a/arch/mips/boot/dts/ingenic/jz4740.dtsi +++ b/arch/mips/boot/dts/ingenic/jz4740.dtsi @@ -44,6 +44,17 @@ #clock-cells = <1>; }; + rtc_dev: rtc@10003000 { + compatible = "ingenic,jz4740-rtc"; + reg = <0x10003000 0x40>; + + interrupt-parent = <&intc>; + interrupts = <15>; + + clocks = <&cgu JZ4740_CLK_RTC>; + clock-names = "rtc"; + }; + uart0: serial@10030000 { compatible = "ingenic,jz4740-uart"; reg = <0x10030000 0x100>; -- 2.9.3 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v3 6/7] MIPS: qi_lb60: Probe RTC driver from DT and use it as power controller [not found] ` <20161031203951.5444-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> ` (2 preceding siblings ...) 2016-10-31 20:39 ` [PATCH v3 5/7] MIPS: jz4740: DTS: Probe the jz4740-rtc driver from devicetree Paul Cercueil @ 2016-10-31 20:39 ` Paul Cercueil 2016-10-31 20:39 ` [PATCH v3 7/7] MIPS: jz4740: Remove obsolete code Paul Cercueil 2016-11-04 23:08 ` [PATCH v3 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC Alexandre Belloni 5 siblings, 0 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-31 20:39 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil Since we already have a devicetree node for the jz4740-rtc driver, we don't have to probe it from platform code. Besides, using the jz4740-rtc driver as the power controller for the qi_lb60 platform allows us to remove the jz4740 platform power-off code, since this is the only jz4740-based board upstream. Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- arch/mips/boot/dts/ingenic/qi_lb60.dts | 4 ++++ arch/mips/jz4740/board-qi_lb60.c | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) v2: New patch in this series v3: No change diff --git a/arch/mips/boot/dts/ingenic/qi_lb60.dts b/arch/mips/boot/dts/ingenic/qi_lb60.dts index 2414d63..be1a7d3 100644 --- a/arch/mips/boot/dts/ingenic/qi_lb60.dts +++ b/arch/mips/boot/dts/ingenic/qi_lb60.dts @@ -13,3 +13,7 @@ &ext { clock-frequency = <12000000>; }; + +&rtc_dev { + system-power-controller; +}; diff --git a/arch/mips/jz4740/board-qi_lb60.c b/arch/mips/jz4740/board-qi_lb60.c index 258fd03..a5bd94b 100644 --- a/arch/mips/jz4740/board-qi_lb60.c +++ b/arch/mips/jz4740/board-qi_lb60.c @@ -438,7 +438,6 @@ static struct platform_device *jz_platform_devices[] __initdata = { &jz4740_pcm_device, &jz4740_i2s_device, &jz4740_codec_device, - &jz4740_rtc_device, &jz4740_adc_device, &jz4740_pwm_device, &jz4740_dma_device, -- 2.9.3 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v3 7/7] MIPS: jz4740: Remove obsolete code [not found] ` <20161031203951.5444-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> ` (3 preceding siblings ...) 2016-10-31 20:39 ` [PATCH v3 6/7] MIPS: qi_lb60: Probe RTC driver from DT and use it as power controller Paul Cercueil @ 2016-10-31 20:39 ` Paul Cercueil 2016-11-04 23:08 ` [PATCH v3 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC Alexandre Belloni 5 siblings, 0 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-31 20:39 UTC (permalink / raw) To: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA Cc: Paul Cercueil This commit removes two things: - The platform_device that corresponds to the RTC driver, since we now probe this driver from devicetree; - The platform power-off code, since all the jz4740-based platforms are now using the jz4740-rtc driver as the system power controller. Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> --- arch/mips/include/asm/mach-jz4740/platform.h | 1 - arch/mips/jz4740/platform.c | 21 ---------- arch/mips/jz4740/reset.c | 63 ---------------------------- 3 files changed, 85 deletions(-) v2: New patch in this series v3: No change diff --git a/arch/mips/include/asm/mach-jz4740/platform.h b/arch/mips/include/asm/mach-jz4740/platform.h index 073b8bf..3645974 100644 --- a/arch/mips/include/asm/mach-jz4740/platform.h +++ b/arch/mips/include/asm/mach-jz4740/platform.h @@ -22,7 +22,6 @@ extern struct platform_device jz4740_udc_device; extern struct platform_device jz4740_udc_xceiv_device; extern struct platform_device jz4740_mmc_device; -extern struct platform_device jz4740_rtc_device; extern struct platform_device jz4740_i2c_device; extern struct platform_device jz4740_nand_device; extern struct platform_device jz4740_framebuffer_device; diff --git a/arch/mips/jz4740/platform.c b/arch/mips/jz4740/platform.c index 2f1dab3..5b7cdd6 100644 --- a/arch/mips/jz4740/platform.c +++ b/arch/mips/jz4740/platform.c @@ -88,27 +88,6 @@ struct platform_device jz4740_mmc_device = { .resource = jz4740_mmc_resources, }; -/* RTC controller */ -static struct resource jz4740_rtc_resources[] = { - { - .start = JZ4740_RTC_BASE_ADDR, - .end = JZ4740_RTC_BASE_ADDR + 0x38 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = JZ4740_IRQ_RTC, - .end = JZ4740_IRQ_RTC, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device jz4740_rtc_device = { - .name = "jz4740-rtc", - .id = -1, - .num_resources = ARRAY_SIZE(jz4740_rtc_resources), - .resource = jz4740_rtc_resources, -}; - /* I2C controller */ static struct resource jz4740_i2c_resources[] = { { diff --git a/arch/mips/jz4740/reset.c b/arch/mips/jz4740/reset.c index 954e669..67780c4 100644 --- a/arch/mips/jz4740/reset.c +++ b/arch/mips/jz4740/reset.c @@ -57,71 +57,8 @@ static void jz4740_restart(char *command) jz4740_halt(); } -#define JZ_REG_RTC_CTRL 0x00 -#define JZ_REG_RTC_HIBERNATE 0x20 -#define JZ_REG_RTC_WAKEUP_FILTER 0x24 -#define JZ_REG_RTC_RESET_COUNTER 0x28 - -#define JZ_RTC_CTRL_WRDY BIT(7) -#define JZ_RTC_WAKEUP_FILTER_MASK 0x0000FFE0 -#define JZ_RTC_RESET_COUNTER_MASK 0x00000FE0 - -static inline void jz4740_rtc_wait_ready(void __iomem *rtc_base) -{ - uint32_t ctrl; - - do { - ctrl = readl(rtc_base + JZ_REG_RTC_CTRL); - } while (!(ctrl & JZ_RTC_CTRL_WRDY)); -} - -static void jz4740_power_off(void) -{ - void __iomem *rtc_base = ioremap(JZ4740_RTC_BASE_ADDR, 0x38); - unsigned long wakeup_filter_ticks; - unsigned long reset_counter_ticks; - struct clk *rtc_clk; - unsigned long rtc_rate; - - rtc_clk = clk_get(NULL, "rtc"); - if (IS_ERR(rtc_clk)) - panic("unable to get RTC clock"); - rtc_rate = clk_get_rate(rtc_clk); - clk_put(rtc_clk); - - /* - * Set minimum wakeup pin assertion time: 100 ms. - * Range is 0 to 2 sec if RTC is clocked at 32 kHz. - */ - wakeup_filter_ticks = (100 * rtc_rate) / 1000; - if (wakeup_filter_ticks < JZ_RTC_WAKEUP_FILTER_MASK) - wakeup_filter_ticks &= JZ_RTC_WAKEUP_FILTER_MASK; - else - wakeup_filter_ticks = JZ_RTC_WAKEUP_FILTER_MASK; - jz4740_rtc_wait_ready(rtc_base); - writel(wakeup_filter_ticks, rtc_base + JZ_REG_RTC_WAKEUP_FILTER); - - /* - * Set reset pin low-level assertion time after wakeup: 60 ms. - * Range is 0 to 125 ms if RTC is clocked at 32 kHz. - */ - reset_counter_ticks = (60 * rtc_rate) / 1000; - if (reset_counter_ticks < JZ_RTC_RESET_COUNTER_MASK) - reset_counter_ticks &= JZ_RTC_RESET_COUNTER_MASK; - else - reset_counter_ticks = JZ_RTC_RESET_COUNTER_MASK; - jz4740_rtc_wait_ready(rtc_base); - writel(reset_counter_ticks, rtc_base + JZ_REG_RTC_RESET_COUNTER); - - jz4740_rtc_wait_ready(rtc_base); - writel(1, rtc_base + JZ_REG_RTC_HIBERNATE); - - jz4740_halt(); -} - void jz4740_reset_init(void) { _machine_restart = jz4740_restart; _machine_halt = jz4740_halt; - pm_power_off = jz4740_power_off; } -- 2.9.3 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH v3 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC [not found] ` <20161031203951.5444-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> ` (4 preceding siblings ...) 2016-10-31 20:39 ` [PATCH v3 7/7] MIPS: jz4740: Remove obsolete code Paul Cercueil @ 2016-11-04 23:08 ` Alexandre Belloni 5 siblings, 0 replies; 20+ messages in thread From: Alexandre Belloni @ 2016-11-04 23:08 UTC (permalink / raw) To: Paul Cercueil Cc: rtc-linux-/JYPxA39Uh5TLH3MbocFFw, Alessandro Zummo, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mips-6z/3iImG2C8G8FEW9MqTrA On 31/10/2016 at 21:39:45 +0100, Paul Cercueil wrote : > The RTC unit present in the JZ4780 works mostly the same as the one in > the JZ4740. The major difference is that register writes need to be > explicitly enabled, by writing a magic code (0xA55A) to a "write > enable" register before each access. > > Signed-off-by: Paul Cercueil <paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> > Acked-by: Maarten ter Huurne <maarten-Ph2Y2OKCxY1M656bX5wj8A@public.gmane.org> > --- > drivers/rtc/Kconfig | 6 +++--- > drivers/rtc/rtc-jz4740.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++-- > 2 files changed, 51 insertions(+), 5 deletions(-) > > v2: No change > v3: No change > All applied, thanks -- Alexandre Belloni, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v3 4/7] rtc: jz4740_rtc: Add support for acting as the system power controller 2016-10-31 20:39 ` [PATCH v3 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC Paul Cercueil [not found] ` <20161031203951.5444-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> @ 2016-10-31 20:39 ` Paul Cercueil 1 sibling, 0 replies; 20+ messages in thread From: Paul Cercueil @ 2016-10-31 20:39 UTC (permalink / raw) To: rtc-linux, Alessandro Zummo, Alexandre Belloni, Rob Herring, Mark Rutland, Ralf Baechle, Maarten ter Huurne, Lars-Peter Clausen, devicetree, linux-kernel, linux-mips Cc: Paul Cercueil The 'system-power-controller' singleton entry can be used in the devicetree node of the jz4740-rtc driver to specify that the driver is granted the right to power off the system through the registers of the RTC unit. See the documentation for more details: Documentation/devicetree/bindings/rtc/ingenic,jz4740-rtc.txt Signed-off-by: Paul Cercueil <paul@crapouillou.net> Acked-by: Maarten ter Huurne <maarten@treewalker.org> --- drivers/rtc/rtc-jz4740.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) v2: - Get a handle to the 'rtc' clock in the probe function, to handle errors early - Call clk_prepare_enable() on the 'rtc' clock before calling clk_get_rate() - Use the -msec suffix for the OF properties that deal with time - Use of_property_read_32() instead of device_property_read_u32() v3: Replace the -msec suffix by -ms diff --git a/drivers/rtc/rtc-jz4740.c b/drivers/rtc/rtc-jz4740.c index 4213554..3f9d0da 100644 --- a/drivers/rtc/rtc-jz4740.c +++ b/drivers/rtc/rtc-jz4740.c @@ -14,11 +14,13 @@ * */ +#include <linux/clk.h> #include <linux/io.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/of_device.h> #include <linux/platform_device.h> +#include <linux/reboot.h> #include <linux/rtc.h> #include <linux/slab.h> #include <linux/spinlock.h> @@ -28,6 +30,8 @@ #define JZ_REG_RTC_SEC_ALARM 0x08 #define JZ_REG_RTC_REGULATOR 0x0C #define JZ_REG_RTC_HIBERNATE 0x20 +#define JZ_REG_RTC_WAKEUP_FILTER 0x24 +#define JZ_REG_RTC_RESET_COUNTER 0x28 #define JZ_REG_RTC_SCRATCHPAD 0x34 /* The following are present on the jz4780 */ @@ -45,6 +49,9 @@ /* Magic value to enable writes on jz4780 */ #define JZ_RTC_WENR_MAGIC 0xA55A +#define JZ_RTC_WAKEUP_FILTER_MASK 0x0000FFE0 +#define JZ_RTC_RESET_COUNTER_MASK 0x00000FE0 + enum jz4740_rtc_type { ID_JZ4740, ID_JZ4780, @@ -55,12 +62,18 @@ struct jz4740_rtc { enum jz4740_rtc_type type; struct rtc_device *rtc; + struct clk *clk; int irq; spinlock_t lock; + + unsigned int min_wakeup_pin_assert_time; + unsigned int reset_pin_assert_time; }; +static struct device *dev_for_power_off; + static inline uint32_t jz4740_rtc_reg_read(struct jz4740_rtc *rtc, size_t reg) { return readl(rtc->base + reg); @@ -246,6 +259,46 @@ void jz4740_rtc_poweroff(struct device *dev) } EXPORT_SYMBOL_GPL(jz4740_rtc_poweroff); +static void jz4740_rtc_power_off(void) +{ + struct jz4740_rtc *rtc = dev_get_drvdata(dev_for_power_off); + unsigned long rtc_rate; + unsigned long wakeup_filter_ticks; + unsigned long reset_counter_ticks; + + clk_prepare_enable(rtc->clk); + + rtc_rate = clk_get_rate(rtc->clk); + + /* + * Set minimum wakeup pin assertion time: 100 ms. + * Range is 0 to 2 sec if RTC is clocked at 32 kHz. + */ + wakeup_filter_ticks = + (rtc->min_wakeup_pin_assert_time * rtc_rate) / 1000; + if (wakeup_filter_ticks < JZ_RTC_WAKEUP_FILTER_MASK) + wakeup_filter_ticks &= JZ_RTC_WAKEUP_FILTER_MASK; + else + wakeup_filter_ticks = JZ_RTC_WAKEUP_FILTER_MASK; + jz4740_rtc_reg_write(rtc, + JZ_REG_RTC_WAKEUP_FILTER, wakeup_filter_ticks); + + /* + * Set reset pin low-level assertion time after wakeup: 60 ms. + * Range is 0 to 125 ms if RTC is clocked at 32 kHz. + */ + reset_counter_ticks = (rtc->reset_pin_assert_time * rtc_rate) / 1000; + if (reset_counter_ticks < JZ_RTC_RESET_COUNTER_MASK) + reset_counter_ticks &= JZ_RTC_RESET_COUNTER_MASK; + else + reset_counter_ticks = JZ_RTC_RESET_COUNTER_MASK; + jz4740_rtc_reg_write(rtc, + JZ_REG_RTC_RESET_COUNTER, reset_counter_ticks); + + jz4740_rtc_poweroff(dev_for_power_off); + machine_halt(); +} + static const struct of_device_id jz4740_rtc_of_match[] = { { .compatible = "ingenic,jz4740-rtc", .data = (void *) ID_JZ4740 }, { .compatible = "ingenic,jz4780-rtc", .data = (void *) ID_JZ4780 }, @@ -262,6 +315,7 @@ static int jz4740_rtc_probe(struct platform_device *pdev) const struct platform_device_id *id = platform_get_device_id(pdev); const struct of_device_id *of_id = of_match_device( jz4740_rtc_of_match, &pdev->dev); + struct device_node *np = pdev->dev.of_node; rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); if (!rtc) @@ -283,6 +337,12 @@ static int jz4740_rtc_probe(struct platform_device *pdev) if (IS_ERR(rtc->base)) return PTR_ERR(rtc->base); + rtc->clk = devm_clk_get(&pdev->dev, "rtc"); + if (IS_ERR(rtc->clk)) { + dev_err(&pdev->dev, "Failed to get RTC clock\n"); + return PTR_ERR(rtc->clk); + } + spin_lock_init(&rtc->lock); platform_set_drvdata(pdev, rtc); @@ -314,6 +374,27 @@ static int jz4740_rtc_probe(struct platform_device *pdev) } } + if (np && of_device_is_system_power_controller(np)) { + if (!pm_power_off) { + /* Default: 60ms */ + rtc->reset_pin_assert_time = 60; + of_property_read_u32(np, "reset-pin-assert-time-ms", + &rtc->reset_pin_assert_time); + + /* Default: 100ms */ + rtc->min_wakeup_pin_assert_time = 100; + of_property_read_u32(np, + "min-wakeup-pin-assert-time-ms", + &rtc->min_wakeup_pin_assert_time); + + dev_for_power_off = &pdev->dev; + pm_power_off = jz4740_rtc_power_off; + } else { + dev_warn(&pdev->dev, + "Poweroff handler already present!\n"); + } + } + return 0; } -- 2.9.3 ^ permalink raw reply related [flat|nested] 20+ messages in thread
end of thread, other threads:[~2016-11-04 23:08 UTC | newest] Thread overview: 20+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-10-30 23:02 [PATCH v2 0/7] DT bindings for the jz4740-rtc driver Paul Cercueil [not found] ` <20161030230247.20538-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-30 23:02 ` [PATCH v2 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC Paul Cercueil 2016-10-30 23:02 ` [PATCH v2 2/7] Documentation: dt: Add binding info for jz4740-rtc driver Paul Cercueil [not found] ` <20161030230247.20538-3-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-31 6:39 ` Rob Herring 2016-10-31 9:48 ` Sergei Shtylyov 2016-10-30 23:02 ` [PATCH v2 3/7] rtc: rtc-jz4740: Add support for devicetree Paul Cercueil 2016-10-30 23:02 ` [PATCH v2 4/7] rtc: jz4740_rtc: Add support for acting as the system power controller Paul Cercueil 2016-10-30 23:02 ` [PATCH v2 5/7] MIPS: jz4740: DTS: Probe the jz4740-rtc driver from devicetree Paul Cercueil [not found] ` <20161030230247.20538-6-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-31 9:50 ` Sergei Shtylyov 2016-10-30 23:02 ` [PATCH v2 6/7] MIPS: qi_lb60: Probe RTC driver from DT and use it as power controller Paul Cercueil 2016-10-30 23:02 ` [PATCH v2 7/7] MIPS: jz4740: Remove obsolete code Paul Cercueil 2016-10-31 20:39 ` [PATCH v3 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC Paul Cercueil [not found] ` <20161031203951.5444-1-paul-icTtO2rgO2OTuSrc4Mpeew@public.gmane.org> 2016-10-31 20:39 ` [PATCH v3 2/7] Documentation: dt: Add binding info for jz4740-rtc driver Paul Cercueil 2016-10-31 21:16 ` Rob Herring 2016-10-31 20:39 ` [PATCH v3 3/7] rtc: rtc-jz4740: Add support for devicetree Paul Cercueil 2016-10-31 20:39 ` [PATCH v3 5/7] MIPS: jz4740: DTS: Probe the jz4740-rtc driver from devicetree Paul Cercueil 2016-10-31 20:39 ` [PATCH v3 6/7] MIPS: qi_lb60: Probe RTC driver from DT and use it as power controller Paul Cercueil 2016-10-31 20:39 ` [PATCH v3 7/7] MIPS: jz4740: Remove obsolete code Paul Cercueil 2016-11-04 23:08 ` [PATCH v3 1/7] rtc: rtc-jz4740: Add support for the RTC in the jz4780 SoC Alexandre Belloni 2016-10-31 20:39 ` [PATCH v3 4/7] rtc: jz4740_rtc: Add support for acting as the system power controller Paul Cercueil
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).