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,10 +203,10 @@ 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 ;
222
- uint8_t value ;
223
210
224
211
k_spinlock_key_t key = k_spin_lock (& dev_data -> lock );
225
212
@@ -229,29 +216,28 @@ static int rtc_mc146818_get_time(const struct device *dev, struct rtc_time *tim
229
216
goto out ;
230
217
}
231
218
232
- if (!(rtc_read ( RTC_REG_D ) & RTC_VRT_BIT )) {
219
+ if (!(mfd_mc146818_std_read ( config -> mfd , RTC_REG_D ) & RTC_VRT_BIT )) {
233
220
ret = - ENODATA ;
234
221
goto out ;
235
222
}
236
223
237
- while (rtc_read ( RTC_UIP ) & RTC_UIP_BIT ) {
224
+ while (mfd_mc146818_std_read ( config -> mfd , RTC_UIP ) & RTC_UIP_BIT ) {
238
225
continue ;
239
226
}
240
227
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 );
228
+ cent = mfd_mc146818_std_read ( config -> mfd , RTC_CENTURY );
229
+ year = mfd_mc146818_std_read ( config -> mfd , RTC_YEAR );
230
+ timeptr -> tm_mon = mfd_mc146818_std_read ( config -> mfd , RTC_MONTH ) - 1 ;
231
+ timeptr -> tm_mday = mfd_mc146818_std_read ( config -> mfd , RTC_MDAY );
232
+ timeptr -> tm_wday = mfd_mc146818_std_read ( config -> mfd , RTC_WDAY ) - 1 ;
233
+ timeptr -> tm_hour = mfd_mc146818_std_read ( config -> mfd , RTC_HOUR );
234
+ timeptr -> tm_min = mfd_mc146818_std_read ( config -> mfd , RTC_MIN );
235
+ timeptr -> tm_sec = mfd_mc146818_std_read ( config -> mfd , RTC_SEC );
249
236
250
237
timeptr -> tm_year = 100 * (int )cent + year - 1900 ;
251
238
252
239
timeptr -> tm_nsec = 0 ;
253
240
timeptr -> tm_yday = 0 ;
254
- value = rtc_read (RTC_DATA );
255
241
256
242
/* Check time valid */
257
243
if (!rtc_mc146818_validate_time (timeptr )) {
@@ -305,6 +291,7 @@ static int rtc_mc146818_alarm_set_time(const struct device *dev, uint16_t id, ui
305
291
const struct rtc_time * timeptr )
306
292
{
307
293
struct rtc_mc146818_data * const dev_data = dev -> data ;
294
+ const struct rtc_mc146818_config * config = dev -> config ;
308
295
int ret ;
309
296
310
297
k_spinlock_key_t key = k_spin_lock (& dev_data -> lock );
@@ -326,23 +313,24 @@ static int rtc_mc146818_alarm_set_time(const struct device *dev, uint16_t id, ui
326
313
}
327
314
328
315
if (mask & RTC_ALARM_TIME_MASK_SECOND ) {
329
- rtc_write ( RTC_ALARM_SEC , timeptr -> tm_sec );
316
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_SEC , timeptr -> tm_sec );
330
317
} else {
331
- rtc_write ( RTC_ALARM_SEC , RTC_ALARM_DC );
318
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_SEC , RTC_ALARM_DC );
332
319
}
333
320
334
321
if (mask & RTC_ALARM_TIME_MASK_MINUTE ) {
335
- rtc_write ( RTC_ALARM_MIN , timeptr -> tm_min );
322
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_MIN , timeptr -> tm_min );
336
323
} else {
337
- rtc_write ( RTC_ALARM_SEC , RTC_ALARM_DC );
324
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_SEC , RTC_ALARM_DC );
338
325
}
339
326
if (mask & RTC_ALARM_TIME_MASK_HOUR ) {
340
- rtc_write ( RTC_ALARM_HOUR , timeptr -> tm_hour );
327
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_HOUR , timeptr -> tm_hour );
341
328
} else {
342
- rtc_write ( RTC_ALARM_SEC , RTC_ALARM_DC );
329
+ mfd_mc146818_std_write ( config -> mfd , RTC_ALARM_SEC , RTC_ALARM_DC );
343
330
}
344
331
345
- rtc_write (RTC_DATA , rtc_read (RTC_DATA ) | RTC_AIE_BIT );
332
+ mfd_mc146818_std_write (config -> mfd , RTC_DATA ,
333
+ mfd_mc146818_std_read (config -> mfd , RTC_DATA ) | RTC_AIE_BIT );
346
334
ret = 0 ;
347
335
out :
348
336
k_spin_unlock (& dev_data -> lock , key );
@@ -353,6 +341,7 @@ static int rtc_mc146818_alarm_get_time(const struct device *dev, uint16_t id, ui
353
341
struct rtc_time * timeptr )
354
342
{
355
343
struct rtc_mc146818_data * const dev_data = dev -> data ;
344
+ const struct rtc_mc146818_config * config = dev -> config ;
356
345
uint8_t value ;
357
346
int ret ;
358
347
@@ -370,19 +359,19 @@ static int rtc_mc146818_alarm_get_time(const struct device *dev, uint16_t id, ui
370
359
371
360
(* mask ) = 0 ;
372
361
373
- value = rtc_read ( RTC_ALARM_SEC );
362
+ value = mfd_mc146818_std_read ( config -> mfd , RTC_ALARM_SEC );
374
363
if (value <= MAX_SEC ) {
375
364
timeptr -> tm_sec = value ;
376
365
(* mask ) |= RTC_ALARM_TIME_MASK_SECOND ;
377
366
}
378
367
379
- value = rtc_read ( RTC_ALARM_MIN );
368
+ value = mfd_mc146818_std_read ( config -> mfd , RTC_ALARM_MIN );
380
369
if (value <= MAX_MIN ) {
381
370
timeptr -> tm_min = value ;
382
371
(* mask ) |= RTC_ALARM_TIME_MASK_MINUTE ;
383
372
}
384
373
385
- value = rtc_read ( RTC_ALARM_HOUR );
374
+ value = mfd_mc146818_std_read ( config -> mfd , RTC_ALARM_HOUR );
386
375
if (value <= MAX_HOUR ) {
387
376
timeptr -> tm_hour = value ;
388
377
(* mask ) |= RTC_ALARM_TIME_MASK_HOUR ;
@@ -398,6 +387,7 @@ static int rtc_mc146818_alarm_set_callback(const struct device *dev, uint16_t id
398
387
rtc_alarm_callback callback , void * user_data )
399
388
{
400
389
struct rtc_mc146818_data * const dev_data = dev -> data ;
390
+ const struct rtc_mc146818_config * config = dev -> config ;
401
391
402
392
if (id != 0 ) {
403
393
return - EINVAL ;
@@ -410,10 +400,14 @@ static int rtc_mc146818_alarm_set_callback(const struct device *dev, uint16_t id
410
400
411
401
if (callback != NULL ) {
412
402
/* Enable Alarm callback */
413
- rtc_write (RTC_DATA , (rtc_read (RTC_DATA ) | RTC_AIE_BIT ));
403
+ mfd_mc146818_std_write (config -> mfd , RTC_DATA ,
404
+ (mfd_mc146818_std_read (config -> mfd ,
405
+ RTC_DATA ) | RTC_AIE_BIT ));
414
406
} else {
415
407
/* Disable Alarm callback */
416
- rtc_write (RTC_DATA , (rtc_read (RTC_DATA ) & (~RTC_AIE_BIT )));
408
+ mfd_mc146818_std_write (config -> mfd , RTC_DATA ,
409
+ (mfd_mc146818_std_read (config -> mfd ,
410
+ RTC_DATA ) & (~RTC_AIE_BIT )));
417
411
}
418
412
419
413
k_spin_unlock (& dev_data -> lock , key );
@@ -444,6 +438,7 @@ static int rtc_mc146818_update_set_callback(const struct device *dev,
444
438
rtc_update_callback callback , void * user_data )
445
439
{
446
440
struct rtc_mc146818_data * const dev_data = dev -> data ;
441
+ const struct rtc_mc146818_config * config = dev -> config ;
447
442
448
443
k_spinlock_key_t key = k_spin_lock (& dev_data -> lock );
449
444
@@ -452,10 +447,14 @@ static int rtc_mc146818_update_set_callback(const struct device *dev,
452
447
453
448
if (callback != NULL ) {
454
449
/* Enable update callback */
455
- rtc_write (RTC_DATA , (rtc_read (RTC_DATA ) | RTC_UIE_BIT ));
450
+ mfd_mc146818_std_write (config -> mfd , RTC_DATA ,
451
+ (mfd_mc146818_std_read (config -> mfd ,
452
+ RTC_DATA ) | RTC_UIE_BIT ));
456
453
} else {
457
454
/* Disable update callback */
458
- rtc_write (RTC_DATA , (rtc_read (RTC_DATA ) & (~RTC_UIE_BIT )));
455
+ mfd_mc146818_std_write (config -> mfd , RTC_DATA ,
456
+ (mfd_mc146818_std_read (config -> mfd ,
457
+ RTC_DATA ) & (~RTC_UIE_BIT )));
459
458
}
460
459
461
460
@@ -468,12 +467,13 @@ static int rtc_mc146818_update_set_callback(const struct device *dev,
468
467
static void rtc_mc146818_isr (const struct device * dev )
469
468
{
470
469
struct rtc_mc146818_data * const dev_data = dev -> data ;
470
+ const struct rtc_mc146818_config * config = dev -> config ;
471
471
uint8_t regc ;
472
472
473
473
ARG_UNUSED (dev_data );
474
474
475
475
/* Read register, which clears the register */
476
- regc = rtc_read ( RTC_FLAG );
476
+ regc = mfd_mc146818_std_read ( config -> mfd , RTC_FLAG );
477
477
478
478
#if defined(CONFIG_RTC_ALARM )
479
479
if (regc & RTC_AF_BIT ) {
@@ -514,11 +514,17 @@ static DEVICE_API(rtc, rtc_mc146818_driver_api) = {
514
514
#define RTC_MC146818_INIT_FN_DEFINE (n ) \
515
515
static int rtc_mc146818_init##n(const struct device *dev) \
516
516
{ \
517
- rtc_write(RTC_REG_A, \
517
+ const struct rtc_mc146818_config *config = dev->config; \
518
+ \
519
+ if (!device_is_ready(config->mfd)) { \
520
+ return -ENODEV; \
521
+ } \
522
+ mfd_mc146818_std_write(config->mfd, RTC_REG_A, \
518
523
_CONCAT(RTC_IN_CLK_DIV_BITS_, \
519
524
DT_INST_PROP(n, clock_frequency))); \
520
525
\
521
- rtc_write(RTC_REG_B, RTC_DMODE_BIT | RTC_HFORMAT_BIT); \
526
+ mfd_mc146818_std_write(config->mfd, \
527
+ RTC_REG_B, RTC_DMODE_BIT | RTC_HFORMAT_BIT); \
522
528
\
523
529
IRQ_CONNECT(DT_INST_IRQN(0), \
524
530
DT_INST_IRQ(0, priority), \
@@ -530,14 +536,16 @@ static DEVICE_API(rtc, rtc_mc146818_driver_api) = {
530
536
return 0; \
531
537
}
532
538
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); \
539
+ #define RTC_MC146818_DEV_CFG (inst ) \
540
+ static struct rtc_mc146818_data rtc_mc146818_data##inst; \
541
+ \
542
+ static const struct rtc_mc146818_config rtc_mc146818_config##inst = { \
543
+ .mfd = DEVICE_DT_GET(DT_INST_PARENT(inst))}; \
544
+ \
545
+ RTC_MC146818_INIT_FN_DEFINE(inst) \
546
+ DEVICE_DT_INST_DEFINE(inst, &rtc_mc146818_init##inst, NULL, \
547
+ &rtc_mc146818_data##inst, &rtc_mc146818_config##inst,\
548
+ POST_KERNEL, CONFIG_RTC_INIT_PRIORITY, \
549
+ &rtc_mc146818_driver_api); \
542
550
543
551
DT_INST_FOREACH_STATUS_OKAY (RTC_MC146818_DEV_CFG )
0 commit comments