15
15
#include <zephyr/devicetree.h>
16
16
#include <zephyr/drivers/rtc.h>
17
17
#include <zephyr/sys/sys_io.h>
18
-
19
- #define RTC_STD_INDEX (DT_INST_REG_ADDR_BY_IDX(0, 0))
20
- #define RTC_STD_TARGET (DT_INST_REG_ADDR_BY_IDX(0, 1))
18
+ #include <zephyr/drivers/mfd/mc146818.h>
21
19
22
20
/* Time indices in RTC RAM */
23
21
#define RTC_SEC 0x00
@@ -127,21 +125,9 @@ struct rtc_mc146818_data {
127
125
void * update_cb_data ;
128
126
};
129
127
130
- static uint8_t rtc_read (int reg )
131
- {
132
- uint8_t value ;
133
-
134
- sys_out8 (reg , RTC_STD_INDEX );
135
- value = sys_in8 (RTC_STD_TARGET );
136
-
137
- return value ;
138
- }
139
-
140
- static void rtc_write (int reg , uint8_t value )
141
- {
142
- sys_out8 (reg , RTC_STD_INDEX );
143
- sys_out8 (value , RTC_STD_TARGET );
144
- }
128
+ struct rtc_mc146818_config {
129
+ const struct device * mfd ;
130
+ };
145
131
146
132
static bool rtc_mc146818_validate_time (const struct rtc_time * timeptr )
147
133
{
@@ -172,6 +158,7 @@ static bool rtc_mc146818_validate_time(const struct rtc_time *timeptr)
172
158
static int rtc_mc146818_set_time (const struct device * dev , const struct rtc_time * timeptr )
173
159
{
174
160
struct rtc_mc146818_data * const dev_data = dev -> data ;
161
+ const struct rtc_mc146818_config * config = dev -> config ;
175
162
uint8_t value ;
176
163
int year ;
177
164
int cent ;
@@ -190,23 +177,23 @@ static int rtc_mc146818_set_time(const struct device *dev, const struct rtc_time
190
177
goto out ;
191
178
}
192
179
193
- value = rtc_read ( RTC_DATA );
194
- rtc_write ( RTC_DATA , value | RTC_UCI_BIT );
180
+ value = mfd_mc146818_std_read ( config -> mfd , RTC_DATA );
181
+ mfd_mc146818_std_write ( config -> mfd , RTC_DATA , value | RTC_UCI_BIT );
195
182
196
183
year = (1900 + timeptr -> tm_year ) % 100 ;
197
184
cent = (1900 + timeptr -> tm_year ) / 100 ;
198
185
199
- rtc_write ( RTC_SEC , (uint8_t )timeptr -> tm_sec );
200
- rtc_write ( RTC_MIN , (uint8_t )timeptr -> tm_min );
201
- rtc_write ( RTC_HOUR , (uint8_t )timeptr -> tm_hour );
202
- rtc_write ( RTC_WDAY , (uint8_t )timeptr -> tm_wday );
203
- rtc_write ( RTC_MDAY , (uint8_t )timeptr -> tm_mday );
204
- rtc_write ( RTC_MONTH , (uint8_t )timeptr -> tm_mon + 1 );
205
- rtc_write ( RTC_YEAR , year );
206
- rtc_write ( RTC_CENTURY , cent );
186
+ mfd_mc146818_std_write ( config -> mfd , RTC_SEC , (uint8_t )timeptr -> tm_sec );
187
+ mfd_mc146818_std_write ( config -> mfd , RTC_MIN , (uint8_t )timeptr -> tm_min );
188
+ mfd_mc146818_std_write ( config -> mfd , RTC_HOUR , (uint8_t )timeptr -> tm_hour );
189
+ mfd_mc146818_std_write ( config -> mfd , RTC_WDAY , (uint8_t )timeptr -> tm_wday );
190
+ mfd_mc146818_std_write ( config -> mfd , RTC_MDAY , (uint8_t )timeptr -> tm_mday );
191
+ mfd_mc146818_std_write ( config -> mfd , RTC_MONTH , (uint8_t )timeptr -> tm_mon + 1 );
192
+ mfd_mc146818_std_write ( config -> mfd , RTC_YEAR , year );
193
+ mfd_mc146818_std_write ( config -> mfd , RTC_CENTURY , cent );
207
194
208
195
value &= (~RTC_UCI_BIT );
209
- rtc_write ( RTC_DATA , value );
196
+ mfd_mc146818_std_write ( config -> mfd , RTC_DATA , value );
210
197
ret = 0 ;
211
198
out :
212
199
k_spin_unlock (& dev_data -> lock , key );
@@ -216,6 +203,7 @@ static int rtc_mc146818_set_time(const struct device *dev, const struct rtc_time
216
203
static int rtc_mc146818_get_time (const struct device * dev , struct rtc_time * timeptr )
217
204
{
218
205
struct rtc_mc146818_data * const dev_data = dev -> data ;
206
+ const struct rtc_mc146818_config * config = dev -> config ;
219
207
int ret ;
220
208
uint8_t cent ;
221
209
uint8_t year ;
@@ -229,29 +217,29 @@ static int rtc_mc146818_get_time(const struct device *dev, struct rtc_time *tim
229
217
goto out ;
230
218
}
231
219
232
- if (!(rtc_read ( RTC_REG_D ) & RTC_VRT_BIT )) {
220
+ if (!(mfd_mc146818_std_read ( config -> mfd , RTC_REG_D ) & RTC_VRT_BIT )) {
233
221
ret = - ENODATA ;
234
222
goto out ;
235
223
}
236
224
237
- while (rtc_read ( RTC_UIP ) & RTC_UIP_BIT ) {
225
+ while (mfd_mc146818_std_read ( config -> mfd , RTC_UIP ) & RTC_UIP_BIT ) {
238
226
continue ;
239
227
}
240
228
241
- cent = rtc_read ( RTC_CENTURY );
242
- year = rtc_read ( RTC_YEAR );
243
- timeptr -> tm_mon = rtc_read ( RTC_MONTH ) - 1 ;
244
- timeptr -> tm_mday = rtc_read ( RTC_MDAY );
245
- timeptr -> tm_wday = rtc_read ( RTC_WDAY ) - 1 ;
246
- timeptr -> tm_hour = rtc_read ( RTC_HOUR );
247
- timeptr -> tm_min = rtc_read ( RTC_MIN );
248
- timeptr -> tm_sec = rtc_read ( RTC_SEC );
229
+ cent = mfd_mc146818_std_read ( config -> mfd , RTC_CENTURY );
230
+ year = mfd_mc146818_std_read ( config -> mfd , RTC_YEAR );
231
+ timeptr -> tm_mon = mfd_mc146818_std_read ( config -> mfd , RTC_MONTH ) - 1 ;
232
+ timeptr -> tm_mday = mfd_mc146818_std_read ( config -> mfd , RTC_MDAY );
233
+ timeptr -> tm_wday = mfd_mc146818_std_read ( config -> mfd , RTC_WDAY ) - 1 ;
234
+ timeptr -> tm_hour = mfd_mc146818_std_read ( config -> mfd , RTC_HOUR );
235
+ timeptr -> tm_min = mfd_mc146818_std_read ( config -> mfd , RTC_MIN );
236
+ timeptr -> tm_sec = mfd_mc146818_std_read ( config -> mfd , RTC_SEC );
249
237
250
238
timeptr -> tm_year = 100 * (int )cent + year - 1900 ;
251
239
252
240
timeptr -> tm_nsec = 0 ;
253
241
timeptr -> tm_yday = 0 ;
254
- value = rtc_read ( RTC_DATA );
242
+ value = mfd_mc146818_std_read ( config -> mfd , RTC_DATA );
255
243
256
244
/* Check time valid */
257
245
if (!rtc_mc146818_validate_time (timeptr )) {
@@ -305,6 +293,7 @@ static int rtc_mc146818_alarm_set_time(const struct device *dev, uint16_t id, ui
305
293
const struct rtc_time * timeptr )
306
294
{
307
295
struct rtc_mc146818_data * const dev_data = dev -> data ;
296
+ const struct rtc_mc146818_config * config = dev -> config ;
308
297
int ret ;
309
298
310
299
k_spinlock_key_t key = k_spin_lock (& dev_data -> lock );
@@ -326,23 +315,24 @@ static int rtc_mc146818_alarm_set_time(const struct device *dev, uint16_t id, ui
326
315
}
327
316
328
317
if (mask & RTC_ALARM_TIME_MASK_SECOND ) {
329
- rtc_write ( RTC_ALARM_SEC , timeptr -> tm_sec );
318
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_SEC , timeptr -> tm_sec );
330
319
} else {
331
- rtc_write ( RTC_ALARM_SEC , RTC_ALARM_DC );
320
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_SEC , RTC_ALARM_DC );
332
321
}
333
322
334
323
if (mask & RTC_ALARM_TIME_MASK_MINUTE ) {
335
- rtc_write ( RTC_ALARM_MIN , timeptr -> tm_min );
324
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_MIN , timeptr -> tm_min );
336
325
} else {
337
- rtc_write ( RTC_ALARM_SEC , RTC_ALARM_DC );
326
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_SEC , RTC_ALARM_DC );
338
327
}
339
328
if (mask & RTC_ALARM_TIME_MASK_HOUR ) {
340
- rtc_write ( RTC_ALARM_HOUR , timeptr -> tm_hour );
329
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_HOUR , timeptr -> tm_hour );
341
330
} else {
342
- rtc_write ( RTC_ALARM_SEC , RTC_ALARM_DC );
331
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_SEC , RTC_ALARM_DC );
343
332
}
344
333
345
- rtc_write (RTC_DATA , rtc_read (RTC_DATA ) | RTC_AIE_BIT );
334
+ mfd_mc146818_std_write (config -> mfd , RTC_DATA ,
335
+ mfd_mc146818_std_read (config -> mfd , RTC_DATA ) | RTC_AIE_BIT );
346
336
ret = 0 ;
347
337
out :
348
338
k_spin_unlock (& dev_data -> lock , key );
@@ -353,6 +343,7 @@ static int rtc_mc146818_alarm_get_time(const struct device *dev, uint16_t id, ui
353
343
struct rtc_time * timeptr )
354
344
{
355
345
struct rtc_mc146818_data * const dev_data = dev -> data ;
346
+ const struct rtc_mc146818_config * config = dev -> config ;
356
347
uint8_t value ;
357
348
int ret ;
358
349
@@ -370,19 +361,19 @@ static int rtc_mc146818_alarm_get_time(const struct device *dev, uint16_t id, ui
370
361
371
362
(* mask ) = 0 ;
372
363
373
- value = rtc_read ( RTC_ALARM_SEC );
364
+ value = mfd_mc146818_std_read ( config -> mfd , RTC_ALARM_SEC );
374
365
if (value <= MAX_SEC ) {
375
366
timeptr -> tm_sec = value ;
376
367
(* mask ) |= RTC_ALARM_TIME_MASK_SECOND ;
377
368
}
378
369
379
- value = rtc_read ( RTC_ALARM_MIN );
370
+ value = mfd_mc146818_std_read ( config -> mfd , RTC_ALARM_MIN );
380
371
if (value <= MAX_MIN ) {
381
372
timeptr -> tm_min = value ;
382
373
(* mask ) |= RTC_ALARM_TIME_MASK_MINUTE ;
383
374
}
384
375
385
- value = rtc_read ( RTC_ALARM_HOUR );
376
+ value = mfd_mc146818_std_read ( config -> mfd , RTC_ALARM_HOUR );
386
377
if (value <= MAX_HOUR ) {
387
378
timeptr -> tm_hour = value ;
388
379
(* mask ) |= RTC_ALARM_TIME_MASK_HOUR ;
@@ -398,6 +389,7 @@ static int rtc_mc146818_alarm_set_callback(const struct device *dev, uint16_t id
398
389
rtc_alarm_callback callback , void * user_data )
399
390
{
400
391
struct rtc_mc146818_data * const dev_data = dev -> data ;
392
+ const struct rtc_mc146818_config * config = dev -> config ;
401
393
402
394
if (id != 0 ) {
403
395
return - EINVAL ;
@@ -410,10 +402,14 @@ static int rtc_mc146818_alarm_set_callback(const struct device *dev, uint16_t id
410
402
411
403
if (callback != NULL ) {
412
404
/* Enable Alarm callback */
413
- rtc_write (RTC_DATA , (rtc_read (RTC_DATA ) | RTC_AIE_BIT ));
405
+ mfd_mc146818_std_write (config -> mfd , RTC_DATA ,
406
+ (mfd_mc146818_std_read (config -> mfd ,
407
+ RTC_DATA ) | RTC_AIE_BIT ));
414
408
} else {
415
409
/* Disable Alarm callback */
416
- rtc_write (RTC_DATA , (rtc_read (RTC_DATA ) & (~RTC_AIE_BIT )));
410
+ mfd_mc146818_std_write (config -> mfd , RTC_DATA ,
411
+ (mfd_mc146818_std_read (config -> mfd ,
412
+ RTC_DATA ) & (~RTC_AIE_BIT )));
417
413
}
418
414
419
415
k_spin_unlock (& dev_data -> lock , key );
@@ -444,6 +440,7 @@ static int rtc_mc146818_update_set_callback(const struct device *dev,
444
440
rtc_update_callback callback , void * user_data )
445
441
{
446
442
struct rtc_mc146818_data * const dev_data = dev -> data ;
443
+ const struct rtc_mc146818_config * config = dev -> config ;
447
444
448
445
k_spinlock_key_t key = k_spin_lock (& dev_data -> lock );
449
446
@@ -452,10 +449,14 @@ static int rtc_mc146818_update_set_callback(const struct device *dev,
452
449
453
450
if (callback != NULL ) {
454
451
/* Enable update callback */
455
- rtc_write (RTC_DATA , (rtc_read (RTC_DATA ) | RTC_UIE_BIT ));
452
+ mfd_mc146818_std_write (config -> mfd , RTC_DATA ,
453
+ (mfd_mc146818_std_read (config -> mfd ,
454
+ RTC_DATA ) | RTC_UIE_BIT ));
456
455
} else {
457
456
/* Disable update callback */
458
- rtc_write (RTC_DATA , (rtc_read (RTC_DATA ) & (~RTC_UIE_BIT )));
457
+ mfd_mc146818_std_write (config -> mfd , RTC_DATA ,
458
+ (mfd_mc146818_std_read (config -> mfd ,
459
+ RTC_DATA ) & (~RTC_UIE_BIT )));
459
460
}
460
461
461
462
@@ -468,12 +469,13 @@ static int rtc_mc146818_update_set_callback(const struct device *dev,
468
469
static void rtc_mc146818_isr (const struct device * dev )
469
470
{
470
471
struct rtc_mc146818_data * const dev_data = dev -> data ;
472
+ const struct rtc_mc146818_config * config = dev -> config ;
471
473
uint8_t regc ;
472
474
473
475
ARG_UNUSED (dev_data );
474
476
475
477
/* Read register, which clears the register */
476
- regc = rtc_read ( RTC_FLAG );
478
+ regc = mfd_mc146818_std_read ( config -> mfd , RTC_FLAG );
477
479
478
480
#if defined(CONFIG_RTC_ALARM )
479
481
if (regc & RTC_AF_BIT ) {
@@ -514,11 +516,17 @@ static DEVICE_API(rtc, rtc_mc146818_driver_api) = {
514
516
#define RTC_MC146818_INIT_FN_DEFINE (n ) \
515
517
static int rtc_mc146818_init##n(const struct device *dev) \
516
518
{ \
517
- rtc_write(RTC_REG_A, \
519
+ const struct rtc_mc146818_config *config = dev->config; \
520
+ \
521
+ if (!device_is_ready(config->mfd)) { \
522
+ return -ENODEV; \
523
+ } \
524
+ mfd_mc146818_std_write(config->mfd, RTC_REG_A, \
518
525
_CONCAT(RTC_IN_CLK_DIV_BITS_, \
519
526
DT_INST_PROP(n, clock_frequency))); \
520
527
\
521
- rtc_write(RTC_REG_B, RTC_DMODE_BIT | RTC_HFORMAT_BIT); \
528
+ mfd_mc146818_std_write(config->mfd, \
529
+ RTC_REG_B, RTC_DMODE_BIT | RTC_HFORMAT_BIT); \
522
530
\
523
531
IRQ_CONNECT(DT_INST_IRQN(0), \
524
532
DT_INST_IRQ(0, priority), \
@@ -530,14 +538,16 @@ static DEVICE_API(rtc, rtc_mc146818_driver_api) = {
530
538
return 0; \
531
539
}
532
540
533
- #define RTC_MC146818_DEV_CFG (inst ) \
534
- struct rtc_mc146818_data rtc_mc146818_data##inst; \
535
- \
536
- RTC_MC146818_INIT_FN_DEFINE(inst) \
537
- \
538
- DEVICE_DT_INST_DEFINE(inst, &rtc_mc146818_init##inst, NULL, \
539
- &rtc_mc146818_data##inst, NULL, POST_KERNEL, \
540
- CONFIG_RTC_INIT_PRIORITY, \
541
- &rtc_mc146818_driver_api); \
541
+ #define RTC_MC146818_DEV_CFG (inst ) \
542
+ static struct rtc_mc146818_data rtc_mc146818_data##inst; \
543
+ \
544
+ static const struct rtc_mc146818_config rtc_mc146818_config##inst = { \
545
+ .mfd = DEVICE_DT_GET(DT_INST_PARENT(inst))}; \
546
+ \
547
+ RTC_MC146818_INIT_FN_DEFINE(inst) \
548
+ DEVICE_DT_INST_DEFINE(inst, &rtc_mc146818_init##inst, NULL, \
549
+ &rtc_mc146818_data##inst, &rtc_mc146818_config##inst,\
550
+ POST_KERNEL, CONFIG_RTC_INIT_PRIORITY, \
551
+ &rtc_mc146818_driver_api); \
542
552
543
553
DT_INST_FOREACH_STATUS_OKAY (RTC_MC146818_DEV_CFG )
0 commit comments