7
7
#include <linux/bcd.h>
8
8
#include <linux/bitfield.h>
9
9
#include <linux/clk.h>
10
+ #include <linux/clk-provider.h>
10
11
#include <linux/errno.h>
11
12
#include <linux/iopoll.h>
12
13
#include <linux/ioport.h>
45
46
#define STM32_RTC_CR_FMT BIT(6)
46
47
#define STM32_RTC_CR_ALRAE BIT(8)
47
48
#define STM32_RTC_CR_ALRAIE BIT(12)
49
+ #define STM32_RTC_CR_OSEL GENMASK(22, 21)
50
+ #define STM32_RTC_CR_COE BIT(23)
51
+ #define STM32_RTC_CR_TAMPOE BIT(26)
52
+ #define STM32_RTC_CR_OUT2EN BIT(31)
48
53
49
54
/* STM32_RTC_ISR/STM32_RTC_ICSR bit fields */
50
55
#define STM32_RTC_ISR_ALRAWF BIT(0)
81
86
/* STM32_RTC_SR/_SCR bit fields */
82
87
#define STM32_RTC_SR_ALRA BIT(0)
83
88
89
+ /* STM32_RTC_CFGR bit fields */
90
+ #define STM32_RTC_CFGR_OUT2_RMP BIT(0)
91
+ #define STM32_RTC_CFGR_LSCOEN GENMASK(2, 1)
92
+ #define STM32_RTC_CFGR_LSCOEN_OUT1 1
93
+ #define STM32_RTC_CFGR_LSCOEN_OUT2_RMP 2
94
+
84
95
/* STM32_RTC_VERR bit fields */
85
96
#define STM32_RTC_VERR_MINREV_SHIFT 0
86
97
#define STM32_RTC_VERR_MINREV GENMASK(3, 0)
@@ -130,6 +141,7 @@ struct stm32_rtc_registers {
130
141
u16 wpr ;
131
142
u16 sr ;
132
143
u16 scr ;
144
+ u16 cfgr ;
133
145
u16 verr ;
134
146
};
135
147
@@ -145,6 +157,7 @@ struct stm32_rtc_data {
145
157
bool need_dbp ;
146
158
bool need_accuracy ;
147
159
bool rif_protected ;
160
+ bool has_lsco ;
148
161
};
149
162
150
163
struct stm32_rtc {
@@ -157,6 +170,7 @@ struct stm32_rtc {
157
170
struct clk * rtc_ck ;
158
171
const struct stm32_rtc_data * data ;
159
172
int irq_alarm ;
173
+ struct clk * clk_lsco ;
160
174
};
161
175
162
176
struct stm32_rtc_rif_resource {
@@ -231,7 +245,68 @@ struct stm32_rtc_pinmux_func {
231
245
int (* action )(struct pinctrl_dev * pctl_dev , unsigned int pin );
232
246
};
233
247
248
+ static int stm32_rtc_pinmux_lsco_available (struct pinctrl_dev * pctldev , unsigned int pin )
249
+ {
250
+ struct stm32_rtc * rtc = pinctrl_dev_get_drvdata (pctldev );
251
+ struct stm32_rtc_registers regs = rtc -> data -> regs ;
252
+ unsigned int cr = readl_relaxed (rtc -> base + regs .cr );
253
+ unsigned int cfgr = readl_relaxed (rtc -> base + regs .cfgr );
254
+ unsigned int calib = STM32_RTC_CR_COE ;
255
+ unsigned int tampalrm = STM32_RTC_CR_TAMPOE | STM32_RTC_CR_OSEL ;
256
+
257
+ switch (pin ) {
258
+ case OUT1 :
259
+ if ((!(cr & STM32_RTC_CR_OUT2EN ) &&
260
+ ((cr & calib ) || cr & tampalrm )) ||
261
+ ((cr & calib ) && (cr & tampalrm )))
262
+ return - EBUSY ;
263
+ break ;
264
+ case OUT2_RMP :
265
+ if ((cr & STM32_RTC_CR_OUT2EN ) &&
266
+ (cfgr & STM32_RTC_CFGR_OUT2_RMP ) &&
267
+ ((cr & calib ) || (cr & tampalrm )))
268
+ return - EBUSY ;
269
+ break ;
270
+ default :
271
+ return - EINVAL ;
272
+ }
273
+
274
+ if (clk_get_rate (rtc -> rtc_ck ) != 32768 )
275
+ return - ERANGE ;
276
+
277
+ return 0 ;
278
+ }
279
+
280
+ static int stm32_rtc_pinmux_action_lsco (struct pinctrl_dev * pctldev , unsigned int pin )
281
+ {
282
+ struct stm32_rtc * rtc = pinctrl_dev_get_drvdata (pctldev );
283
+ struct stm32_rtc_registers regs = rtc -> data -> regs ;
284
+ struct device * dev = rtc -> rtc_dev -> dev .parent ;
285
+ u8 lscoen ;
286
+ int ret ;
287
+
288
+ if (!rtc -> data -> has_lsco )
289
+ return - EPERM ;
290
+
291
+ ret = stm32_rtc_pinmux_lsco_available (pctldev , pin );
292
+ if (ret )
293
+ return ret ;
294
+
295
+ lscoen = (pin == OUT1 ) ? STM32_RTC_CFGR_LSCOEN_OUT1 : STM32_RTC_CFGR_LSCOEN_OUT2_RMP ;
296
+
297
+ rtc -> clk_lsco = clk_register_gate (dev , "rtc_lsco" , __clk_get_name (rtc -> rtc_ck ),
298
+ CLK_IGNORE_UNUSED | CLK_IS_CRITICAL ,
299
+ rtc -> base + regs .cfgr , lscoen , 0 , NULL );
300
+ if (IS_ERR (rtc -> clk_lsco ))
301
+ return PTR_ERR (rtc -> clk_lsco );
302
+
303
+ of_clk_add_provider (dev -> of_node , of_clk_src_simple_get , rtc -> clk_lsco );
304
+
305
+ return 0 ;
306
+ }
307
+
234
308
static const struct stm32_rtc_pinmux_func stm32_rtc_pinmux_functions [] = {
309
+ STM32_RTC_PINMUX ("lsco" , & stm32_rtc_pinmux_action_lsco , "out1" , "out2_rmp" ),
235
310
};
236
311
237
312
static int stm32_rtc_pinmux_get_functions_count (struct pinctrl_dev * pctldev )
@@ -687,6 +762,7 @@ static const struct stm32_rtc_data stm32_rtc_data = {
687
762
.need_dbp = true,
688
763
.need_accuracy = false,
689
764
.rif_protected = false,
765
+ .has_lsco = false,
690
766
.regs = {
691
767
.tr = 0x00 ,
692
768
.dr = 0x04 ,
@@ -697,6 +773,7 @@ static const struct stm32_rtc_data stm32_rtc_data = {
697
773
.wpr = 0x24 ,
698
774
.sr = 0x0C , /* set to ISR offset to ease alarm management */
699
775
.scr = UNDEF_REG ,
776
+ .cfgr = UNDEF_REG ,
700
777
.verr = UNDEF_REG ,
701
778
},
702
779
.events = {
@@ -710,6 +787,7 @@ static const struct stm32_rtc_data stm32h7_rtc_data = {
710
787
.need_dbp = true,
711
788
.need_accuracy = false,
712
789
.rif_protected = false,
790
+ .has_lsco = false,
713
791
.regs = {
714
792
.tr = 0x00 ,
715
793
.dr = 0x04 ,
@@ -720,6 +798,7 @@ static const struct stm32_rtc_data stm32h7_rtc_data = {
720
798
.wpr = 0x24 ,
721
799
.sr = 0x0C , /* set to ISR offset to ease alarm management */
722
800
.scr = UNDEF_REG ,
801
+ .cfgr = UNDEF_REG ,
723
802
.verr = UNDEF_REG ,
724
803
},
725
804
.events = {
@@ -742,6 +821,7 @@ static const struct stm32_rtc_data stm32mp1_data = {
742
821
.need_dbp = false,
743
822
.need_accuracy = true,
744
823
.rif_protected = false,
824
+ .has_lsco = true,
745
825
.regs = {
746
826
.tr = 0x00 ,
747
827
.dr = 0x04 ,
@@ -752,6 +832,7 @@ static const struct stm32_rtc_data stm32mp1_data = {
752
832
.wpr = 0x24 ,
753
833
.sr = 0x50 ,
754
834
.scr = 0x5C ,
835
+ .cfgr = 0x60 ,
755
836
.verr = 0x3F4 ,
756
837
},
757
838
.events = {
@@ -765,6 +846,7 @@ static const struct stm32_rtc_data stm32mp25_data = {
765
846
.need_dbp = false,
766
847
.need_accuracy = true,
767
848
.rif_protected = true,
849
+ .has_lsco = true,
768
850
.regs = {
769
851
.tr = 0x00 ,
770
852
.dr = 0x04 ,
@@ -775,6 +857,7 @@ static const struct stm32_rtc_data stm32mp25_data = {
775
857
.wpr = 0x24 ,
776
858
.sr = 0x50 ,
777
859
.scr = 0x5C ,
860
+ .cfgr = 0x60 ,
778
861
.verr = 0x3F4 ,
779
862
},
780
863
.events = {
@@ -792,6 +875,19 @@ static const struct of_device_id stm32_rtc_of_match[] = {
792
875
};
793
876
MODULE_DEVICE_TABLE (of , stm32_rtc_of_match );
794
877
878
+ static void stm32_rtc_clean_outs (struct stm32_rtc * rtc )
879
+ {
880
+ struct stm32_rtc_registers regs = rtc -> data -> regs ;
881
+
882
+ if (regs .cfgr != UNDEF_REG ) {
883
+ unsigned int cfgr = readl_relaxed (rtc -> base + regs .cfgr );
884
+
885
+ cfgr &= ~STM32_RTC_CFGR_LSCOEN ;
886
+ cfgr &= ~STM32_RTC_CFGR_OUT2_RMP ;
887
+ writel_relaxed (cfgr , rtc -> base + regs .cfgr );
888
+ }
889
+ }
890
+
795
891
static int stm32_rtc_check_rif (struct stm32_rtc * stm32_rtc ,
796
892
struct stm32_rtc_rif_resource res )
797
893
{
@@ -1024,6 +1120,8 @@ static int stm32_rtc_probe(struct platform_device *pdev)
1024
1120
goto err ;
1025
1121
}
1026
1122
1123
+ stm32_rtc_clean_outs (rtc );
1124
+
1027
1125
ret = devm_pinctrl_register_and_init (& pdev -> dev , & stm32_rtc_pdesc , rtc , & pctl );
1028
1126
if (ret )
1029
1127
return dev_err_probe (& pdev -> dev , ret , "pinctrl register failed" );
@@ -1070,6 +1168,9 @@ static void stm32_rtc_remove(struct platform_device *pdev)
1070
1168
const struct stm32_rtc_registers * regs = & rtc -> data -> regs ;
1071
1169
unsigned int cr ;
1072
1170
1171
+ if (!IS_ERR_OR_NULL (rtc -> clk_lsco ))
1172
+ clk_unregister_gate (rtc -> clk_lsco );
1173
+
1073
1174
/* Disable interrupts */
1074
1175
stm32_rtc_wpr_unlock (rtc );
1075
1176
cr = readl_relaxed (rtc -> base + regs -> cr );
0 commit comments