69 lines
1.8 KiB
C
69 lines
1.8 KiB
C
/*
|
|
* Copyright (c) 2023 Caspar Friedrich <c.s.w.friedrich@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include "w1_ds2482-800.h"
|
|
#include "w1_ds2482_84_common.h"
|
|
|
|
#include <zephyr/devicetree.h>
|
|
#include <zephyr/drivers/i2c.h>
|
|
#include <zephyr/logging/log.h>
|
|
|
|
#define DT_DRV_COMPAT maxim_ds2482_800
|
|
|
|
LOG_MODULE_REGISTER(ds2482, CONFIG_W1_LOG_LEVEL);
|
|
|
|
struct ds2482_config {
|
|
const struct i2c_dt_spec i2c_spec;
|
|
};
|
|
|
|
struct ds2482_data {
|
|
struct k_mutex lock;
|
|
};
|
|
|
|
int ds2482_change_bus_lock_impl(const struct device *dev, bool lock)
|
|
{
|
|
struct ds2482_data *data = dev->data;
|
|
|
|
return lock ? k_mutex_lock(&data->lock, K_FOREVER) : k_mutex_unlock(&data->lock);
|
|
}
|
|
|
|
static int ds2482_init(const struct device *dev)
|
|
{
|
|
int ret;
|
|
|
|
const struct ds2482_config *config = dev->config;
|
|
struct ds2482_data *data = dev->data;
|
|
|
|
k_mutex_init(&data->lock);
|
|
|
|
if (!i2c_is_ready_dt(&config->i2c_spec)) {
|
|
return -ENODEV;
|
|
}
|
|
|
|
ret = ds2482_84_reset_device(&config->i2c_spec);
|
|
if (ret < 0) {
|
|
LOG_ERR("Device reset failed: %d", ret);
|
|
return ret;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#define DS2482_INIT(inst) \
|
|
static const struct ds2482_config inst_##inst##_config = { \
|
|
.i2c_spec = I2C_DT_SPEC_INST_GET(inst), \
|
|
}; \
|
|
static struct ds2482_data inst_##inst##_data; \
|
|
DEVICE_DT_INST_DEFINE(inst, ds2482_init, NULL, &inst_##inst##_data, &inst_##inst##_config, \
|
|
POST_KERNEL, CONFIG_W1_INIT_PRIORITY, NULL);
|
|
|
|
DT_INST_FOREACH_STATUS_OKAY(DS2482_INIT)
|
|
|
|
/*
|
|
* Make sure that this driver is not initialized before the i2c bus is available
|
|
*/
|
|
BUILD_ASSERT(CONFIG_W1_INIT_PRIORITY > CONFIG_I2C_INIT_PRIORITY);
|