Commit 7964f8fc authored by Vadim Pasternak's avatar Vadim Pasternak Committed by Hans de Goede

platform/mellanox: mlxreg-io: Add locking for io operations

Add lock to protect user read/write access to the registers.
Signed-off-by: default avatarVadim Pasternak <vadimp@nvidia.com>
Link: https://lore.kernel.org/r/20220711084559.62447-8-vadimp@nvidia.comReviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 095a2c18
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
* @group: sysfs attribute group; * @group: sysfs attribute group;
* @groups: list of sysfs attribute group for hwmon registration; * @groups: list of sysfs attribute group for hwmon registration;
* @regsize: size of a register value; * @regsize: size of a register value;
* @io_lock: user access locking;
*/ */
struct mlxreg_io_priv_data { struct mlxreg_io_priv_data {
struct platform_device *pdev; struct platform_device *pdev;
...@@ -41,6 +42,7 @@ struct mlxreg_io_priv_data { ...@@ -41,6 +42,7 @@ struct mlxreg_io_priv_data {
struct attribute_group group; struct attribute_group group;
const struct attribute_group *groups[2]; const struct attribute_group *groups[2];
int regsize; int regsize;
struct mutex io_lock; /* Protects user access. */
}; };
static int static int
...@@ -116,14 +118,19 @@ mlxreg_io_attr_show(struct device *dev, struct device_attribute *attr, ...@@ -116,14 +118,19 @@ mlxreg_io_attr_show(struct device *dev, struct device_attribute *attr,
u32 regval = 0; u32 regval = 0;
int ret; int ret;
mutex_lock(&priv->io_lock);
ret = mlxreg_io_get_reg(priv->pdata->regmap, data, 0, true, ret = mlxreg_io_get_reg(priv->pdata->regmap, data, 0, true,
priv->regsize, &regval); priv->regsize, &regval);
if (ret) if (ret)
goto access_error; goto access_error;
mutex_unlock(&priv->io_lock);
return sprintf(buf, "%u\n", regval); return sprintf(buf, "%u\n", regval);
access_error: access_error:
mutex_unlock(&priv->io_lock);
return ret; return ret;
} }
...@@ -145,6 +152,8 @@ mlxreg_io_attr_store(struct device *dev, struct device_attribute *attr, ...@@ -145,6 +152,8 @@ mlxreg_io_attr_store(struct device *dev, struct device_attribute *attr,
if (ret) if (ret)
return ret; return ret;
mutex_lock(&priv->io_lock);
ret = mlxreg_io_get_reg(priv->pdata->regmap, data, input_val, false, ret = mlxreg_io_get_reg(priv->pdata->regmap, data, input_val, false,
priv->regsize, &regval); priv->regsize, &regval);
if (ret) if (ret)
...@@ -154,9 +163,12 @@ mlxreg_io_attr_store(struct device *dev, struct device_attribute *attr, ...@@ -154,9 +163,12 @@ mlxreg_io_attr_store(struct device *dev, struct device_attribute *attr,
if (ret) if (ret)
goto access_error; goto access_error;
mutex_unlock(&priv->io_lock);
return len; return len;
access_error: access_error:
mutex_unlock(&priv->io_lock);
dev_err(&priv->pdev->dev, "Bus access error\n"); dev_err(&priv->pdev->dev, "Bus access error\n");
return ret; return ret;
} }
...@@ -246,16 +258,27 @@ static int mlxreg_io_probe(struct platform_device *pdev) ...@@ -246,16 +258,27 @@ static int mlxreg_io_probe(struct platform_device *pdev)
return PTR_ERR(priv->hwmon); return PTR_ERR(priv->hwmon);
} }
mutex_init(&priv->io_lock);
dev_set_drvdata(&pdev->dev, priv); dev_set_drvdata(&pdev->dev, priv);
return 0; return 0;
} }
static int mlxreg_io_remove(struct platform_device *pdev)
{
struct mlxreg_io_priv_data *priv = dev_get_drvdata(&pdev->dev);
mutex_destroy(&priv->io_lock);
return 0;
}
static struct platform_driver mlxreg_io_driver = { static struct platform_driver mlxreg_io_driver = {
.driver = { .driver = {
.name = "mlxreg-io", .name = "mlxreg-io",
}, },
.probe = mlxreg_io_probe, .probe = mlxreg_io_probe,
.remove = mlxreg_io_remove,
}; };
module_platform_driver(mlxreg_io_driver); module_platform_driver(mlxreg_io_driver);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment