Skip to content

Commit a463b00

Browse files
committed
drivers: rtc: Enabled MFD support for RTC mc146818
Enabled support for motorola mc146818 RTC driver. Signed-off-by: Anisetti Avinash Krishna <anisetti.avinash.krishna@intel.com>
1 parent 1fb1738 commit a463b00

File tree

2 files changed

+77
-66
lines changed

2 files changed

+77
-66
lines changed

drivers/rtc/Kconfig.mc146818

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
config RTC_MOTOROLA_MC146818
77
bool "RTC driver for x86 CMOS/RTC clock"
88
default y if !COUNTER
9+
select MFD
910
depends on DT_HAS_MOTOROLA_MC146818_ENABLED

drivers/rtc/rtc_mc146818.c

Lines changed: 76 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@
1515
#include <zephyr/devicetree.h>
1616
#include <zephyr/drivers/rtc.h>
1717
#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>
2119

2220
/* Time indices in RTC RAM */
2321
#define RTC_SEC 0x00
@@ -127,21 +125,9 @@ struct rtc_mc146818_data {
127125
void *update_cb_data;
128126
};
129127

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+
};
145131

146132
static bool rtc_mc146818_validate_time(const struct rtc_time *timeptr)
147133
{
@@ -172,6 +158,7 @@ static bool rtc_mc146818_validate_time(const struct rtc_time *timeptr)
172158
static int rtc_mc146818_set_time(const struct device *dev, const struct rtc_time *timeptr)
173159
{
174160
struct rtc_mc146818_data * const dev_data = dev->data;
161+
const struct rtc_mc146818_config *config = dev->config;
175162
uint8_t value;
176163
int year;
177164
int cent;
@@ -190,23 +177,23 @@ static int rtc_mc146818_set_time(const struct device *dev, const struct rtc_time
190177
goto out;
191178
}
192179

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);
195182

196183
year = (1900 + timeptr->tm_year) % 100;
197184
cent = (1900 + timeptr->tm_year) / 100;
198185

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);
207194

208195
value &= (~RTC_UCI_BIT);
209-
rtc_write(RTC_DATA, value);
196+
mfd_mc146818_std_write(config->mfd, RTC_DATA, value);
210197
ret = 0;
211198
out:
212199
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
216203
static int rtc_mc146818_get_time(const struct device *dev, struct rtc_time *timeptr)
217204
{
218205
struct rtc_mc146818_data * const dev_data = dev->data;
206+
const struct rtc_mc146818_config *config = dev->config;
219207
int ret;
220208
uint8_t cent;
221209
uint8_t year;
@@ -229,29 +217,29 @@ static int rtc_mc146818_get_time(const struct device *dev, struct rtc_time *tim
229217
goto out;
230218
}
231219

232-
if (!(rtc_read(RTC_REG_D) & RTC_VRT_BIT)) {
220+
if (!(mfd_mc146818_std_read(config->mfd, RTC_REG_D) & RTC_VRT_BIT)) {
233221
ret = -ENODATA;
234222
goto out;
235223
}
236224

237-
while (rtc_read(RTC_UIP) & RTC_UIP_BIT) {
225+
while (mfd_mc146818_std_read(config->mfd, RTC_UIP) & RTC_UIP_BIT) {
238226
continue;
239227
}
240228

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);
249237

250238
timeptr->tm_year = 100 * (int)cent + year - 1900;
251239

252240
timeptr->tm_nsec = 0;
253241
timeptr->tm_yday = 0;
254-
value = rtc_read(RTC_DATA);
242+
value = mfd_mc146818_std_read(config->mfd, RTC_DATA);
255243

256244
/* Check time valid */
257245
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
305293
const struct rtc_time *timeptr)
306294
{
307295
struct rtc_mc146818_data * const dev_data = dev->data;
296+
const struct rtc_mc146818_config *config = dev->config;
308297
int ret;
309298

310299
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
326315
}
327316

328317
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);
330319
} else {
331-
rtc_write(RTC_ALARM_SEC, RTC_ALARM_DC);
320+
mfd_mc146818_std_write(config->mfd, RTC_ALARM_SEC, RTC_ALARM_DC);
332321
}
333322

334323
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);
336325
} else {
337-
rtc_write(RTC_ALARM_SEC, RTC_ALARM_DC);
326+
mfd_mc146818_std_write(config->mfd, RTC_ALARM_SEC, RTC_ALARM_DC);
338327
}
339328
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);
341330
} else {
342-
rtc_write(RTC_ALARM_SEC, RTC_ALARM_DC);
331+
mfd_mc146818_std_write(config->mfd, RTC_ALARM_SEC, RTC_ALARM_DC);
343332
}
344333

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);
346336
ret = 0;
347337
out:
348338
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
353343
struct rtc_time *timeptr)
354344
{
355345
struct rtc_mc146818_data * const dev_data = dev->data;
346+
const struct rtc_mc146818_config *config = dev->config;
356347
uint8_t value;
357348
int ret;
358349

@@ -370,19 +361,19 @@ static int rtc_mc146818_alarm_get_time(const struct device *dev, uint16_t id, ui
370361

371362
(*mask) = 0;
372363

373-
value = rtc_read(RTC_ALARM_SEC);
364+
value = mfd_mc146818_std_read(config->mfd, RTC_ALARM_SEC);
374365
if (value <= MAX_SEC) {
375366
timeptr->tm_sec = value;
376367
(*mask) |= RTC_ALARM_TIME_MASK_SECOND;
377368
}
378369

379-
value = rtc_read(RTC_ALARM_MIN);
370+
value = mfd_mc146818_std_read(config->mfd, RTC_ALARM_MIN);
380371
if (value <= MAX_MIN) {
381372
timeptr->tm_min = value;
382373
(*mask) |= RTC_ALARM_TIME_MASK_MINUTE;
383374
}
384375

385-
value = rtc_read(RTC_ALARM_HOUR);
376+
value = mfd_mc146818_std_read(config->mfd, RTC_ALARM_HOUR);
386377
if (value <= MAX_HOUR) {
387378
timeptr->tm_hour = value;
388379
(*mask) |= RTC_ALARM_TIME_MASK_HOUR;
@@ -398,6 +389,7 @@ static int rtc_mc146818_alarm_set_callback(const struct device *dev, uint16_t id
398389
rtc_alarm_callback callback, void *user_data)
399390
{
400391
struct rtc_mc146818_data * const dev_data = dev->data;
392+
const struct rtc_mc146818_config *config = dev->config;
401393

402394
if (id != 0) {
403395
return -EINVAL;
@@ -410,10 +402,14 @@ static int rtc_mc146818_alarm_set_callback(const struct device *dev, uint16_t id
410402

411403
if (callback != NULL) {
412404
/* 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));
414408
} else {
415409
/* 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)));
417413
}
418414

419415
k_spin_unlock(&dev_data->lock, key);
@@ -444,6 +440,7 @@ static int rtc_mc146818_update_set_callback(const struct device *dev,
444440
rtc_update_callback callback, void *user_data)
445441
{
446442
struct rtc_mc146818_data * const dev_data = dev->data;
443+
const struct rtc_mc146818_config *config = dev->config;
447444

448445
k_spinlock_key_t key = k_spin_lock(&dev_data->lock);
449446

@@ -452,10 +449,14 @@ static int rtc_mc146818_update_set_callback(const struct device *dev,
452449

453450
if (callback != NULL) {
454451
/* 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));
456455
} else {
457456
/* 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)));
459460
}
460461

461462

@@ -468,12 +469,13 @@ static int rtc_mc146818_update_set_callback(const struct device *dev,
468469
static void rtc_mc146818_isr(const struct device *dev)
469470
{
470471
struct rtc_mc146818_data * const dev_data = dev->data;
472+
const struct rtc_mc146818_config *config = dev->config;
471473
uint8_t regc;
472474

473475
ARG_UNUSED(dev_data);
474476

475477
/* Read register, which clears the register */
476-
regc = rtc_read(RTC_FLAG);
478+
regc = mfd_mc146818_std_read(config->mfd, RTC_FLAG);
477479

478480
#if defined(CONFIG_RTC_ALARM)
479481
if (regc & RTC_AF_BIT) {
@@ -514,11 +516,17 @@ static DEVICE_API(rtc, rtc_mc146818_driver_api) = {
514516
#define RTC_MC146818_INIT_FN_DEFINE(n) \
515517
static int rtc_mc146818_init##n(const struct device *dev) \
516518
{ \
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, \
518525
_CONCAT(RTC_IN_CLK_DIV_BITS_, \
519526
DT_INST_PROP(n, clock_frequency))); \
520527
\
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); \
522530
\
523531
IRQ_CONNECT(DT_INST_IRQN(0), \
524532
DT_INST_IRQ(0, priority), \
@@ -530,14 +538,16 @@ static DEVICE_API(rtc, rtc_mc146818_driver_api) = {
530538
return 0; \
531539
}
532540

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); \
542552

543553
DT_INST_FOREACH_STATUS_OKAY(RTC_MC146818_DEV_CFG)

0 commit comments

Comments
 (0)