Skip to content

Commit

Permalink
Merge pull request #10 from DatumSystems/mutex-ctrl
Browse files Browse the repository at this point in the history
Add sysfs enable/disable control for SPI2/I2C mutex, for use when PCB is fixed.
  • Loading branch information
mcarlin-ds authored Jun 26, 2024
2 parents 6581dd9 + 0508b62 commit 6114b34
Show file tree
Hide file tree
Showing 5 changed files with 125 additions and 68 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
VERSION = 5
PATCHLEVEL = 15
SUBLEVEL = 107
EXTRAVERSION = -datum.10
EXTRAVERSION = -datum.11
NAME = Trick or Treat

# *DOCUMENTATION*
Expand Down
52 changes: 24 additions & 28 deletions drivers/hwmon/ina2xx_datum.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,12 @@
*/
#define INA226_TOTAL_CONV_TIME_DEFAULT 2200

extern struct mutex datum_b53_spi_mutex;
/*
* SPI2-I2C3 Clocks Shorted Mutex Control
*/

void datum_b53_spi_mutex_lock(void);
void datum_b53_spi_mutex_unlock(struct device *dev);

static struct regmap_config ina2xx_regmap_config = {
.reg_bits = 8,
Expand Down Expand Up @@ -155,15 +160,6 @@ static const struct ina2xx_config ina2xx_config[] = {
*/
static const int ina226_avg_tab[] = { 1, 4, 16, 64, 128, 256, 512, 1024 };

static inline void spi_lock(void) { mutex_lock(&datum_b53_spi_mutex); }

static inline void spi_unlock(struct device *dev)
{
if(!pm_runtime_suspended(dev))
usleep_range(100, 200);
mutex_unlock(&datum_b53_spi_mutex);
}

static int ina226_reg_to_interval(u16 config)
{
int avg = ina226_avg_tab[INA226_READ_AVG(config)];
Expand Down Expand Up @@ -203,11 +199,11 @@ static int ina2xx_calibrate(struct ina2xx_data *data)
struct device *device = dev->parent->parent;
int retval;

spi_lock();
datum_b53_spi_mutex_lock();
retval = regmap_write(data->regmap, INA2XX_CALIBRATION,
data->config->calibration_value);

spi_unlock(device);
datum_b53_spi_mutex_unlock(device);

return retval;
}
Expand All @@ -221,10 +217,10 @@ static int ina2xx_init(struct ina2xx_data *data)
struct device *device = dev->parent->parent;
int ret;

spi_lock();
datum_b53_spi_mutex_lock();
ret = regmap_write(data->regmap, INA2XX_CONFIG,
data->config->config_default);
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);
if (ret < 0)
return ret;

Expand All @@ -241,9 +237,9 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval)

for (retry = 5; retry; retry--) {

spi_lock();
datum_b53_spi_mutex_lock();
ret = regmap_read(data->regmap, reg, regval);
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);

if (ret < 0)
return ret;
Expand All @@ -261,10 +257,10 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval)
if (*regval == 0) {
unsigned int cal;

spi_lock();
datum_b53_spi_mutex_lock();
ret = regmap_read(data->regmap, INA2XX_CALIBRATION,
&cal);
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);

if (ret < 0)
return ret;
Expand Down Expand Up @@ -410,7 +406,7 @@ static ssize_t ina226_alert_show(struct device *dev,
int ret;

mutex_lock(&data->config_lock);
spi_lock();
datum_b53_spi_mutex_lock();
ret = regmap_read(data->regmap, INA226_MASK_ENABLE, &regval);
if (ret)
goto abort;
Expand All @@ -424,7 +420,7 @@ static ssize_t ina226_alert_show(struct device *dev,

ret = sysfs_emit(buf, "%d\n", val);
abort:
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);
mutex_unlock(&data->config_lock);
return ret;
}
Expand All @@ -449,7 +445,7 @@ static ssize_t ina226_alert_store(struct device *dev,
* if the value is non-zero.
*/
mutex_lock(&data->config_lock);
spi_lock();
datum_b53_spi_mutex_lock();
ret = regmap_update_bits(data->regmap, INA226_MASK_ENABLE,
INA226_ALERT_CONFIG_MASK, 0);
if (ret < 0)
Expand All @@ -472,7 +468,7 @@ static ssize_t ina226_alert_store(struct device *dev,

ret = count;
abort:
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);
mutex_unlock(&data->config_lock);
return ret;
}
Expand All @@ -487,9 +483,9 @@ static ssize_t ina226_alarm_show(struct device *dev,
int alarm = 0;
int ret;

spi_lock();
datum_b53_spi_mutex_lock();
ret = regmap_read(data->regmap, INA226_MASK_ENABLE, &regval);
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);
if (ret)
return ret;

Expand Down Expand Up @@ -563,12 +559,12 @@ static ssize_t ina226_interval_store(struct device *dev,
if (val > INT_MAX || val == 0)
return -EINVAL;

spi_lock();
datum_b53_spi_mutex_lock();
status = regmap_update_bits(data->regmap, INA2XX_CONFIG,
INA226_AVG_RD_MASK,
ina226_interval_to_reg(val));

spi_unlock(device);
datum_b53_spi_mutex_unlock(device);
if (status < 0)
return status;

Expand All @@ -583,9 +579,9 @@ static ssize_t ina226_interval_show(struct device *dev,
int status;
unsigned int regval;

spi_lock();
datum_b53_spi_mutex_lock();
status = regmap_read(data->regmap, INA2XX_CONFIG, &regval);
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);
if (status)
return status;

Expand Down
30 changes: 11 additions & 19 deletions drivers/hwmon/mcp9902_datum.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,19 +58,11 @@ static const unsigned short normal_i2c[] = {
#define MCP9902_REG_W_TCRIT_HYST 0x21

/*
* I2C3-SPI2 Clocks Shorted Mutex
* SPI2-I2C3 Clocks Shorted Mutex Control
*/

extern struct mutex datum_b53_spi_mutex;

static inline void spi_lock(void) { mutex_lock(&datum_b53_spi_mutex); }

static inline void spi_unlock(struct device *dev)
{
if(!pm_runtime_suspended(dev))
usleep_range(100, 200);
mutex_unlock(&datum_b53_spi_mutex);
}
void datum_b53_spi_mutex_lock(void);
void datum_b53_spi_mutex_unlock(struct device *dev);

/*
* Conversions
Expand Down Expand Up @@ -150,7 +142,7 @@ static struct mcp9902_data *mcp9902_update_device(struct device *dev)
int j;

mutex_lock(&data->update_lock);
spi_lock();
datum_b53_spi_mutex_lock();

if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) {
dev_dbg(&client->dev, "Updating mcp9902 data.\n");
Expand All @@ -169,7 +161,7 @@ static struct mcp9902_data *mcp9902_update_device(struct device *dev)
data->valid = 1;
}

spi_unlock(adapter->dev.parent);
datum_b53_spi_mutex_unlock(adapter->dev.parent);
mutex_unlock(&data->update_lock);

return data;
Expand Down Expand Up @@ -216,10 +208,10 @@ static ssize_t temp_store(struct device *dev,

mutex_lock(&data->update_lock);
data->temp[attr->index] = temp_to_reg(val);
spi_lock();
datum_b53_spi_mutex_lock();
i2c_smbus_write_byte_data(client, regs_write[attr->index],
data->temp[attr->index]);
spi_unlock(adapter->dev.parent);
datum_b53_spi_mutex_unlock(adapter->dev.parent);
mutex_unlock(&data->update_lock);
return count;
}
Expand Down Expand Up @@ -292,10 +284,10 @@ static int mcp9902_detect(struct i2c_client *client,
return -ENODEV;

/* identification */
spi_lock();
datum_b53_spi_mutex_lock();
man_id = i2c_smbus_read_byte_data(client, MCP9902_REG_R_MAN_ID);
chip_id = i2c_smbus_read_byte_data(client, MCP9902_REG_R_CHIP_ID);
spi_unlock(adapter->dev.parent);
datum_b53_spi_mutex_unlock(adapter->dev.parent);
if (man_id != 0x5D || chip_id != 0x04) {
dev_info(&adapter->dev,
"Unsupported chip (man_id=0x%02X, chip_id=0x%02X).\n",
Expand All @@ -317,10 +309,10 @@ static void mcp9902_init_client(struct i2c_client *client)
/*
* Start the conversions.
*/
spi_lock();
datum_b53_spi_mutex_lock();
i2c_smbus_write_byte_data(client, MCP9902_REG_W_CONVRATE, 5); /* 2 Hz */
i2c_smbus_write_byte_data(client, MCP9902_REG_W_CONFIG, 0x9F); /* run - extended temp */
spi_unlock(adapter->dev.parent);
datum_b53_spi_mutex_unlock(adapter->dev.parent);
}

static int mcp9902_probe(struct i2c_client *new_client,
Expand Down
51 changes: 34 additions & 17 deletions drivers/net/dsa/b53/b53_spi_datum.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,33 @@
#define B53_SPI_PAGE_SELECT 0xff

DEFINE_MUTEX(datum_b53_spi_mutex);
EXPORT_SYMBOL(datum_b53_spi_mutex);

static inline void spi_lock(void) { mutex_lock(&datum_b53_spi_mutex); }
bool datum_spi2_i2c3_clock_short = true;
EXPORT_SYMBOL(datum_spi2_i2c3_clock_short);

static inline void spi_unlock(struct device *dev)
inline void datum_b53_spi_mutex_lock(void)
{
if(datum_spi2_i2c3_clock_short)
mutex_lock(&datum_b53_spi_mutex);
}
EXPORT_SYMBOL(datum_b53_spi_mutex_lock);

inline void datum_b53_spi_mutex_unlock(struct device *dev)
{
if(datum_spi2_i2c3_clock_short)
{
if(!pm_runtime_suspended(dev))
usleep_range(100, 200);
mutex_unlock(&datum_b53_spi_mutex);
}
}
EXPORT_SYMBOL(datum_b53_spi_mutex_unlock);

inline void datum_b53_spi_mutex_force_unlock(void)
{
if(!pm_runtime_suspended(dev))
usleep_range(100, 200);
mutex_unlock(&datum_b53_spi_mutex);
}
EXPORT_SYMBOL(datum_b53_spi_mutex_force_unlock);

static inline int b53_spi_read_reg(struct spi_device *spi, u8 reg, u8 *val,
unsigned int len)
Expand Down Expand Up @@ -143,7 +160,7 @@ static int b53_spi_read(struct b53_device *dev, u8 page, u8 reg, u8 *data,
struct spi_device *spi = dev->priv;
int ret;

spi_lock();
datum_b53_spi_mutex_lock();
ret = b53_prepare_reg_access(spi, page);
if (ret)
return ret;
Expand All @@ -153,7 +170,7 @@ static int b53_spi_read(struct b53_device *dev, u8 page, u8 reg, u8 *data,
return ret;

ret = b53_spi_read_reg(spi, B53_SPI_DATA, data, len);
spi_unlock(spi->dev.parent->parent);
datum_b53_spi_mutex_unlock(spi->dev.parent->parent);

return ret;
}
Expand Down Expand Up @@ -223,7 +240,7 @@ static int b53_spi_write8(struct b53_device *dev, u8 page, u8 reg, u8 value)
u8 txbuf[3];
int retval;

spi_lock();
datum_b53_spi_mutex_lock();
ret = b53_prepare_reg_access(spi, page);
if (ret)
return ret;
Expand All @@ -233,7 +250,7 @@ static int b53_spi_write8(struct b53_device *dev, u8 page, u8 reg, u8 value)
txbuf[2] = value;

retval = spi_write(spi, txbuf, sizeof(txbuf));
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);

return retval;
}
Expand All @@ -246,7 +263,7 @@ static int b53_spi_write16(struct b53_device *dev, u8 page, u8 reg, u16 value)
u8 txbuf[4];
int retval;

spi_lock();
datum_b53_spi_mutex_lock();
ret = b53_prepare_reg_access(spi, page);
if (ret)
return ret;
Expand All @@ -256,7 +273,7 @@ static int b53_spi_write16(struct b53_device *dev, u8 page, u8 reg, u16 value)
put_unaligned_le16(value, &txbuf[2]);

retval = spi_write(spi, txbuf, sizeof(txbuf));
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);

return retval;
}
Expand All @@ -269,7 +286,7 @@ static int b53_spi_write32(struct b53_device *dev, u8 page, u8 reg, u32 value)
u8 txbuf[6];
int retval;

spi_lock();
datum_b53_spi_mutex_lock();
ret = b53_prepare_reg_access(spi, page);
if (ret)
return ret;
Expand All @@ -279,7 +296,7 @@ static int b53_spi_write32(struct b53_device *dev, u8 page, u8 reg, u32 value)
put_unaligned_le32(value, &txbuf[2]);

retval = spi_write(spi, txbuf, sizeof(txbuf));
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);

return retval;
}
Expand All @@ -292,7 +309,7 @@ static int b53_spi_write48(struct b53_device *dev, u8 page, u8 reg, u64 value)
u8 txbuf[10];
int retval;

spi_lock();
datum_b53_spi_mutex_lock();
ret = b53_prepare_reg_access(spi, page);
if (ret)
return ret;
Expand All @@ -302,7 +319,7 @@ static int b53_spi_write48(struct b53_device *dev, u8 page, u8 reg, u64 value)
put_unaligned_le64(value, &txbuf[2]);

retval = spi_write(spi, txbuf, sizeof(txbuf) - 2);
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);

return retval;
}
Expand All @@ -315,7 +332,7 @@ static int b53_spi_write64(struct b53_device *dev, u8 page, u8 reg, u64 value)
u8 txbuf[10];
int retval;

spi_lock();
datum_b53_spi_mutex_lock();
ret = b53_prepare_reg_access(spi, page);
if (ret)
return ret;
Expand All @@ -325,7 +342,7 @@ static int b53_spi_write64(struct b53_device *dev, u8 page, u8 reg, u64 value)
put_unaligned_le64(value, &txbuf[2]);

retval = spi_write(spi, txbuf, sizeof(txbuf));
spi_unlock(device);
datum_b53_spi_mutex_unlock(device);

return retval;
}
Expand Down
Loading

0 comments on commit 6114b34

Please sign in to comment.