net: dsa: microchip: Add shared regmap mutex
The KSZ driver uses one regmap per register width (8/16/32), each with it's own lock, but accessing the same set of registers. In theory, it is possible to create a race condition between these regmaps, although the underlying bus (SPI or I2C) locking should assure nothing bad will really happen and the accesses would be correct. To make the driver do the right thing, add one single shared mutex for all the regmaps used by the driver instead. This assures that even if some future hardware is on a bus which does not serialize the accesses the same way SPI or I2C does, nothing bad will happen. Note that the status_mutex was unused and only initied, hence it was renamed and repurposed as the regmap mutex. Signed-off-by: Marek Vasut <marex@denx.de> Cc: Andrew Lunn <andrew@lunn.ch> Cc: David S. Miller <davem@davemloft.net> Cc: Florian Fainelli <f.fainelli@gmail.com> Cc: George McCollister <george.mccollister@gmail.com> Cc: Tristram Ha <Tristram.Ha@microchip.com> Cc: Woojung Huh <woojung.huh@microchip.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
7f238ca984
commit
013572a236
@@ -25,6 +25,7 @@ KSZ_REGMAP_TABLE(ksz8795, 16, SPI_ADDR_SHIFT,
|
||||
|
||||
static int ksz8795_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
struct regmap_config rc;
|
||||
struct ksz_device *dev;
|
||||
int i, ret;
|
||||
|
||||
@@ -33,9 +34,9 @@ static int ksz8795_spi_probe(struct spi_device *spi)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ksz8795_regmap_config); i++) {
|
||||
dev->regmap[i] = devm_regmap_init_spi(spi,
|
||||
&ksz8795_regmap_config
|
||||
[i]);
|
||||
rc = ksz8795_regmap_config[i];
|
||||
rc.lock_arg = &dev->regmap_mutex;
|
||||
dev->regmap[i] = devm_regmap_init_spi(spi, &rc);
|
||||
if (IS_ERR(dev->regmap[i])) {
|
||||
ret = PTR_ERR(dev->regmap[i]);
|
||||
dev_err(&spi->dev,
|
||||
|
||||
Reference in New Issue
Block a user