rtc-amlogic-a4.c (c89ac9182ee297597f1c6971045382bae19c3f9d) rtc-amlogic-a4.c (eb4ffa40010472dffdc276da307161545aab45a3)
1// SPDX-License-Identifier: (GPL-2.0-only OR MIT)
2/*
3 * Copyright (C) 2024 Amlogic, Inc. All rights reserved
4 * Author: Yiting Deng <yiting.deng@amlogic.com>
5 */
6
7#include <linux/bitfield.h>
8#include <linux/clk.h>

--- 88 unchanged lines hidden (view full) ---

97}
98
99static int aml_rtc_read_time(struct device *dev, struct rtc_time *tm)
100{
101 struct aml_rtc_data *rtc = dev_get_drvdata(dev);
102 u32 time_sec;
103
104 /* if RTC disabled, read time failed */
1// SPDX-License-Identifier: (GPL-2.0-only OR MIT)
2/*
3 * Copyright (C) 2024 Amlogic, Inc. All rights reserved
4 * Author: Yiting Deng <yiting.deng@amlogic.com>
5 */
6
7#include <linux/bitfield.h>
8#include <linux/clk.h>

--- 88 unchanged lines hidden (view full) ---

97}
98
99static int aml_rtc_read_time(struct device *dev, struct rtc_time *tm)
100{
101 struct aml_rtc_data *rtc = dev_get_drvdata(dev);
102 u32 time_sec;
103
104 /* if RTC disabled, read time failed */
105 if (!rtc->rtc_enabled) {
106 dev_err(dev, "RTC disabled, read time failed\n");
105 if (!rtc->rtc_enabled)
107 return -EINVAL;
106 return -EINVAL;
108 }
109
110 regmap_read(rtc->map, RTC_REAL_TIME, &time_sec);
111 if (rtc->config->gray_stored)
112 time_sec = gray_to_binary(time_sec);
113 rtc_time64_to_tm(time_sec, tm);
114 dev_dbg(dev, "%s: read time = %us\n", __func__, time_sec);
115
116 return 0;

--- 23 unchanged lines hidden (view full) ---

140}
141
142static int aml_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
143{
144 struct aml_rtc_data *rtc = dev_get_drvdata(dev);
145 time64_t alarm_sec;
146
147 /* if RTC disabled, set alarm failed */
107
108 regmap_read(rtc->map, RTC_REAL_TIME, &time_sec);
109 if (rtc->config->gray_stored)
110 time_sec = gray_to_binary(time_sec);
111 rtc_time64_to_tm(time_sec, tm);
112 dev_dbg(dev, "%s: read time = %us\n", __func__, time_sec);
113
114 return 0;

--- 23 unchanged lines hidden (view full) ---

138}
139
140static int aml_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
141{
142 struct aml_rtc_data *rtc = dev_get_drvdata(dev);
143 time64_t alarm_sec;
144
145 /* if RTC disabled, set alarm failed */
148 if (!rtc->rtc_enabled) {
149 dev_err(dev, "RTC disabled, set alarm failed\n");
146 if (!rtc->rtc_enabled)
150 return -EINVAL;
147 return -EINVAL;
151 }
152
153 regmap_update_bits(rtc->map, RTC_CTRL,
154 RTC_ALRM0_EN, RTC_ALRM0_EN);
155 regmap_update_bits(rtc->map, RTC_INT_MASK,
156 RTC_ALRM0_IRQ_MSK, 0);
157
158 alarm_sec = rtc_tm_to_time64(&alarm->time);
159 if (rtc->config->gray_stored)

--- 9 unchanged lines hidden (view full) ---

169static int aml_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
170{
171 struct aml_rtc_data *rtc = dev_get_drvdata(dev);
172 u32 alarm_sec;
173 int alarm_enable;
174 int alarm_mask;
175
176 /* if RTC disabled, read alarm failed */
148
149 regmap_update_bits(rtc->map, RTC_CTRL,
150 RTC_ALRM0_EN, RTC_ALRM0_EN);
151 regmap_update_bits(rtc->map, RTC_INT_MASK,
152 RTC_ALRM0_IRQ_MSK, 0);
153
154 alarm_sec = rtc_tm_to_time64(&alarm->time);
155 if (rtc->config->gray_stored)

--- 9 unchanged lines hidden (view full) ---

165static int aml_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
166{
167 struct aml_rtc_data *rtc = dev_get_drvdata(dev);
168 u32 alarm_sec;
169 int alarm_enable;
170 int alarm_mask;
171
172 /* if RTC disabled, read alarm failed */
177 if (!rtc->rtc_enabled) {
178 dev_err(dev, "RTC disabled, read alarm failed\n");
173 if (!rtc->rtc_enabled)
179 return -EINVAL;
174 return -EINVAL;
180 }
181
182 regmap_read(rtc->map, RTC_ALARM0_REG, &alarm_sec);
183 if (rtc->config->gray_stored)
184 alarm_sec = gray_to_binary(alarm_sec);
185 rtc_time64_to_tm(alarm_sec, &alarm->time);
186
187 alarm_enable = regmap_test_bits(rtc->map, RTC_CTRL, RTC_ALRM0_EN);
188 alarm_mask = regmap_test_bits(rtc->map, RTC_INT_MASK, RTC_ALRM0_IRQ_MSK);

--- 7 unchanged lines hidden (view full) ---

196static int aml_rtc_read_offset(struct device *dev, long *offset)
197{
198 struct aml_rtc_data *rtc = dev_get_drvdata(dev);
199 u32 reg_val;
200 long val;
201 int sign, match_counter, enable;
202
203 /* if RTC disabled, read offset failed */
175
176 regmap_read(rtc->map, RTC_ALARM0_REG, &alarm_sec);
177 if (rtc->config->gray_stored)
178 alarm_sec = gray_to_binary(alarm_sec);
179 rtc_time64_to_tm(alarm_sec, &alarm->time);
180
181 alarm_enable = regmap_test_bits(rtc->map, RTC_CTRL, RTC_ALRM0_EN);
182 alarm_mask = regmap_test_bits(rtc->map, RTC_INT_MASK, RTC_ALRM0_IRQ_MSK);

--- 7 unchanged lines hidden (view full) ---

190static int aml_rtc_read_offset(struct device *dev, long *offset)
191{
192 struct aml_rtc_data *rtc = dev_get_drvdata(dev);
193 u32 reg_val;
194 long val;
195 int sign, match_counter, enable;
196
197 /* if RTC disabled, read offset failed */
204 if (!rtc->rtc_enabled) {
205 dev_err(dev, "RTC disabled, read offset failed\n");
198 if (!rtc->rtc_enabled)
206 return -EINVAL;
199 return -EINVAL;
207 }
208
209 regmap_read(rtc->map, RTC_SEC_ADJUST_REG, &reg_val);
210 enable = FIELD_GET(RTC_ADJ_VALID, reg_val);
211 if (!enable) {
212 val = 0;
213 } else {
214 sign = FIELD_GET(RTC_SEC_ADJUST_CTRL, reg_val);
215 match_counter = FIELD_GET(RTC_MATCH_COUNTER, reg_val);

--- 10 unchanged lines hidden (view full) ---

226{
227 struct aml_rtc_data *rtc = dev_get_drvdata(dev);
228 int sign = 0;
229 int match_counter = 0;
230 int enable = 0;
231 u32 reg_val;
232
233 /* if RTC disabled, set offset failed */
200
201 regmap_read(rtc->map, RTC_SEC_ADJUST_REG, &reg_val);
202 enable = FIELD_GET(RTC_ADJ_VALID, reg_val);
203 if (!enable) {
204 val = 0;
205 } else {
206 sign = FIELD_GET(RTC_SEC_ADJUST_CTRL, reg_val);
207 match_counter = FIELD_GET(RTC_MATCH_COUNTER, reg_val);

--- 10 unchanged lines hidden (view full) ---

218{
219 struct aml_rtc_data *rtc = dev_get_drvdata(dev);
220 int sign = 0;
221 int match_counter = 0;
222 int enable = 0;
223 u32 reg_val;
224
225 /* if RTC disabled, set offset failed */
234 if (!rtc->rtc_enabled) {
235 dev_err(dev, "RTC disabled, set offset failed\n");
226 if (!rtc->rtc_enabled)
236 return -EINVAL;
227 return -EINVAL;
237 }
238
239 if (offset) {
240 enable = 1;
241 sign = offset < 0 ? RTC_SWALLOW_SECOND : RTC_INSERT_SECOND;
242 match_counter = 1000000000 / abs(offset) - 1;
243 if (match_counter < 0 || match_counter > RTC_MATCH_COUNTER)
244 return -EINVAL;
245 }

--- 229 unchanged lines hidden ---
228
229 if (offset) {
230 enable = 1;
231 sign = offset < 0 ? RTC_SWALLOW_SECOND : RTC_INSERT_SECOND;
232 match_counter = 1000000000 / abs(offset) - 1;
233 if (match_counter < 0 || match_counter > RTC_MATCH_COUNTER)
234 return -EINVAL;
235 }

--- 229 unchanged lines hidden ---