Commit 68509798 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'hwlock-v5.6' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc

Pull hwspinlock updates from Bjorn Andersson:
 "This continues the transition of drivers to device managed resources
  and removal of unnecessary PM runtime integration, with cleanups to
  the SIRF, OMAP and Qualcomm hwspinlock drivers.

  It also adds Baolin as reviewer in MAINTAINERS"

* tag 'hwlock-v5.6' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc:
  hwspinlock: sirf: Use devm_hwspin_lock_register() to register hwlock controller
  hwspinlock: sirf: Remove redundant PM runtime functions
  hwspinlock: sirf: Change to use devm_platform_ioremap_resource()
  hwspinlock: omap: Use devm_kzalloc() to allocate memory
  hwspinlock: omap: Change to use devm_platform_ioremap_resource()
  hwspinlock: qcom: Use devm_hwspin_lock_register() to register hwlock controller
  hwspinlock: qcom: Remove redundant PM runtime functions
  hwspinlock: stm32: convert to devm_platform_ioremap_resource
  MAINTAINERS: Add myself as reviewer for the hwspinlock subsystem
parents cc12071f cb36017a
...@@ -7378,6 +7378,7 @@ F: drivers/hwtracing/ ...@@ -7378,6 +7378,7 @@ F: drivers/hwtracing/
HARDWARE SPINLOCK CORE HARDWARE SPINLOCK CORE
M: Ohad Ben-Cohen <ohad@wizery.com> M: Ohad Ben-Cohen <ohad@wizery.com>
M: Bjorn Andersson <bjorn.andersson@linaro.org> M: Bjorn Andersson <bjorn.andersson@linaro.org>
R: Baolin Wang <baolin.wang7@gmail.com>
L: linux-remoteproc@vger.kernel.org L: linux-remoteproc@vger.kernel.org
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc.git hwspinlock-next T: git git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc.git hwspinlock-next
......
...@@ -76,7 +76,6 @@ static int omap_hwspinlock_probe(struct platform_device *pdev) ...@@ -76,7 +76,6 @@ static int omap_hwspinlock_probe(struct platform_device *pdev)
struct device_node *node = pdev->dev.of_node; struct device_node *node = pdev->dev.of_node;
struct hwspinlock_device *bank; struct hwspinlock_device *bank;
struct hwspinlock *hwlock; struct hwspinlock *hwlock;
struct resource *res;
void __iomem *io_base; void __iomem *io_base;
int num_locks, i, ret; int num_locks, i, ret;
/* Only a single hwspinlock block device is supported */ /* Only a single hwspinlock block device is supported */
...@@ -85,13 +84,9 @@ static int omap_hwspinlock_probe(struct platform_device *pdev) ...@@ -85,13 +84,9 @@ static int omap_hwspinlock_probe(struct platform_device *pdev)
if (!node) if (!node)
return -ENODEV; return -ENODEV;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); io_base = devm_platform_ioremap_resource(pdev, 0);
if (!res) if (IS_ERR(io_base))
return -ENODEV; return PTR_ERR(io_base);
io_base = ioremap(res->start, resource_size(res));
if (!io_base)
return -ENOMEM;
/* /*
* make sure the module is enabled and clocked before reading * make sure the module is enabled and clocked before reading
...@@ -101,7 +96,7 @@ static int omap_hwspinlock_probe(struct platform_device *pdev) ...@@ -101,7 +96,7 @@ static int omap_hwspinlock_probe(struct platform_device *pdev)
ret = pm_runtime_get_sync(&pdev->dev); ret = pm_runtime_get_sync(&pdev->dev);
if (ret < 0) { if (ret < 0) {
pm_runtime_put_noidle(&pdev->dev); pm_runtime_put_noidle(&pdev->dev);
goto iounmap_base; goto runtime_err;
} }
/* Determine number of locks */ /* Determine number of locks */
...@@ -114,20 +109,21 @@ static int omap_hwspinlock_probe(struct platform_device *pdev) ...@@ -114,20 +109,21 @@ static int omap_hwspinlock_probe(struct platform_device *pdev)
*/ */
ret = pm_runtime_put(&pdev->dev); ret = pm_runtime_put(&pdev->dev);
if (ret < 0) if (ret < 0)
goto iounmap_base; goto runtime_err;
/* one of the four lsb's must be set, and nothing else */ /* one of the four lsb's must be set, and nothing else */
if (hweight_long(i & 0xf) != 1 || i > 8) { if (hweight_long(i & 0xf) != 1 || i > 8) {
ret = -EINVAL; ret = -EINVAL;
goto iounmap_base; goto runtime_err;
} }
num_locks = i * 32; /* actual number of locks in this device */ num_locks = i * 32; /* actual number of locks in this device */
bank = kzalloc(struct_size(bank, lock, num_locks), GFP_KERNEL); bank = devm_kzalloc(&pdev->dev, struct_size(bank, lock, num_locks),
GFP_KERNEL);
if (!bank) { if (!bank) {
ret = -ENOMEM; ret = -ENOMEM;
goto iounmap_base; goto runtime_err;
} }
platform_set_drvdata(pdev, bank); platform_set_drvdata(pdev, bank);
...@@ -138,25 +134,21 @@ static int omap_hwspinlock_probe(struct platform_device *pdev) ...@@ -138,25 +134,21 @@ static int omap_hwspinlock_probe(struct platform_device *pdev)
ret = hwspin_lock_register(bank, &pdev->dev, &omap_hwspinlock_ops, ret = hwspin_lock_register(bank, &pdev->dev, &omap_hwspinlock_ops,
base_id, num_locks); base_id, num_locks);
if (ret) if (ret)
goto reg_fail; goto runtime_err;
dev_dbg(&pdev->dev, "Registered %d locks with HwSpinlock core\n", dev_dbg(&pdev->dev, "Registered %d locks with HwSpinlock core\n",
num_locks); num_locks);
return 0; return 0;
reg_fail: runtime_err:
kfree(bank);
iounmap_base:
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
iounmap(io_base);
return ret; return ret;
} }
static int omap_hwspinlock_remove(struct platform_device *pdev) static int omap_hwspinlock_remove(struct platform_device *pdev)
{ {
struct hwspinlock_device *bank = platform_get_drvdata(pdev); struct hwspinlock_device *bank = platform_get_drvdata(pdev);
void __iomem *io_base = bank->lock[0].priv - LOCK_BASE_OFFSET;
int ret; int ret;
ret = hwspin_lock_unregister(bank); ret = hwspin_lock_unregister(bank);
...@@ -166,8 +158,6 @@ static int omap_hwspinlock_remove(struct platform_device *pdev) ...@@ -166,8 +158,6 @@ static int omap_hwspinlock_remove(struct platform_device *pdev)
} }
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
iounmap(io_base);
kfree(bank);
return 0; return 0;
} }
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include "hwspinlock_internal.h" #include "hwspinlock_internal.h"
...@@ -122,35 +121,12 @@ static int qcom_hwspinlock_probe(struct platform_device *pdev) ...@@ -122,35 +121,12 @@ static int qcom_hwspinlock_probe(struct platform_device *pdev)
regmap, field); regmap, field);
} }
pm_runtime_enable(&pdev->dev); return devm_hwspin_lock_register(&pdev->dev, bank, &qcom_hwspinlock_ops,
0, QCOM_MUTEX_NUM_LOCKS);
ret = hwspin_lock_register(bank, &pdev->dev, &qcom_hwspinlock_ops,
0, QCOM_MUTEX_NUM_LOCKS);
if (ret)
pm_runtime_disable(&pdev->dev);
return ret;
}
static int qcom_hwspinlock_remove(struct platform_device *pdev)
{
struct hwspinlock_device *bank = platform_get_drvdata(pdev);
int ret;
ret = hwspin_lock_unregister(bank);
if (ret) {
dev_err(&pdev->dev, "%s failed: %d\n", __func__, ret);
return ret;
}
pm_runtime_disable(&pdev->dev);
return 0;
} }
static struct platform_driver qcom_hwspinlock_driver = { static struct platform_driver qcom_hwspinlock_driver = {
.probe = qcom_hwspinlock_probe, .probe = qcom_hwspinlock_probe,
.remove = qcom_hwspinlock_remove,
.driver = { .driver = {
.name = "qcom_hwspinlock", .name = "qcom_hwspinlock",
.of_match_table = qcom_hwspinlock_of_match, .of_match_table = qcom_hwspinlock_of_match,
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/pm_runtime.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/hwspinlock.h> #include <linux/hwspinlock.h>
...@@ -56,7 +55,7 @@ static int sirf_hwspinlock_probe(struct platform_device *pdev) ...@@ -56,7 +55,7 @@ static int sirf_hwspinlock_probe(struct platform_device *pdev)
{ {
struct sirf_hwspinlock *hwspin; struct sirf_hwspinlock *hwspin;
struct hwspinlock *hwlock; struct hwspinlock *hwlock;
int idx, ret; int idx;
if (!pdev->dev.of_node) if (!pdev->dev.of_node)
return -ENODEV; return -ENODEV;
...@@ -69,9 +68,9 @@ static int sirf_hwspinlock_probe(struct platform_device *pdev) ...@@ -69,9 +68,9 @@ static int sirf_hwspinlock_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
/* retrieve io base */ /* retrieve io base */
hwspin->io_base = of_iomap(pdev->dev.of_node, 0); hwspin->io_base = devm_platform_ioremap_resource(pdev, 0);
if (!hwspin->io_base) if (IS_ERR(hwspin->io_base))
return -ENOMEM; return PTR_ERR(hwspin->io_base);
for (idx = 0; idx < HW_SPINLOCK_NUMBER; idx++) { for (idx = 0; idx < HW_SPINLOCK_NUMBER; idx++) {
hwlock = &hwspin->bank.lock[idx]; hwlock = &hwspin->bank.lock[idx];
...@@ -80,39 +79,9 @@ static int sirf_hwspinlock_probe(struct platform_device *pdev) ...@@ -80,39 +79,9 @@ static int sirf_hwspinlock_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, hwspin); platform_set_drvdata(pdev, hwspin);
pm_runtime_enable(&pdev->dev); return devm_hwspin_lock_register(&pdev->dev, &hwspin->bank,
&sirf_hwspinlock_ops, 0,
ret = hwspin_lock_register(&hwspin->bank, &pdev->dev, HW_SPINLOCK_NUMBER);
&sirf_hwspinlock_ops, 0,
HW_SPINLOCK_NUMBER);
if (ret)
goto reg_failed;
return 0;
reg_failed:
pm_runtime_disable(&pdev->dev);
iounmap(hwspin->io_base);
return ret;
}
static int sirf_hwspinlock_remove(struct platform_device *pdev)
{
struct sirf_hwspinlock *hwspin = platform_get_drvdata(pdev);
int ret;
ret = hwspin_lock_unregister(&hwspin->bank);
if (ret) {
dev_err(&pdev->dev, "%s failed: %d\n", __func__, ret);
return ret;
}
pm_runtime_disable(&pdev->dev);
iounmap(hwspin->io_base);
return 0;
} }
static const struct of_device_id sirf_hwpinlock_ids[] = { static const struct of_device_id sirf_hwpinlock_ids[] = {
...@@ -123,7 +92,6 @@ MODULE_DEVICE_TABLE(of, sirf_hwpinlock_ids); ...@@ -123,7 +92,6 @@ MODULE_DEVICE_TABLE(of, sirf_hwpinlock_ids);
static struct platform_driver sirf_hwspinlock_driver = { static struct platform_driver sirf_hwspinlock_driver = {
.probe = sirf_hwspinlock_probe, .probe = sirf_hwspinlock_probe,
.remove = sirf_hwspinlock_remove,
.driver = { .driver = {
.name = "atlas7_hwspinlock", .name = "atlas7_hwspinlock",
.of_match_table = of_match_ptr(sirf_hwpinlock_ids), .of_match_table = of_match_ptr(sirf_hwpinlock_ids),
......
...@@ -58,12 +58,10 @@ static int stm32_hwspinlock_probe(struct platform_device *pdev) ...@@ -58,12 +58,10 @@ static int stm32_hwspinlock_probe(struct platform_device *pdev)
{ {
struct stm32_hwspinlock *hw; struct stm32_hwspinlock *hw;
void __iomem *io_base; void __iomem *io_base;
struct resource *res;
size_t array_size; size_t array_size;
int i, ret; int i, ret;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); io_base = devm_platform_ioremap_resource(pdev, 0);
io_base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(io_base)) if (IS_ERR(io_base))
return PTR_ERR(io_base); return PTR_ERR(io_base);
......
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