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, ®_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, ®_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 --- |