Browse Source
Split up the driver for the PWM controller MAX31790 into a multi function device driver. Signed-off-by: Benedikt Schmidt <benedikt.schmidt@embedded-solutions.at>pull/70499/head
11 changed files with 249 additions and 171 deletions
@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
|
||||
# Copyright (c) 2024 SILA Embedded Solutions GmbH |
||||
# SPDX -License-Identifier: Apache-2.0 |
||||
|
||||
config MFD_MAX31790 |
||||
bool "Maxim Integrated MAX31790 I2C configurable PWM controller" |
||||
default y |
||||
depends on DT_HAS_MAXIM_MAX31790_ENABLED |
||||
select I2C |
||||
help |
||||
Enable driver for Maxim Integrated MAX31790. |
@ -0,0 +1,81 @@
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (c) 2024 SILA Embedded Solutions GmbH |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
|
||||
#define DT_DRV_COMPAT maxim_max31790 |
||||
|
||||
#include <zephyr/device.h> |
||||
#include <zephyr/drivers/i2c.h> |
||||
#include <zephyr/drivers/mfd/max31790.h> |
||||
#include <zephyr/sys/util.h> |
||||
#include <zephyr/kernel.h> |
||||
#include <zephyr/logging/log.h> |
||||
|
||||
|
||||
LOG_MODULE_REGISTER(max_max31790, CONFIG_MFD_LOG_LEVEL); |
||||
|
||||
struct max31790_config { |
||||
struct i2c_dt_spec i2c; |
||||
}; |
||||
|
||||
static void max31790_set_globalconfiguration_i2cwatchdog(uint8_t *destination, uint8_t value) |
||||
{ |
||||
uint8_t length = MAX37190_GLOBALCONFIGURATION_I2CWATCHDOG_LENGTH; |
||||
uint8_t pos = MAX37190_GLOBALCONFIGURATION_I2CWATCHDOG_POS; |
||||
|
||||
*destination &= ~GENMASK(pos + length - 1, pos); |
||||
*destination |= FIELD_PREP(GENMASK(pos + length - 1, pos), value); |
||||
} |
||||
|
||||
static int max31790_init(const struct device *dev) |
||||
{ |
||||
const struct max31790_config *config = dev->config; |
||||
int result; |
||||
uint8_t reg_value; |
||||
|
||||
if (!i2c_is_ready_dt(&config->i2c)) { |
||||
LOG_ERR("I2C device not ready"); |
||||
return -ENODEV; |
||||
} |
||||
|
||||
reg_value = 0; |
||||
reg_value &= ~MAX37190_GLOBALCONFIGURATION_STANDBY_BIT; |
||||
reg_value |= MAX37190_GLOBALCONFIGURATION_RESET_BIT; |
||||
reg_value |= MAX37190_GLOBALCONFIGURATION_BUSTIMEOUT_BIT; |
||||
reg_value &= ~MAX37190_GLOBALCONFIGURATION_OSCILLATORSELECTION_BIT; |
||||
max31790_set_globalconfiguration_i2cwatchdog(®_value, 0); |
||||
reg_value &= ~MAX37190_GLOBALCONFIGURATION_I2CWATCHDOGSTATUS_BIT; |
||||
|
||||
result = i2c_reg_write_byte_dt(&config->i2c, MAX37190_REGISTER_GLOBALCONFIGURATION, |
||||
reg_value); |
||||
if (result != 0) { |
||||
return result; |
||||
} |
||||
|
||||
k_sleep(K_USEC(MAX31790_RESET_TIMEOUT_IN_US)); |
||||
|
||||
result = i2c_reg_read_byte_dt(&config->i2c, MAX37190_REGISTER_GLOBALCONFIGURATION, |
||||
®_value); |
||||
if (result != 0) { |
||||
return result; |
||||
} |
||||
|
||||
if ((reg_value & MAX37190_GLOBALCONFIGURATION_STANDBY_BIT) != 0) { |
||||
LOG_ERR("PWM controller is still in standby"); |
||||
return -ENODEV; |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
#define MAX31790_INIT(inst) \ |
||||
static const struct max31790_config max31790_##inst##_config = { \ |
||||
.i2c = I2C_DT_SPEC_INST_GET(inst), \ |
||||
}; \ |
||||
\ |
||||
DEVICE_DT_INST_DEFINE(inst, max31790_init, NULL, NULL, &max31790_##inst##_config, \ |
||||
POST_KERNEL, CONFIG_MFD_INIT_PRIORITY, NULL); |
||||
|
||||
DT_INST_FOREACH_STATUS_OKAY(MAX31790_INIT); |
@ -0,0 +1,14 @@
@@ -0,0 +1,14 @@
|
||||
# Copyright (c) 2024 SILA Embedded Solutions GmbH |
||||
# SPDX-License-Identifier: Apache-2.0 |
||||
|
||||
description: Maxim MAX31790 6-channel I2C-bus PWM controller, MFD device |
||||
|
||||
compatible: "maxim,max31790" |
||||
|
||||
include: i2c-device.yaml |
||||
|
||||
bus: max31790 |
||||
|
||||
properties: |
||||
reg: |
||||
required: true |
@ -0,0 +1,70 @@
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 2024 SILA Embedded Solutions GmbH |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
|
||||
#ifndef ZEPHYR_INCLUDE_DRIVERS_MFD_MAX31790_H_ |
||||
#define ZEPHYR_INCLUDE_DRIVERS_MFD_MAX31790_H_ |
||||
|
||||
#include <zephyr/sys/util.h> |
||||
#include <zephyr/sys/util_macro.h> |
||||
|
||||
#define MAX31790_OSCILLATOR_FREQUENCY_IN_HZ 32768 |
||||
#define MAX31790_PWMTARGETDUTYCYCLE_MAXIMUM ((1 << 9) - 1) |
||||
#define MAX31790_TACHTARGETCOUNT_MAXIMUM ((1 << 11) - 1) |
||||
#define MAX31790_CHANNEL_COUNT 6 |
||||
#define MAX31790_RESET_TIMEOUT_IN_US 1000 |
||||
|
||||
#define MAX37190_REGISTER_GLOBALCONFIGURATION 0x00 |
||||
#define MAX37190_REGISTER_PWMFREQUENCY 0x01 |
||||
#define MAX37190_REGISTER_FANCONFIGURATION(channel) (0x02 + channel) |
||||
#define MAX31790_REGISTER_FANDYNAMICS(channel) (0x08 + channel) |
||||
#define MAX37190_REGISTER_FANFAULTSTATUS1 0x11 |
||||
#define MAX37190_REGISTER_TACHCOUNTMSB(channel) (0x18 + 2 * channel) |
||||
#define MAX31790_REGISTER_PWMOUTTARGETDUTYCYCLEMSB(channel) (0x40 + 2 * channel) |
||||
#define MAX31790_REGISTER_TACHTARGETCOUNTMSB(channel) (0x50 + 2 * channel) |
||||
|
||||
#define MAX37190_GLOBALCONFIGURATION_STANDBY_BIT BIT(7) |
||||
#define MAX37190_GLOBALCONFIGURATION_RESET_BIT BIT(6) |
||||
#define MAX37190_GLOBALCONFIGURATION_BUSTIMEOUT_BIT BIT(5) |
||||
#define MAX37190_GLOBALCONFIGURATION_OSCILLATORSELECTION_BIT BIT(3) |
||||
#define MAX37190_GLOBALCONFIGURATION_I2CWATCHDOGSTATUS_BIT BIT(0) |
||||
#define MAX37190_FANXCONFIGURATION_MONITOR_BIT BIT(4) |
||||
#define MAX37190_FANXCONFIGURATION_TACHINPUTENABLED_BIT BIT(3) |
||||
#define MAX37190_FANXCONFIGURATION_LOCKEDROTOR_BIT BIT(2) |
||||
#define MAX37190_FANXCONFIGURATION_LOCKEDROTORPOLARITY_BIT BIT(1) |
||||
#define MAX37190_FANXCONFIGURATION_TACH_BIT BIT(0) |
||||
#define MAX37190_FANXCONFIGURATION_MODE_BIT BIT(7) |
||||
#define MAX37190_FANXDYNAMICS_ASYMMETRICRATEOFCHANGE_BIT BIT(1) |
||||
|
||||
#define MAX37190_GLOBALCONFIGURATION_I2CWATCHDOG_LENGTH 2 |
||||
#define MAX37190_GLOBALCONFIGURATION_I2CWATCHDOG_POS 1 |
||||
#define MAX37190_FANXDYNAMICS_SPEEDRANGE_LENGTH 3 |
||||
#define MAX37190_FANXDYNAMICS_SPEEDRANGE_POS 5 |
||||
#define MAX37190_FANXDYNAMICS_PWMRATEOFCHANGE_LENGTH 3 |
||||
#define MAX37190_FANXDYNAMICS_PWMRATEOFCHANGE_POS 2 |
||||
#define MAX37190_PWMFREQUENCY_PWM_LENGTH 4 |
||||
#define MAX37190_PWMFREQUENCY_PWM4TO6_POS 4 |
||||
#define MAX37190_PWMFREQUENCY_PWM1TO3_LENGTH 4 |
||||
#define MAX37190_PWMFREQUENCY_PWM1TO3_POS 0 |
||||
#define MAX37190_FANXCONFIGURATION_SPINUP_LENGTH 2 |
||||
#define MAX37190_FANXCONFIGURATION_SPINUP_POS 5 |
||||
|
||||
#define MAX31790_FANXDYNAMCIS_SPEED_RANGE_GET(value) \ |
||||
FIELD_GET(GENMASK(MAX37190_FANXDYNAMICS_SPEEDRANGE_LENGTH + \ |
||||
MAX37190_FANXDYNAMICS_SPEEDRANGE_POS - 1, \ |
||||
MAX37190_FANXDYNAMICS_SPEEDRANGE_POS), \ |
||||
value) |
||||
|
||||
#define MAX31790_FLAG_SPEED_RANGE_GET(flags) \ |
||||
FIELD_GET(GENMASK(MAX37190_FANXDYNAMICS_SPEEDRANGE_LENGTH + \ |
||||
PWM_MAX31790_FLAG_SPEED_RANGE_POS - 1, \ |
||||
PWM_MAX31790_FLAG_SPEED_RANGE_POS), \ |
||||
flags) |
||||
#define MAX31790_FLAG_PWM_RATE_OF_CHANGE_GET(flags) \ |
||||
FIELD_GET(GENMASK(MAX37190_FANXDYNAMICS_PWMRATEOFCHANGE_LENGTH + \ |
||||
PWM_MAX31790_FLAG_PWM_RATE_OF_CHANGE_POS - 1, \ |
||||
PWM_MAX31790_FLAG_PWM_RATE_OF_CHANGE_POS), \ |
||||
flags) |
||||
|
||||
#endif /* ZEPHYR_INCLUDE_DRIVERS_MFD_MAX31790_H_ */ |
Loading…
Reference in new issue