69 lines
2.5 KiB
Diff
69 lines
2.5 KiB
Diff
|
From 4b8894829753da0821970e0679e77a02b85186dd Mon Sep 17 00:00:00 2001
|
||
|
From: Andre Przywara <andre.przywara@arm.com>
|
||
|
Date: Mon, 14 Jun 2021 23:02:45 +0100
|
||
|
Subject: [PATCH] drv:rtc:sun6i: support RTCs without external LOSCs
|
||
|
|
||
|
Some newer Allwinner RTCs (for instance the one in the H616 SoC) lack
|
||
|
a pin for an external 32768 Hz oscillator. As a consequence, this LOSC
|
||
|
can't be selected as the RTC clock source, and we must rely on the
|
||
|
internal RC oscillator.
|
||
|
To allow additions of clocks to the RTC node, add a feature bit to ignore
|
||
|
any provided clocks for now (the current code would think this is the
|
||
|
external LOSC). Later DTs and code can then for instance add the PLL
|
||
|
based clock input, and older kernel won't get confused.
|
||
|
|
||
|
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||
|
Acked-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||
|
---
|
||
|
drivers/rtc/rtc-sun6i.c | 16 +++++++++++-----
|
||
|
1 file changed, 11 insertions(+), 5 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c
|
||
|
index e4db445b7..055d2503c 100644
|
||
|
--- a/drivers/rtc/rtc-sun6i.c
|
||
|
+++ b/drivers/rtc/rtc-sun6i.c
|
||
|
@@ -138,6 +138,7 @@ struct sun6i_rtc_clk_data {
|
||
|
unsigned int has_out_clk : 1;
|
||
|
unsigned int has_losc_en : 1;
|
||
|
unsigned int has_auto_swt : 1;
|
||
|
+ unsigned int no_ext_losc : 1;
|
||
|
};
|
||
|
|
||
|
#define RTC_LINEAR_DAY BIT(0)
|
||
|
@@ -260,7 +261,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
|
||
|
}
|
||
|
|
||
|
/* Switch to the external, more precise, oscillator, if present */
|
||
|
- if (of_get_property(node, "clocks", NULL)) {
|
||
|
+ if (!rtc->data->no_ext_losc && of_get_property(node, "clocks", NULL)) {
|
||
|
reg |= SUN6I_LOSC_CTRL_EXT_OSC;
|
||
|
if (rtc->data->has_losc_en)
|
||
|
reg |= SUN6I_LOSC_CTRL_EXT_LOSC_EN;
|
||
|
@@ -284,14 +285,19 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
|
||
|
}
|
||
|
|
||
|
parents[0] = clk_hw_get_name(rtc->int_osc);
|
||
|
- /* If there is no external oscillator, this will be NULL and ... */
|
||
|
- parents[1] = of_clk_get_parent_name(node, 0);
|
||
|
+ if (rtc->data->no_ext_losc) {
|
||
|
+ parents[1] = NULL;
|
||
|
+ init.num_parents = 1;
|
||
|
+ } else {
|
||
|
+ /* If there is no external oscillator, this will be NULL and */
|
||
|
+ parents[1] = of_clk_get_parent_name(node, 0);
|
||
|
+ /* ... number of clock parents will be 1. */
|
||
|
+ init.num_parents = of_clk_get_parent_count(node) + 1;
|
||
|
+ }
|
||
|
|
||
|
rtc->hw.init = &init;
|
||
|
|
||
|
init.parent_names = parents;
|
||
|
- /* ... number of clock parents will be 1. */
|
||
|
- init.num_parents = of_clk_get_parent_count(node) + 1;
|
||
|
of_property_read_string_index(node, "clock-output-names", 0,
|
||
|
&init.name);
|
||
|
|
||
|
--
|
||
|
2.34.1
|
||
|
|