blob: 835d440d1b3af645a4bf570cb120595e9f927c63 [file] [log] [blame]
/*
* Copyright (c) 2025 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#define DT_DRV_COMPAT motorola_mc146818_mfd
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/spinlock.h>
#include <zephyr/drivers/mfd/mc146818.h>
#include <zephyr/init.h>
#include <zephyr/sys/util.h>
#include <zephyr/devicetree.h>
#include <zephyr/sys/sys_io.h>
#define RTC_STD_INDEX (DT_INST_REG_ADDR_BY_IDX(0, 0))
#define RTC_STD_TARGET (DT_INST_REG_ADDR_BY_IDX(0, 1))
#define RTC_EXT_INDEX (DT_INST_REG_ADDR_BY_IDX(0, 2))
#define RTC_EXT_TARGET (DT_INST_REG_ADDR_BY_IDX(0, 3))
struct mfd_mc146818_data {
struct k_spinlock lock;
};
uint8_t mfd_mc146818_std_read(const struct device *dev, uint8_t offset)
{
struct mfd_mc146818_data *data = dev->data;
uint8_t value;
k_spinlock_key_t key = k_spin_lock(&data->lock);
sys_out8(offset, RTC_STD_INDEX);
value = sys_in8(RTC_STD_TARGET);
k_spin_unlock(&data->lock, key);
return value;
}
void mfd_mc146818_std_write(const struct device *dev, uint8_t offset, uint8_t value)
{
struct mfd_mc146818_data *data = dev->data;
k_spinlock_key_t key = k_spin_lock(&data->lock);
sys_out8(offset, RTC_STD_INDEX);
sys_out8(value, RTC_STD_TARGET);
k_spin_unlock(&data->lock, key);
}
uint8_t mfd_mc146818_ext_read(const struct device *dev, uint8_t offset)
{
struct mfd_mc146818_data *data = dev->data;
uint8_t value;
k_spinlock_key_t key = k_spin_lock(&data->lock);
sys_out8(offset, RTC_EXT_INDEX);
value = sys_in8(RTC_EXT_TARGET);
k_spin_unlock(&data->lock, key);
return value;
}
void mfd_mc146818_ext_write(const struct device *dev, uint8_t offset, uint8_t value)
{
struct mfd_mc146818_data *data = dev->data;
k_spinlock_key_t key = k_spin_lock(&data->lock);
sys_out8(offset, RTC_EXT_INDEX);
sys_out8(value, RTC_EXT_TARGET);
k_spin_unlock(&data->lock, key);
}
#define MFD_MC146818_DEFINE(inst) \
static struct mfd_mc146818_data data##inst; \
DEVICE_DT_INST_DEFINE(inst, NULL, NULL, &data##inst, NULL, \
POST_KERNEL, \
CONFIG_MFD_MOTOROLA_MC146818_INIT_PRIORITY, \
NULL); \
DT_INST_FOREACH_STATUS_OKAY(MFD_MC146818_DEFINE)