All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW, Mutex block
@ 2015-03-11 20:42 ` Tim Bird
  0 siblings, 0 replies; 19+ messages in thread
From: Tim Bird @ 2015-03-11 20:42 UTC (permalink / raw)
  To: Bjorn Andersson, ohad
  Cc: linux-arm-msm, jhugo, s-anna, agross, linux-kernel, akpm,
	Greg Kroah-Hartman, Frank Rowand

My apologies for the dup.  gmail somehow added html to my original message and
it got rejected by multiple maillists.

> On Fri, Feb 27, 2015 at 2:30 PM, Bjorn Andersson <bjorn.andersson@sonymobile.com> wrote:
> 
> Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
> SoCs.
> 
> Based on initial effort by Kumar Gala <galak@codeaurora.org>
> 
> Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
> ---
> 
> As Andy Gross introduced the tcsr syscon we can no longer just ioremap the
> memory directly, so rework the driver to run ontop of syscon.
> 
> Changes since v5:
> - Dropped all but hwspinlock specific dt bindings
> - Hardcoded the number of locks (there is 32)
> - Rework to sit ontop of syscon
> 
> Changes since v4:
> - Aligned with devicetree support in hwlock framework and hence depends on [1]
> 
> Changes since v3:
> - Reverted back to getting stride from of_match, per Kumars request
> 
> Changes since v2:
> - MODULE_DEVICE_TABLE
> - Changed prefix to qcom
> - Cleaned up includes
> - Rely on reg and num-locks to figure out stride, instead of of_match data
> 
> Changes since v1:
> - Added the pm_runtime calls needed to be able to boot a kernel with
>   pm_runtime and this driver, patch from Courtney.
> - Added sfpb-mutex compatible, for re-use of the driver in family A platforms.
> - Updated formatting of DT binding documentation, while adding the extra
>   compatible.
> - Dropped Stephen Boyds Reviewed-by due to these changes.
> 
>  drivers/hwspinlock/Kconfig           |  11 +++
>  drivers/hwspinlock/Makefile          |   1 +
>  drivers/hwspinlock/qcom_hwspinlock.c | 181 +++++++++++++++++++++++++++++++++++
>  3 files changed, 193 insertions(+)
>  create mode 100644 drivers/hwspinlock/qcom_hwspinlock.c
> 
> diff --git a/drivers/hwspinlock/Kconfig b/drivers/hwspinlock/Kconfig
> index 3612cb5..762216d 100644
> --- a/drivers/hwspinlock/Kconfig
> +++ b/drivers/hwspinlock/Kconfig
> @@ -18,6 +18,17 @@ config HWSPINLOCK_OMAP
> 
>           If unsure, say N.
> 
> +config HWSPINLOCK_QCOM
> +       tristate "Qualcomm Hardware Spinlock device"
> +       depends on ARCH_QCOM
> +       select HWSPINLOCK
> +       help
> +         Say y here to support the Qualcomm Hardware Mutex functionality, which
> +         provides a synchronisation mechanism for the various processors on
> +         the SoC.
> +
> +         If unsure, say N.
> +
>  config HSEM_U8500
>         tristate "STE Hardware Semaphore functionality"
>         depends on ARCH_U8500
> diff --git a/drivers/hwspinlock/Makefile b/drivers/hwspinlock/Makefile
> index 93eb64b..68f95d9 100644
> --- a/drivers/hwspinlock/Makefile
> +++ b/drivers/hwspinlock/Makefile
> @@ -4,4 +4,5 @@
> 
>  obj-$(CONFIG_HWSPINLOCK)               += hwspinlock_core.o
>  obj-$(CONFIG_HWSPINLOCK_OMAP)          += omap_hwspinlock.o
> +obj-$(CONFIG_HWSPINLOCK_QCOM)          += qcom_hwspinlock.o
>  obj-$(CONFIG_HSEM_U8500)               += u8500_hsem.o
> diff --git a/drivers/hwspinlock/qcom_hwspinlock.c
> b/drivers/hwspinlock/qcom_hwspinlock.c
> new file mode 100644
> index 0000000..93b62e0
> --- /dev/null
> +++ b/drivers/hwspinlock/qcom_hwspinlock.c
> @@ -0,0 +1,181 @@
> +/*
> + * Copyright (c) 2013, The Linux Foundation. All rights reserved.
> + * Copyright (c) 2015, Sony Mobile Communications AB
> + *
> + * This software is licensed under the terms of the GNU General Public
> + * License version 2, as published by the Free Software Foundation, and
> + * may be copied, distributed, and modified under those terms.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/hwspinlock.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/mfd/syscon.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/of_device.h>
> +#include <linux/platform_device.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/regmap.h>
> +
> +#include "hwspinlock_internal.h"
> +
> +#define QCOM_MUTEX_APPS_PROC_ID        1
> +#define QCOM_MUTEX_NUM_LOCKS   32
> +
> +static int qcom_hwspinlock_trylock(struct hwspinlock *lock)
> +{
> +       struct regmap_field *field = lock->priv;
> +       u32 lock_owner;
> +       int ret;
> +
> +       ret = regmap_field_write(field, QCOM_MUTEX_APPS_PROC_ID);
> +       if (ret)
> +               return ret;
> +
> +       ret = regmap_field_read(field, &lock_owner);
> +       if (ret)
> +               return ret;
> +
> +       return lock_owner == QCOM_MUTEX_APPS_PROC_ID;
> +}
> +
> +static void qcom_hwspinlock_unlock(struct hwspinlock *lock)
> +{
> +       struct regmap_field *field = lock->priv;
> +       u32 lock_owner;
> +       int ret;
> +
> +       ret = regmap_field_read(field, &lock_owner);
> +       if (ret) {
> +               pr_err("%s: unable to query spinlock owner\n", __func__);
> +               return;
> +       }
> +
> +       if (lock_owner != QCOM_MUTEX_APPS_PROC_ID) {
> +               pr_err("%s: spinlock not owned by us (actual owner is %d)\n",
> +                               __func__, lock_owner);
> +       }
> +
> +       ret = regmap_field_write(field, 0);
> +       if (ret)
> +               pr_err("%s: failed to unlock spinlock\n", __func__);
> +}
> +
> +static const struct hwspinlock_ops qcom_hwspinlock_ops = {
> +       .trylock        = qcom_hwspinlock_trylock,
> +       .unlock         = qcom_hwspinlock_unlock,
> +};
> +
> +static const struct of_device_id qcom_hwspinlock_of_match[] = {
> +       { .compatible = "qcom,sfpb-mutex" },
> +       { .compatible = "qcom,tcsr-mutex" },
> +       { }
> +};
> +MODULE_DEVICE_TABLE(of, qcom_hwspinlock_of_match);
> +
> +static int qcom_hwspinlock_probe(struct platform_device *pdev)
> +{
> +       struct hwspinlock_device *bank;
> +       struct device_node *syscon;
> +       struct reg_field field;
> +       struct regmap *regmap;
> +       size_t array_size;
> +       u32 stride;
> +       u32 base;
> +       int ret;
> +       int i;
> +
> +       syscon = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
> +       if (!syscon) {
> +               dev_err(&pdev->dev, "no syscon property\n");
> +               return -ENODEV;
> +       }
> +
> +       regmap = syscon_node_to_regmap(syscon);
> +       if (IS_ERR(regmap))
> +               return PTR_ERR(regmap);
> +
> +       ret = of_property_read_u32_index(pdev->dev.of_node, "syscon", 1, &base);
> +       if (ret < 0) {
> +               dev_err(&pdev->dev, "no offset in syscon\n");
> +               return -EINVAL;
> +       }
> +
> +       ret = of_property_read_u32_index(pdev->dev.of_node, "syscon",
> 2, &stride);
> +       if (ret < 0) {
> +               dev_err(&pdev->dev, "no stride syscon\n");
> +               return -EINVAL;
> +       }
> +
> +       array_size = QCOM_MUTEX_NUM_LOCKS * sizeof(struct hwspinlock);
> +       bank = devm_kzalloc(&pdev->dev, sizeof(*bank) + array_size, GFP_KERNEL);
> +       if (!bank)
> +               return -ENOMEM;
> +
> +       platform_set_drvdata(pdev, bank);
> +
> +       for (i = 0; i < QCOM_MUTEX_NUM_LOCKS; i++) {
> +               field.reg = base + i * stride;
> +               field.lsb = 0;
> +               field.msb = 32;
> +
> +               bank->lock[i].priv = devm_regmap_field_alloc(&pdev->dev,
> +                                                            regmap, field);
> +       }
> +
> +       pm_runtime_enable(&pdev->dev);
> +
> +       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 = {
> +       .probe          = qcom_hwspinlock_probe,
> +       .remove         = qcom_hwspinlock_remove,
> +       .driver         = {
> +               .name   = "qcom_hwspinlock",
> +               .of_match_table = qcom_hwspinlock_of_match,
> +       },
> +};
> +
> +static int __init qcom_hwspinlock_init(void)
> +{
> +       return platform_driver_register(&qcom_hwspinlock_driver);
> +}
> +/* board init code might need to reserve hwspinlocks for predefined purposes */
> +postcore_initcall(qcom_hwspinlock_init);
> +
> +static void __exit qcom_hwspinlock_exit(void)
> +{
> +       platform_driver_unregister(&qcom_hwspinlock_driver);
> +}
> +module_exit(qcom_hwspinlock_exit);
> +
> +MODULE_LICENSE("GPL v2");
> +MODULE_DESCRIPTION("Hardware spinlock driver for Qualcomm SoCs");
> --
> 1.8.2.2

I'm pretty anxious about this one, as my current work has a dependency on it.
Virtually the entirety of the QualComm SOC work is dependent on this
because it's needed by the interprocessor communication framework
and the regulator driver.

I assume we're waiting on the response from Ohad about getting this upstream?
It's been almost 2 weeks with no reply.

Ohad - do you plan to do anything with this patch?  We seem to be at an impasse
(once again).

This is the 6th attempt over the course of the last year and a half to get
this hwspinlock code mainlined.  Should we just not use the hwspinlock
framework?

What are our options going forward?

 -- Tim Bird
Senior Software Engineer, Sony Mobile
Architecture Group Chair, CE Workgroup, Linux Foundation

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW, Mutex block
@ 2015-03-11 20:42 ` Tim Bird
  0 siblings, 0 replies; 19+ messages in thread
From: Tim Bird @ 2015-03-11 20:42 UTC (permalink / raw)
  To: Bjorn Andersson, ohad
  Cc: linux-arm-msm, jhugo, s-anna, agross, linux-kernel, akpm,
	Greg Kroah-Hartman, Frank Rowand

My apologies for the dup.  gmail somehow added html to my original message and
it got rejected by multiple maillists.

> On Fri, Feb 27, 2015 at 2:30 PM, Bjorn Andersson <bjorn.andersson@sonymobile.com> wrote:
> 
> Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
> SoCs.
> 
> Based on initial effort by Kumar Gala <galak@codeaurora.org>
> 
> Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
> ---
> 
> As Andy Gross introduced the tcsr syscon we can no longer just ioremap the
> memory directly, so rework the driver to run ontop of syscon.
> 
> Changes since v5:
> - Dropped all but hwspinlock specific dt bindings
> - Hardcoded the number of locks (there is 32)
> - Rework to sit ontop of syscon
> 
> Changes since v4:
> - Aligned with devicetree support in hwlock framework and hence depends on [1]
> 
> Changes since v3:
> - Reverted back to getting stride from of_match, per Kumars request
> 
> Changes since v2:
> - MODULE_DEVICE_TABLE
> - Changed prefix to qcom
> - Cleaned up includes
> - Rely on reg and num-locks to figure out stride, instead of of_match data
> 
> Changes since v1:
> - Added the pm_runtime calls needed to be able to boot a kernel with
>   pm_runtime and this driver, patch from Courtney.
> - Added sfpb-mutex compatible, for re-use of the driver in family A platforms.
> - Updated formatting of DT binding documentation, while adding the extra
>   compatible.
> - Dropped Stephen Boyds Reviewed-by due to these changes.
> 
>  drivers/hwspinlock/Kconfig           |  11 +++
>  drivers/hwspinlock/Makefile          |   1 +
>  drivers/hwspinlock/qcom_hwspinlock.c | 181 +++++++++++++++++++++++++++++++++++
>  3 files changed, 193 insertions(+)
>  create mode 100644 drivers/hwspinlock/qcom_hwspinlock.c
> 
> diff --git a/drivers/hwspinlock/Kconfig b/drivers/hwspinlock/Kconfig
> index 3612cb5..762216d 100644
> --- a/drivers/hwspinlock/Kconfig
> +++ b/drivers/hwspinlock/Kconfig
> @@ -18,6 +18,17 @@ config HWSPINLOCK_OMAP
> 
>           If unsure, say N.
> 
> +config HWSPINLOCK_QCOM
> +       tristate "Qualcomm Hardware Spinlock device"
> +       depends on ARCH_QCOM
> +       select HWSPINLOCK
> +       help
> +         Say y here to support the Qualcomm Hardware Mutex functionality, which
> +         provides a synchronisation mechanism for the various processors on
> +         the SoC.
> +
> +         If unsure, say N.
> +
>  config HSEM_U8500
>         tristate "STE Hardware Semaphore functionality"
>         depends on ARCH_U8500
> diff --git a/drivers/hwspinlock/Makefile b/drivers/hwspinlock/Makefile
> index 93eb64b..68f95d9 100644
> --- a/drivers/hwspinlock/Makefile
> +++ b/drivers/hwspinlock/Makefile
> @@ -4,4 +4,5 @@
> 
>  obj-$(CONFIG_HWSPINLOCK)               += hwspinlock_core.o
>  obj-$(CONFIG_HWSPINLOCK_OMAP)          += omap_hwspinlock.o
> +obj-$(CONFIG_HWSPINLOCK_QCOM)          += qcom_hwspinlock.o
>  obj-$(CONFIG_HSEM_U8500)               += u8500_hsem.o
> diff --git a/drivers/hwspinlock/qcom_hwspinlock.c
> b/drivers/hwspinlock/qcom_hwspinlock.c
> new file mode 100644
> index 0000000..93b62e0
> --- /dev/null
> +++ b/drivers/hwspinlock/qcom_hwspinlock.c
> @@ -0,0 +1,181 @@
> +/*
> + * Copyright (c) 2013, The Linux Foundation. All rights reserved.
> + * Copyright (c) 2015, Sony Mobile Communications AB
> + *
> + * This software is licensed under the terms of the GNU General Public
> + * License version 2, as published by the Free Software Foundation, and
> + * may be copied, distributed, and modified under those terms.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/hwspinlock.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/mfd/syscon.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/of_device.h>
> +#include <linux/platform_device.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/regmap.h>
> +
> +#include "hwspinlock_internal.h"
> +
> +#define QCOM_MUTEX_APPS_PROC_ID        1
> +#define QCOM_MUTEX_NUM_LOCKS   32
> +
> +static int qcom_hwspinlock_trylock(struct hwspinlock *lock)
> +{
> +       struct regmap_field *field = lock->priv;
> +       u32 lock_owner;
> +       int ret;
> +
> +       ret = regmap_field_write(field, QCOM_MUTEX_APPS_PROC_ID);
> +       if (ret)
> +               return ret;
> +
> +       ret = regmap_field_read(field, &lock_owner);
> +       if (ret)
> +               return ret;
> +
> +       return lock_owner == QCOM_MUTEX_APPS_PROC_ID;
> +}
> +
> +static void qcom_hwspinlock_unlock(struct hwspinlock *lock)
> +{
> +       struct regmap_field *field = lock->priv;
> +       u32 lock_owner;
> +       int ret;
> +
> +       ret = regmap_field_read(field, &lock_owner);
> +       if (ret) {
> +               pr_err("%s: unable to query spinlock owner\n", __func__);
> +               return;
> +       }
> +
> +       if (lock_owner != QCOM_MUTEX_APPS_PROC_ID) {
> +               pr_err("%s: spinlock not owned by us (actual owner is %d)\n",
> +                               __func__, lock_owner);
> +       }
> +
> +       ret = regmap_field_write(field, 0);
> +       if (ret)
> +               pr_err("%s: failed to unlock spinlock\n", __func__);
> +}
> +
> +static const struct hwspinlock_ops qcom_hwspinlock_ops = {
> +       .trylock        = qcom_hwspinlock_trylock,
> +       .unlock         = qcom_hwspinlock_unlock,
> +};
> +
> +static const struct of_device_id qcom_hwspinlock_of_match[] = {
> +       { .compatible = "qcom,sfpb-mutex" },
> +       { .compatible = "qcom,tcsr-mutex" },
> +       { }
> +};
> +MODULE_DEVICE_TABLE(of, qcom_hwspinlock_of_match);
> +
> +static int qcom_hwspinlock_probe(struct platform_device *pdev)
> +{
> +       struct hwspinlock_device *bank;
> +       struct device_node *syscon;
> +       struct reg_field field;
> +       struct regmap *regmap;
> +       size_t array_size;
> +       u32 stride;
> +       u32 base;
> +       int ret;
> +       int i;
> +
> +       syscon = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
> +       if (!syscon) {
> +               dev_err(&pdev->dev, "no syscon property\n");
> +               return -ENODEV;
> +       }
> +
> +       regmap = syscon_node_to_regmap(syscon);
> +       if (IS_ERR(regmap))
> +               return PTR_ERR(regmap);
> +
> +       ret = of_property_read_u32_index(pdev->dev.of_node, "syscon", 1, &base);
> +       if (ret < 0) {
> +               dev_err(&pdev->dev, "no offset in syscon\n");
> +               return -EINVAL;
> +       }
> +
> +       ret = of_property_read_u32_index(pdev->dev.of_node, "syscon",
> 2, &stride);
> +       if (ret < 0) {
> +               dev_err(&pdev->dev, "no stride syscon\n");
> +               return -EINVAL;
> +       }
> +
> +       array_size = QCOM_MUTEX_NUM_LOCKS * sizeof(struct hwspinlock);
> +       bank = devm_kzalloc(&pdev->dev, sizeof(*bank) + array_size, GFP_KERNEL);
> +       if (!bank)
> +               return -ENOMEM;
> +
> +       platform_set_drvdata(pdev, bank);
> +
> +       for (i = 0; i < QCOM_MUTEX_NUM_LOCKS; i++) {
> +               field.reg = base + i * stride;
> +               field.lsb = 0;
> +               field.msb = 32;
> +
> +               bank->lock[i].priv = devm_regmap_field_alloc(&pdev->dev,
> +                                                            regmap, field);
> +       }
> +
> +       pm_runtime_enable(&pdev->dev);
> +
> +       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 = {
> +       .probe          = qcom_hwspinlock_probe,
> +       .remove         = qcom_hwspinlock_remove,
> +       .driver         = {
> +               .name   = "qcom_hwspinlock",
> +               .of_match_table = qcom_hwspinlock_of_match,
> +       },
> +};
> +
> +static int __init qcom_hwspinlock_init(void)
> +{
> +       return platform_driver_register(&qcom_hwspinlock_driver);
> +}
> +/* board init code might need to reserve hwspinlocks for predefined purposes */
> +postcore_initcall(qcom_hwspinlock_init);
> +
> +static void __exit qcom_hwspinlock_exit(void)
> +{
> +       platform_driver_unregister(&qcom_hwspinlock_driver);
> +}
> +module_exit(qcom_hwspinlock_exit);
> +
> +MODULE_LICENSE("GPL v2");
> +MODULE_DESCRIPTION("Hardware spinlock driver for Qualcomm SoCs");
> --
> 1.8.2.2

I'm pretty anxious about this one, as my current work has a dependency on it.
Virtually the entirety of the QualComm SOC work is dependent on this
because it's needed by the interprocessor communication framework
and the regulator driver.

I assume we're waiting on the response from Ohad about getting this upstream?
It's been almost 2 weeks with no reply.

Ohad - do you plan to do anything with this patch?  We seem to be at an impasse
(once again).

This is the 6th attempt over the course of the last year and a half to get
this hwspinlock code mainlined.  Should we just not use the hwspinlock
framework?

What are our options going forward?

 -- Tim Bird
Senior Software Engineer, Sony Mobile
Architecture Group Chair, CE Workgroup, Linux Foundation

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW, Mutex block
  2015-03-11 20:42 ` Tim Bird
  (?)
@ 2015-03-11 22:15 ` Andy Gross
  2015-03-12  8:16   ` Ohad Ben-Cohen
  -1 siblings, 1 reply; 19+ messages in thread
From: Andy Gross @ 2015-03-11 22:15 UTC (permalink / raw)
  To: Tim Bird
  Cc: Bjorn Andersson, ohad, linux-arm-msm, jhugo, s-anna,
	linux-kernel, akpm, Greg Kroah-Hartman, Frank Rowand

On Wed, Mar 11, 2015 at 01:42:38PM -0700, Tim Bird wrote:

<snip>

> I'm pretty anxious about this one, as my current work has a dependency on it.
> Virtually the entirety of the QualComm SOC work is dependent on this
> because it's needed by the interprocessor communication framework
> and the regulator driver.
> 
> I assume we're waiting on the response from Ohad about getting this upstream?
> It's been almost 2 weeks with no reply.
> 
> Ohad - do you plan to do anything with this patch?  We seem to be at an impasse
> (once again).

With Suman's patches and this, the ball is in Ohad's court.   I believe Ohad
does this work in his off time as it is unpaid work.

> 
> This is the 6th attempt over the course of the last year and a half to get
> this hwspinlock code mainlined.  Should we just not use the hwspinlock
> framework?
> 
> What are our options going forward?

Not sure, aside from landing this somewhere else.  But that has it's own
inherent issues.

-- 
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW, Mutex block
  2015-03-11 22:15 ` Andy Gross
@ 2015-03-12  8:16   ` Ohad Ben-Cohen
  2015-03-12 15:26     ` Tim Bird
  0 siblings, 1 reply; 19+ messages in thread
From: Ohad Ben-Cohen @ 2015-03-12  8:16 UTC (permalink / raw)
  To: Andy Gross
  Cc: Tim Bird, Bjorn Andersson, linux-arm-msm, Jeffrey Hugo, Anna,
	Suman, linux-kernel, akpm, Greg Kroah-Hartman, Frank Rowand

On Thu, Mar 12, 2015 at 12:15 AM, Andy Gross <agross@codeaurora.org> wrote:
> On Wed, Mar 11, 2015 at 01:42:38PM -0700, Tim Bird wrote:
>
> <snip>
>
>> I'm pretty anxious about this one, as my current work has a dependency on it.
>> Virtually the entirety of the QualComm SOC work is dependent on this
>> because it's needed by the interprocessor communication framework
>> and the regulator driver.
>>
>> I assume we're waiting on the response from Ohad about getting this upstream?
>> It's been almost 2 weeks with no reply.
>>
>> Ohad - do you plan to do anything with this patch?  We seem to be at an impasse
>> (once again).
>
> With Suman's patches and this, the ball is in Ohad's court.   I believe Ohad
> does this work in his off time as it is unpaid work.

I definitely plan to get this and Suman's work merged upstream.

As Andy mentioned I'm doing this in my off time and unfortunately this
means I'm sometimes less available than I wish I was. Not too long ago
this activity (as well as the maintainership of remoteproc and rpmsg)
was graciously sponsored by one of the silicon vendors but that is no
longer the case.

Anyway I plan to get to this in the weekend, hope to push things forward.

Best,
Ohad.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW, Mutex block
  2015-03-12  8:16   ` Ohad Ben-Cohen
@ 2015-03-12 15:26     ` Tim Bird
  0 siblings, 0 replies; 19+ messages in thread
From: Tim Bird @ 2015-03-12 15:26 UTC (permalink / raw)
  To: Ohad Ben-Cohen, Andy Gross
  Cc: "Andersson, Björn",
	linux-arm-msm, Jeffrey Hugo, Anna, Suman, linux-kernel, akpm,
	Greg Kroah-Hartman, Frank Rowand



On 03/12/2015 01:16 AM, Ohad Ben-Cohen wrote:
> On Thu, Mar 12, 2015 at 12:15 AM, Andy Gross <agross@codeaurora.org> wrote:
>> On Wed, Mar 11, 2015 at 01:42:38PM -0700, Tim Bird wrote:
>>
>> <snip>
>>
>>> I'm pretty anxious about this one, as my current work has a dependency on it.
>>> Virtually the entirety of the QualComm SOC work is dependent on this
>>> because it's needed by the interprocessor communication framework
>>> and the regulator driver.
>>>
>>> I assume we're waiting on the response from Ohad about getting this upstream?
>>> It's been almost 2 weeks with no reply.
>>>
>>> Ohad - do you plan to do anything with this patch?  We seem to be at an impasse
>>> (once again).
>>
>> With Suman's patches and this, the ball is in Ohad's court.   I believe Ohad
>> does this work in his off time as it is unpaid work.
> 
> I definitely plan to get this and Suman's work merged upstream.
> 
> As Andy mentioned I'm doing this in my off time and unfortunately this
> means I'm sometimes less available than I wish I was. Not too long ago
> this activity (as well as the maintainership of remoteproc and rpmsg)
> was graciously sponsored by one of the silicon vendors but that is no
> longer the case.
> 
> Anyway I plan to get to this in the weekend, hope to push things forward.

Thanks for the response.  It's helpful to know your status.
 -- Tim

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-03-18 16:45       ` Lina Iyer
@ 2015-03-18 21:59         ` Bjorn Andersson
  0 siblings, 0 replies; 19+ messages in thread
From: Bjorn Andersson @ 2015-03-18 21:59 UTC (permalink / raw)
  To: Lina Iyer
  Cc: Ohad Ben-Cohen, linux-arm-msm, Jeffrey Hugo, Suman Anna,
	Andy Gross, linux-kernel

On Wed 18 Mar 09:45 PDT 2015, Lina Iyer wrote:

> On Wed, Mar 18 2015 at 09:56 -0600, Bjorn Andersson wrote:
> >On Thu 12 Mar 12:31 PDT 2015, Lina Iyer wrote:
> >
> >> On Fri, Feb 27 2015 at 15:30 -0700, Bjorn Andersson wrote:
[..]
> >> >+#define QCOM_MUTEX_NUM_LOCKS	32
> >>
> >> Also, talking to Jeff it seems like that out of the 32 locks defined
> >> only 8 is accessible from Linux. So its unnecessary and probably
> >> incorrect to assume that there are 32 locks available.
> >>
> >
> >The hardware block have 32 locks and the decision regarding which locks
> >this particular Linux system is allowed to access is configuration.
> >
> Understood. But while the hardware may support it, it may be right for
> Linux to be allowed to configure, giving a false sense of number of
> locks.
> 

You're not just randomly allocating these locks, the "sense of number of
locks" is most likely carried in an Excel sheet within Qualcomm.

Obviously the number 8 is arbitrary and a change of it is a question of
"system configuration" and not a matter of changing the implementation
of this device driver.

Regards,
Bjorn

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-03-18 16:12     ` Bjorn Andersson
@ 2015-03-18 19:41       ` Lina Iyer
  0 siblings, 0 replies; 19+ messages in thread
From: Lina Iyer @ 2015-03-18 19:41 UTC (permalink / raw)
  To: Bjorn Andersson
  Cc: Ohad Ben-Cohen, linux-arm-msm, Jeffrey Hugo, Suman Anna,
	Andy Gross, linux-kernel

On Wed, Mar 18 2015 at 10:12 -0600, Bjorn Andersson wrote:
>On Thu 12 Mar 15:29 PDT 2015, Lina Iyer wrote:
>
>> On Fri, Feb 27 2015 at 15:30 -0700, Bjorn Andersson wrote:
>> >Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
>> >SoCs.
>> >
>> >Based on initial effort by Kumar Gala <galak@codeaurora.org>
>> >
>> >Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
>> >+config HWSPINLOCK_QCOM
>> >+	tristate "Qualcomm Hardware Spinlock device"
Any reason, why this is tristate and not a bool?

>> >+	depends on ARCH_QCOM
>> >+	select HWSPINLOCK
>>
>> select MFD_SYSCON as well, perhaps?
>> We seem to be dependent on it.
>>
>
>Right, missed that. Thanks!
>
>Will resend with that addition.
>
>Regards,
>Bjorn
>

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-03-18 15:55     ` Bjorn Andersson
@ 2015-03-18 16:45       ` Lina Iyer
  2015-03-18 21:59         ` Bjorn Andersson
  0 siblings, 1 reply; 19+ messages in thread
From: Lina Iyer @ 2015-03-18 16:45 UTC (permalink / raw)
  To: Bjorn Andersson
  Cc: Ohad Ben-Cohen, linux-arm-msm, Jeffrey Hugo, Suman Anna,
	Andy Gross, linux-kernel

On Wed, Mar 18 2015 at 09:56 -0600, Bjorn Andersson wrote:
>On Thu 12 Mar 12:31 PDT 2015, Lina Iyer wrote:
>
>> On Fri, Feb 27 2015 at 15:30 -0700, Bjorn Andersson wrote:
>> >Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
>> >SoCs.
>> >
>> >Based on initial effort by Kumar Gala <galak@codeaurora.org>
>> >
>> >Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
>> >---
>> >
>>
>> [...]
>>
>> >+#include "hwspinlock_internal.h"
>> >+
>> >+#define QCOM_MUTEX_APPS_PROC_ID	1
>> Hi Bjorn,
>>
>> Not all locks use 1 to indicate its locked. For example lock index 7 is
>> used by cpuidle driver between HLOS and SCM. It uses a write value of
>> (128 + smp_processor_id()) to lock.
>>
>
>In other words, it's a magic number that will make sure that not more
>than one cpu enters TZ sleep code at a time.
>
Right, its a magic number of sorts.

>> A cpu acquires the remote spin lock, and calls into SCM to terminate the
>> power down sequence while passing the state of the L2. The lock help
>> guarantee the last core to hold the spinlock to have the most up to date
>> value for the L2 flush flag.
>>
>
>Yeah, I remember having to dig out the deadlock related to the
>introduction of that logic on my side (turned out to have an old TZ).
>
>There's already mutual exclusion and reference counting within TZ to
>make sure we're not turning off the caches unless this is the last core
>going down.

Yes, there is. But the perception of the last core in Linux and the last
core going down in TZ may be incorrect. Say for example, two cpus are
going down from linux - cpu0 & cpu1. cpu0 was the last core calling into
TZ from Linux and cpu1 had already done so. However, cpu1 started
handling an FIQ and therefore was blocked doing that while cpu0, went
through TZ. When each cpu calls into TZ, we provide the TZ with the L2
flush flag so as to allow TZ to also flush its secure lines before
powering the L2 down. The L2 flush flag that the cpu submits is its own
version of the system state. To get TZ to recognize the last valid l2
flush flag value from Linux, we need the hwmutex.

>I presume that the reason behind the hwmutex logic is to make sure that
>with multiple cores racing to sleep only one of them will flush the
>caches in Linux and will be the last entering TZ. Can you confirm this?
>
Its more for passing the flush flag than flushing the cache itself per-se.

>> >+#define QCOM_MUTEX_NUM_LOCKS	32
>>
>> Also, talking to Jeff it seems like that out of the 32 locks defined
>> only 8 is accessible from Linux. So its unnecessary and probably
>> incorrect to assume that there are 32 locks available.
>>
>
>The hardware block have 32 locks and the decision regarding which locks
>this particular Linux system is allowed to access is configuration.
>
Understood. But while the hardware may support it, it may be right for
Linux to be allowed to configure, giving a false sense of number of
locks.

>Regards,
>Bjorn

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-03-12 22:29   ` Lina Iyer
@ 2015-03-18 16:12     ` Bjorn Andersson
  2015-03-18 19:41       ` Lina Iyer
  0 siblings, 1 reply; 19+ messages in thread
From: Bjorn Andersson @ 2015-03-18 16:12 UTC (permalink / raw)
  To: Lina Iyer
  Cc: Ohad Ben-Cohen, linux-arm-msm, Jeffrey Hugo, Suman Anna,
	Andy Gross, linux-kernel

On Thu 12 Mar 15:29 PDT 2015, Lina Iyer wrote:

> On Fri, Feb 27 2015 at 15:30 -0700, Bjorn Andersson wrote:
> >Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
> >SoCs.
> >
> >Based on initial effort by Kumar Gala <galak@codeaurora.org>
> >
> >Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
> >+config HWSPINLOCK_QCOM
> >+	tristate "Qualcomm Hardware Spinlock device"
> >+	depends on ARCH_QCOM
> >+	select HWSPINLOCK
> 
> select MFD_SYSCON as well, perhaps?
> We seem to be dependent on it.
> 

Right, missed that. Thanks!

Will resend with that addition.

Regards,
Bjorn

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-03-12 19:55       ` Lina Iyer
@ 2015-03-18 16:10         ` Bjorn Andersson
  0 siblings, 0 replies; 19+ messages in thread
From: Bjorn Andersson @ 2015-03-18 16:10 UTC (permalink / raw)
  To: Lina Iyer
  Cc: Andy Gross, Ohad Ben-Cohen, linux-arm-msm, Jeffrey Hugo,
	Suman Anna, linux-kernel

On Thu 12 Mar 12:55 PDT 2015, Lina Iyer wrote:

> On Thu, Mar 12 2015 at 13:43 -0600, Andy Gross wrote:
> >On Thu, Mar 12, 2015 at 01:31:50PM -0600, Lina Iyer wrote:
> >> On Fri, Feb 27 2015 at 15:30 -0700, Bjorn Andersson wrote:
[..]
> >> Also, talking to Jeff it seems like that out of the 32 locks defined
> >> only 8 is accessible from Linux. So its unnecessary and probably
> >> incorrect to assume that there are 32 locks available.
> >
> >Out of curiosity, this is a TZ thing?  If so, we'd expect issues if someone
> >decides to utilize resources that, while technically are present, are unusable
> >by that processor.  This is not that much different from someone misconfiguring
> >an EE on a DMA controller.
> >
> Per Jeff, the protection unit doesnt generally allow access to locks > 8
> and shouldnt be allowed and in some SoC's where they dont have the
> protection, it might still be a bad idea. It would be safer to restrict to
> 8, than allow all 32 and hope somebody doesnt do the wrong thing.
> 

You have the same problem with all peripherals that are shared between
the various subsystems; e.g. the BLSPs used by the sensor DSP shouldn't
be touched by the Linux system.

But what if Linux runs on the sensor DSP?


The driver should support the hardware and the system configuration (DT)
should make sure the valid resources are accessed.

Regards,
Bjorn

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-03-12 19:31   ` Lina Iyer
  2015-03-12 19:43     ` Andy Gross
@ 2015-03-18 15:55     ` Bjorn Andersson
  2015-03-18 16:45       ` Lina Iyer
  1 sibling, 1 reply; 19+ messages in thread
From: Bjorn Andersson @ 2015-03-18 15:55 UTC (permalink / raw)
  To: Lina Iyer
  Cc: Ohad Ben-Cohen, linux-arm-msm, Jeffrey Hugo, Suman Anna,
	Andy Gross, linux-kernel

On Thu 12 Mar 12:31 PDT 2015, Lina Iyer wrote:

> On Fri, Feb 27 2015 at 15:30 -0700, Bjorn Andersson wrote:
> >Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
> >SoCs.
> >
> >Based on initial effort by Kumar Gala <galak@codeaurora.org>
> >
> >Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
> >---
> >
> 
> [...]
> 
> >+#include "hwspinlock_internal.h"
> >+
> >+#define QCOM_MUTEX_APPS_PROC_ID	1
> Hi Bjorn,
> 
> Not all locks use 1 to indicate its locked. For example lock index 7 is
> used by cpuidle driver between HLOS and SCM. It uses a write value of
> (128 + smp_processor_id()) to lock.
> 

In other words, it's a magic number that will make sure that not more
than one cpu enters TZ sleep code at a time.

> A cpu acquires the remote spin lock, and calls into SCM to terminate the
> power down sequence while passing the state of the L2. The lock help
> guarantee the last core to hold the spinlock to have the most up to date
> value for the L2 flush flag.
> 

Yeah, I remember having to dig out the deadlock related to the
introduction of that logic on my side (turned out to have an old TZ).

There's already mutual exclusion and reference counting within TZ to
make sure we're not turning off the caches unless this is the last core
going down.
I presume that the reason behind the hwmutex logic is to make sure that
with multiple cores racing to sleep only one of them will flush the
caches in Linux and will be the last entering TZ. Can you confirm this?

> >+#define QCOM_MUTEX_NUM_LOCKS	32
> 
> Also, talking to Jeff it seems like that out of the 32 locks defined
> only 8 is accessible from Linux. So its unnecessary and probably
> incorrect to assume that there are 32 locks available.
> 

The hardware block have 32 locks and the decision regarding which locks
this particular Linux system is allowed to access is configuration.

Regards,
Bjorn

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-02-27 22:30   ` Bjorn Andersson
                     ` (3 preceding siblings ...)
  (?)
@ 2015-03-16 22:38   ` Jeffrey Hugo
  -1 siblings, 0 replies; 19+ messages in thread
From: Jeffrey Hugo @ 2015-03-16 22:38 UTC (permalink / raw)
  To: Bjorn Andersson, Ohad Ben-Cohen
  Cc: linux-arm-msm, Suman Anna, Andy Gross, linux-kernel

On 2/27/2015 3:30 PM, Bjorn Andersson wrote:
> Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
> SoCs.
>
> Based on initial effort by Kumar Gala <galak@codeaurora.org>
>
> Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
> ---

Reviewed-by: Jeffrey Hugo <jhugo@codeaurora.org>

I don't see any reason to hold up this patch.  We can come to a 
conclusion on the number of locks and how to handle the lock 7 special 
case as an independent follow up.

Thanks sticking with this and getting it finalized.

-- 
Jeffrey Hugo
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora 
Forum, a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-02-27 22:30   ` Bjorn Andersson
                     ` (2 preceding siblings ...)
  (?)
@ 2015-03-12 22:29   ` Lina Iyer
  2015-03-18 16:12     ` Bjorn Andersson
  -1 siblings, 1 reply; 19+ messages in thread
From: Lina Iyer @ 2015-03-12 22:29 UTC (permalink / raw)
  To: Bjorn Andersson
  Cc: Ohad Ben-Cohen, linux-arm-msm, Jeffrey Hugo, Suman Anna,
	Andy Gross, linux-kernel

On Fri, Feb 27 2015 at 15:30 -0700, Bjorn Andersson wrote:
>Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
>SoCs.
>
>Based on initial effort by Kumar Gala <galak@codeaurora.org>
>
>Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
>+config HWSPINLOCK_QCOM
>+	tristate "Qualcomm Hardware Spinlock device"
>+	depends on ARCH_QCOM
>+	select HWSPINLOCK

select MFD_SYSCON as well, perhaps?
We seem to be dependent on it.

>+	help
>+	  Say y here to support the Qualcomm Hardware Mutex functionality, which
>+	  provides a synchronisation mechanism for the various processors on
>+	  the SoC.
>+
>+	  If unsure, say N.
>+

Thanks,
Lina

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-03-12 19:43     ` Andy Gross
@ 2015-03-12 19:55       ` Lina Iyer
  2015-03-18 16:10         ` Bjorn Andersson
  0 siblings, 1 reply; 19+ messages in thread
From: Lina Iyer @ 2015-03-12 19:55 UTC (permalink / raw)
  To: Andy Gross
  Cc: Bjorn Andersson, Ohad Ben-Cohen, linux-arm-msm, Jeffrey Hugo,
	Suman Anna, linux-kernel

On Thu, Mar 12 2015 at 13:43 -0600, Andy Gross wrote:
>On Thu, Mar 12, 2015 at 01:31:50PM -0600, Lina Iyer wrote:
>> On Fri, Feb 27 2015 at 15:30 -0700, Bjorn Andersson wrote:
>> >Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
>> >SoCs.
>> >
>> >Based on initial effort by Kumar Gala <galak@codeaurora.org>
>> >
>> >Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
>> >---
>> >
>>
>> [...]
>>
>> >+#include "hwspinlock_internal.h"
>> >+
>> >+#define QCOM_MUTEX_APPS_PROC_ID	1
>> Hi Bjorn,
>>
>> Not all locks use 1 to indicate its locked. For example lock index 7 is
>> used by cpuidle driver between HLOS and SCM. It uses a write value of
>> (128 + smp_processor_id()) to lock.
>
>So this was the lock_rlock_id API?
>
Correct.
>>
>> A cpu acquires the remote spin lock, and calls into SCM to terminate the
>> power down sequence while passing the state of the L2. The lock help
>> guarantee the last core to hold the spinlock to have the most up to date
>> value for the L2 flush flag.
>>
>> >+#define QCOM_MUTEX_NUM_LOCKS	32
>>
>> Also, talking to Jeff it seems like that out of the 32 locks defined
>> only 8 is accessible from Linux. So its unnecessary and probably
>> incorrect to assume that there are 32 locks available.
>
>Out of curiosity, this is a TZ thing?  If so, we'd expect issues if someone
>decides to utilize resources that, while technically are present, are unusable
>by that processor.  This is not that much different from someone misconfiguring
>an EE on a DMA controller.
>
Per Jeff, the protection unit doesnt generally allow access to locks > 8
and shouldnt be allowed and in some SoC's where they dont have the
protection, it might still be a bad idea. It would be safer to restrict to
8, than allow all 32 and hope somebody doesnt do the wrong thing.

>> >+{
>> >+	struct regmap_field *field = lock->priv;
>> >+	u32 lock_owner;
>> >+	int ret;
>> >+
>> >+	ret = regmap_field_write(field, QCOM_MUTEX_APPS_PROC_ID);
>> >+	if (ret)
>> >+		return ret;
>> >+
>> >+	ret = regmap_field_read(field, &lock_owner);
>> >+	if (ret)
>> >+		return ret;
>> >+
>> >+	return lock_owner == QCOM_MUTEX_APPS_PROC_ID;
>> >+}
>> >+
>>
>
>-- 
>Qualcomm Innovation Center, Inc.
>The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
>a Linux Foundation Collaborative Project
>

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-03-12 19:31   ` Lina Iyer
@ 2015-03-12 19:43     ` Andy Gross
  2015-03-12 19:55       ` Lina Iyer
  2015-03-18 15:55     ` Bjorn Andersson
  1 sibling, 1 reply; 19+ messages in thread
From: Andy Gross @ 2015-03-12 19:43 UTC (permalink / raw)
  To: Lina Iyer
  Cc: Bjorn Andersson, Ohad Ben-Cohen, linux-arm-msm, Jeffrey Hugo,
	Suman Anna, linux-kernel

On Thu, Mar 12, 2015 at 01:31:50PM -0600, Lina Iyer wrote:
> On Fri, Feb 27 2015 at 15:30 -0700, Bjorn Andersson wrote:
> >Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
> >SoCs.
> >
> >Based on initial effort by Kumar Gala <galak@codeaurora.org>
> >
> >Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
> >---
> >
> 
> [...]
> 
> >+#include "hwspinlock_internal.h"
> >+
> >+#define QCOM_MUTEX_APPS_PROC_ID	1
> Hi Bjorn,
> 
> Not all locks use 1 to indicate its locked. For example lock index 7 is
> used by cpuidle driver between HLOS and SCM. It uses a write value of
> (128 + smp_processor_id()) to lock.

So this was the lock_rlock_id API?

> 
> A cpu acquires the remote spin lock, and calls into SCM to terminate the
> power down sequence while passing the state of the L2. The lock help
> guarantee the last core to hold the spinlock to have the most up to date
> value for the L2 flush flag.
> 
> >+#define QCOM_MUTEX_NUM_LOCKS	32
> 
> Also, talking to Jeff it seems like that out of the 32 locks defined
> only 8 is accessible from Linux. So its unnecessary and probably
> incorrect to assume that there are 32 locks available.

Out of curiosity, this is a TZ thing?  If so, we'd expect issues if someone
decides to utilize resources that, while technically are present, are unusable
by that processor.  This is not that much different from someone misconfiguring
an EE on a DMA controller.

> >+{
> >+	struct regmap_field *field = lock->priv;
> >+	u32 lock_owner;
> >+	int ret;
> >+
> >+	ret = regmap_field_write(field, QCOM_MUTEX_APPS_PROC_ID);
> >+	if (ret)
> >+		return ret;
> >+
> >+	ret = regmap_field_read(field, &lock_owner);
> >+	if (ret)
> >+		return ret;
> >+
> >+	return lock_owner == QCOM_MUTEX_APPS_PROC_ID;
> >+}
> >+
> 

-- 
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-02-27 22:30   ` Bjorn Andersson
  (?)
  (?)
@ 2015-03-12 19:31   ` Lina Iyer
  2015-03-12 19:43     ` Andy Gross
  2015-03-18 15:55     ` Bjorn Andersson
  -1 siblings, 2 replies; 19+ messages in thread
From: Lina Iyer @ 2015-03-12 19:31 UTC (permalink / raw)
  To: Bjorn Andersson
  Cc: Ohad Ben-Cohen, linux-arm-msm, Jeffrey Hugo, Suman Anna,
	Andy Gross, linux-kernel

On Fri, Feb 27 2015 at 15:30 -0700, Bjorn Andersson wrote:
>Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
>SoCs.
>
>Based on initial effort by Kumar Gala <galak@codeaurora.org>
>
>Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
>---
>

[...]

>+#include "hwspinlock_internal.h"
>+
>+#define QCOM_MUTEX_APPS_PROC_ID	1
Hi Bjorn,

Not all locks use 1 to indicate its locked. For example lock index 7 is
used by cpuidle driver between HLOS and SCM. It uses a write value of
(128 + smp_processor_id()) to lock.

A cpu acquires the remote spin lock, and calls into SCM to terminate the
power down sequence while passing the state of the L2. The lock help
guarantee the last core to hold the spinlock to have the most up to date
value for the L2 flush flag.

>+#define QCOM_MUTEX_NUM_LOCKS	32

Also, talking to Jeff it seems like that out of the 32 locks defined
only 8 is accessible from Linux. So its unnecessary and probably
incorrect to assume that there are 32 locks available.

Thanks,
Lina

>+{
>+	struct regmap_field *field = lock->priv;
>+	u32 lock_owner;
>+	int ret;
>+
>+	ret = regmap_field_write(field, QCOM_MUTEX_APPS_PROC_ID);
>+	if (ret)
>+		return ret;
>+
>+	ret = regmap_field_read(field, &lock_owner);
>+	if (ret)
>+		return ret;
>+
>+	return lock_owner == QCOM_MUTEX_APPS_PROC_ID;
>+}
>+

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-02-27 22:30   ` Bjorn Andersson
  (?)
@ 2015-03-11 21:09   ` Andy Gross
  -1 siblings, 0 replies; 19+ messages in thread
From: Andy Gross @ 2015-03-11 21:09 UTC (permalink / raw)
  To: Bjorn Andersson
  Cc: Ohad Ben-Cohen, linux-arm-msm, Jeffrey Hugo, Suman Anna, linux-kernel

On Fri, Feb 27, 2015 at 02:30:17PM -0800, Bjorn Andersson wrote:
> Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
> SoCs.
> 
> Based on initial effort by Kumar Gala <galak@codeaurora.org>
> 
> Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>

Reviewed-by: Andy Gross <agross@codeaurora.org>

-- 
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
  2015-02-27 22:30 [PATCH v6 1/2] DT: hwspinlock: Add binding documentation for Qualcomm hwmutex Bjorn Andersson
@ 2015-02-27 22:30   ` Bjorn Andersson
  0 siblings, 0 replies; 19+ messages in thread
From: Bjorn Andersson @ 2015-02-27 22:30 UTC (permalink / raw)
  To: Bjorn Andersson, Ohad Ben-Cohen
  Cc: linux-arm-msm, Jeffrey Hugo, Suman Anna, Andy Gross, linux-kernel

Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
SoCs.

Based on initial effort by Kumar Gala <galak@codeaurora.org>

Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
---

As Andy Gross introduced the tcsr syscon we can no longer just ioremap the
memory directly, so rework the driver to run ontop of syscon.

Changes since v5:
- Dropped all but hwspinlock specific dt bindings
- Hardcoded the number of locks (there is 32)
- Rework to sit ontop of syscon

Changes since v4:
- Aligned with devicetree support in hwlock framework and hence depends on [1]

Changes since v3:
- Reverted back to getting stride from of_match, per Kumars request

Changes since v2:
- MODULE_DEVICE_TABLE
- Changed prefix to qcom
- Cleaned up includes
- Rely on reg and num-locks to figure out stride, instead of of_match data

Changes since v1:
- Added the pm_runtime calls needed to be able to boot a kernel with
  pm_runtime and this driver, patch from Courtney.
- Added sfpb-mutex compatible, for re-use of the driver in family A platforms.
- Updated formatting of DT binding documentation, while adding the extra
  compatible.
- Dropped Stephen Boyds Reviewed-by due to these changes.

 drivers/hwspinlock/Kconfig           |  11 +++
 drivers/hwspinlock/Makefile          |   1 +
 drivers/hwspinlock/qcom_hwspinlock.c | 181 +++++++++++++++++++++++++++++++++++
 3 files changed, 193 insertions(+)
 create mode 100644 drivers/hwspinlock/qcom_hwspinlock.c

diff --git a/drivers/hwspinlock/Kconfig b/drivers/hwspinlock/Kconfig
index 3612cb5..762216d 100644
--- a/drivers/hwspinlock/Kconfig
+++ b/drivers/hwspinlock/Kconfig
@@ -18,6 +18,17 @@ config HWSPINLOCK_OMAP
 
 	  If unsure, say N.
 
+config HWSPINLOCK_QCOM
+	tristate "Qualcomm Hardware Spinlock device"
+	depends on ARCH_QCOM
+	select HWSPINLOCK
+	help
+	  Say y here to support the Qualcomm Hardware Mutex functionality, which
+	  provides a synchronisation mechanism for the various processors on
+	  the SoC.
+
+	  If unsure, say N.
+
 config HSEM_U8500
 	tristate "STE Hardware Semaphore functionality"
 	depends on ARCH_U8500
diff --git a/drivers/hwspinlock/Makefile b/drivers/hwspinlock/Makefile
index 93eb64b..68f95d9 100644
--- a/drivers/hwspinlock/Makefile
+++ b/drivers/hwspinlock/Makefile
@@ -4,4 +4,5 @@
 
 obj-$(CONFIG_HWSPINLOCK)		+= hwspinlock_core.o
 obj-$(CONFIG_HWSPINLOCK_OMAP)		+= omap_hwspinlock.o
+obj-$(CONFIG_HWSPINLOCK_QCOM)		+= qcom_hwspinlock.o
 obj-$(CONFIG_HSEM_U8500)		+= u8500_hsem.o
diff --git a/drivers/hwspinlock/qcom_hwspinlock.c b/drivers/hwspinlock/qcom_hwspinlock.c
new file mode 100644
index 0000000..93b62e0
--- /dev/null
+++ b/drivers/hwspinlock/qcom_hwspinlock.c
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015, Sony Mobile Communications AB
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/hwspinlock.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+
+#include "hwspinlock_internal.h"
+
+#define QCOM_MUTEX_APPS_PROC_ID	1
+#define QCOM_MUTEX_NUM_LOCKS	32
+
+static int qcom_hwspinlock_trylock(struct hwspinlock *lock)
+{
+	struct regmap_field *field = lock->priv;
+	u32 lock_owner;
+	int ret;
+
+	ret = regmap_field_write(field, QCOM_MUTEX_APPS_PROC_ID);
+	if (ret)
+		return ret;
+
+	ret = regmap_field_read(field, &lock_owner);
+	if (ret)
+		return ret;
+
+	return lock_owner == QCOM_MUTEX_APPS_PROC_ID;
+}
+
+static void qcom_hwspinlock_unlock(struct hwspinlock *lock)
+{
+	struct regmap_field *field = lock->priv;
+	u32 lock_owner;
+	int ret;
+
+	ret = regmap_field_read(field, &lock_owner);
+	if (ret) {
+		pr_err("%s: unable to query spinlock owner\n", __func__);
+		return;
+	}
+
+	if (lock_owner != QCOM_MUTEX_APPS_PROC_ID) {
+		pr_err("%s: spinlock not owned by us (actual owner is %d)\n",
+				__func__, lock_owner);
+	}
+
+	ret = regmap_field_write(field, 0);
+	if (ret)
+		pr_err("%s: failed to unlock spinlock\n", __func__);
+}
+
+static const struct hwspinlock_ops qcom_hwspinlock_ops = {
+	.trylock	= qcom_hwspinlock_trylock,
+	.unlock		= qcom_hwspinlock_unlock,
+};
+
+static const struct of_device_id qcom_hwspinlock_of_match[] = {
+	{ .compatible = "qcom,sfpb-mutex" },
+	{ .compatible = "qcom,tcsr-mutex" },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, qcom_hwspinlock_of_match);
+
+static int qcom_hwspinlock_probe(struct platform_device *pdev)
+{
+	struct hwspinlock_device *bank;
+	struct device_node *syscon;
+	struct reg_field field;
+	struct regmap *regmap;
+	size_t array_size;
+	u32 stride;
+	u32 base;
+	int ret;
+	int i;
+
+	syscon = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
+	if (!syscon) {
+		dev_err(&pdev->dev, "no syscon property\n");
+		return -ENODEV;
+	}
+
+	regmap = syscon_node_to_regmap(syscon);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
+	ret = of_property_read_u32_index(pdev->dev.of_node, "syscon", 1, &base);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "no offset in syscon\n");
+		return -EINVAL;
+	}
+
+	ret = of_property_read_u32_index(pdev->dev.of_node, "syscon", 2, &stride);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "no stride syscon\n");
+		return -EINVAL;
+	}
+
+	array_size = QCOM_MUTEX_NUM_LOCKS * sizeof(struct hwspinlock);
+	bank = devm_kzalloc(&pdev->dev, sizeof(*bank) + array_size, GFP_KERNEL);
+	if (!bank)
+		return -ENOMEM;
+
+	platform_set_drvdata(pdev, bank);
+
+	for (i = 0; i < QCOM_MUTEX_NUM_LOCKS; i++) {
+		field.reg = base + i * stride;
+		field.lsb = 0;
+		field.msb = 32;
+
+		bank->lock[i].priv = devm_regmap_field_alloc(&pdev->dev,
+							     regmap, field);
+	}
+
+	pm_runtime_enable(&pdev->dev);
+
+	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 = {
+	.probe		= qcom_hwspinlock_probe,
+	.remove		= qcom_hwspinlock_remove,
+	.driver		= {
+		.name	= "qcom_hwspinlock",
+		.of_match_table = qcom_hwspinlock_of_match,
+	},
+};
+
+static int __init qcom_hwspinlock_init(void)
+{
+	return platform_driver_register(&qcom_hwspinlock_driver);
+}
+/* board init code might need to reserve hwspinlocks for predefined purposes */
+postcore_initcall(qcom_hwspinlock_init);
+
+static void __exit qcom_hwspinlock_exit(void)
+{
+	platform_driver_unregister(&qcom_hwspinlock_driver);
+}
+module_exit(qcom_hwspinlock_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("Hardware spinlock driver for Qualcomm SoCs");
-- 
1.8.2.2

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block
@ 2015-02-27 22:30   ` Bjorn Andersson
  0 siblings, 0 replies; 19+ messages in thread
From: Bjorn Andersson @ 2015-02-27 22:30 UTC (permalink / raw)
  To: Bjorn Andersson, Ohad Ben-Cohen
  Cc: linux-arm-msm, Jeffrey Hugo, Suman Anna, Andy Gross, linux-kernel

Add driver for Qualcomm Hardware Mutex block found in many Qualcomm
SoCs.

Based on initial effort by Kumar Gala <galak@codeaurora.org>

Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
---

As Andy Gross introduced the tcsr syscon we can no longer just ioremap the
memory directly, so rework the driver to run ontop of syscon.

Changes since v5:
- Dropped all but hwspinlock specific dt bindings
- Hardcoded the number of locks (there is 32)
- Rework to sit ontop of syscon

Changes since v4:
- Aligned with devicetree support in hwlock framework and hence depends on [1]

Changes since v3:
- Reverted back to getting stride from of_match, per Kumars request

Changes since v2:
- MODULE_DEVICE_TABLE
- Changed prefix to qcom
- Cleaned up includes
- Rely on reg and num-locks to figure out stride, instead of of_match data

Changes since v1:
- Added the pm_runtime calls needed to be able to boot a kernel with
  pm_runtime and this driver, patch from Courtney.
- Added sfpb-mutex compatible, for re-use of the driver in family A platforms.
- Updated formatting of DT binding documentation, while adding the extra
  compatible.
- Dropped Stephen Boyds Reviewed-by due to these changes.

 drivers/hwspinlock/Kconfig           |  11 +++
 drivers/hwspinlock/Makefile          |   1 +
 drivers/hwspinlock/qcom_hwspinlock.c | 181 +++++++++++++++++++++++++++++++++++
 3 files changed, 193 insertions(+)
 create mode 100644 drivers/hwspinlock/qcom_hwspinlock.c

diff --git a/drivers/hwspinlock/Kconfig b/drivers/hwspinlock/Kconfig
index 3612cb5..762216d 100644
--- a/drivers/hwspinlock/Kconfig
+++ b/drivers/hwspinlock/Kconfig
@@ -18,6 +18,17 @@ config HWSPINLOCK_OMAP
 
 	  If unsure, say N.
 
+config HWSPINLOCK_QCOM
+	tristate "Qualcomm Hardware Spinlock device"
+	depends on ARCH_QCOM
+	select HWSPINLOCK
+	help
+	  Say y here to support the Qualcomm Hardware Mutex functionality, which
+	  provides a synchronisation mechanism for the various processors on
+	  the SoC.
+
+	  If unsure, say N.
+
 config HSEM_U8500
 	tristate "STE Hardware Semaphore functionality"
 	depends on ARCH_U8500
diff --git a/drivers/hwspinlock/Makefile b/drivers/hwspinlock/Makefile
index 93eb64b..68f95d9 100644
--- a/drivers/hwspinlock/Makefile
+++ b/drivers/hwspinlock/Makefile
@@ -4,4 +4,5 @@
 
 obj-$(CONFIG_HWSPINLOCK)		+= hwspinlock_core.o
 obj-$(CONFIG_HWSPINLOCK_OMAP)		+= omap_hwspinlock.o
+obj-$(CONFIG_HWSPINLOCK_QCOM)		+= qcom_hwspinlock.o
 obj-$(CONFIG_HSEM_U8500)		+= u8500_hsem.o
diff --git a/drivers/hwspinlock/qcom_hwspinlock.c b/drivers/hwspinlock/qcom_hwspinlock.c
new file mode 100644
index 0000000..93b62e0
--- /dev/null
+++ b/drivers/hwspinlock/qcom_hwspinlock.c
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015, Sony Mobile Communications AB
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/hwspinlock.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+
+#include "hwspinlock_internal.h"
+
+#define QCOM_MUTEX_APPS_PROC_ID	1
+#define QCOM_MUTEX_NUM_LOCKS	32
+
+static int qcom_hwspinlock_trylock(struct hwspinlock *lock)
+{
+	struct regmap_field *field = lock->priv;
+	u32 lock_owner;
+	int ret;
+
+	ret = regmap_field_write(field, QCOM_MUTEX_APPS_PROC_ID);
+	if (ret)
+		return ret;
+
+	ret = regmap_field_read(field, &lock_owner);
+	if (ret)
+		return ret;
+
+	return lock_owner == QCOM_MUTEX_APPS_PROC_ID;
+}
+
+static void qcom_hwspinlock_unlock(struct hwspinlock *lock)
+{
+	struct regmap_field *field = lock->priv;
+	u32 lock_owner;
+	int ret;
+
+	ret = regmap_field_read(field, &lock_owner);
+	if (ret) {
+		pr_err("%s: unable to query spinlock owner\n", __func__);
+		return;
+	}
+
+	if (lock_owner != QCOM_MUTEX_APPS_PROC_ID) {
+		pr_err("%s: spinlock not owned by us (actual owner is %d)\n",
+				__func__, lock_owner);
+	}
+
+	ret = regmap_field_write(field, 0);
+	if (ret)
+		pr_err("%s: failed to unlock spinlock\n", __func__);
+}
+
+static const struct hwspinlock_ops qcom_hwspinlock_ops = {
+	.trylock	= qcom_hwspinlock_trylock,
+	.unlock		= qcom_hwspinlock_unlock,
+};
+
+static const struct of_device_id qcom_hwspinlock_of_match[] = {
+	{ .compatible = "qcom,sfpb-mutex" },
+	{ .compatible = "qcom,tcsr-mutex" },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, qcom_hwspinlock_of_match);
+
+static int qcom_hwspinlock_probe(struct platform_device *pdev)
+{
+	struct hwspinlock_device *bank;
+	struct device_node *syscon;
+	struct reg_field field;
+	struct regmap *regmap;
+	size_t array_size;
+	u32 stride;
+	u32 base;
+	int ret;
+	int i;
+
+	syscon = of_parse_phandle(pdev->dev.of_node, "syscon", 0);
+	if (!syscon) {
+		dev_err(&pdev->dev, "no syscon property\n");
+		return -ENODEV;
+	}
+
+	regmap = syscon_node_to_regmap(syscon);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
+	ret = of_property_read_u32_index(pdev->dev.of_node, "syscon", 1, &base);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "no offset in syscon\n");
+		return -EINVAL;
+	}
+
+	ret = of_property_read_u32_index(pdev->dev.of_node, "syscon", 2, &stride);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "no stride syscon\n");
+		return -EINVAL;
+	}
+
+	array_size = QCOM_MUTEX_NUM_LOCKS * sizeof(struct hwspinlock);
+	bank = devm_kzalloc(&pdev->dev, sizeof(*bank) + array_size, GFP_KERNEL);
+	if (!bank)
+		return -ENOMEM;
+
+	platform_set_drvdata(pdev, bank);
+
+	for (i = 0; i < QCOM_MUTEX_NUM_LOCKS; i++) {
+		field.reg = base + i * stride;
+		field.lsb = 0;
+		field.msb = 32;
+
+		bank->lock[i].priv = devm_regmap_field_alloc(&pdev->dev,
+							     regmap, field);
+	}
+
+	pm_runtime_enable(&pdev->dev);
+
+	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 = {
+	.probe		= qcom_hwspinlock_probe,
+	.remove		= qcom_hwspinlock_remove,
+	.driver		= {
+		.name	= "qcom_hwspinlock",
+		.of_match_table = qcom_hwspinlock_of_match,
+	},
+};
+
+static int __init qcom_hwspinlock_init(void)
+{
+	return platform_driver_register(&qcom_hwspinlock_driver);
+}
+/* board init code might need to reserve hwspinlocks for predefined purposes */
+postcore_initcall(qcom_hwspinlock_init);
+
+static void __exit qcom_hwspinlock_exit(void)
+{
+	platform_driver_unregister(&qcom_hwspinlock_driver);
+}
+module_exit(qcom_hwspinlock_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("Hardware spinlock driver for Qualcomm SoCs");
-- 
1.8.2.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2015-03-18 21:59 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-11 20:42 [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW, Mutex block Tim Bird
2015-03-11 20:42 ` Tim Bird
2015-03-11 22:15 ` Andy Gross
2015-03-12  8:16   ` Ohad Ben-Cohen
2015-03-12 15:26     ` Tim Bird
  -- strict thread matches above, loose matches on Subject: below --
2015-02-27 22:30 [PATCH v6 1/2] DT: hwspinlock: Add binding documentation for Qualcomm hwmutex Bjorn Andersson
2015-02-27 22:30 ` [PATCH v6 2/2] hwspinlock: qcom: Add support for Qualcomm HW Mutex block Bjorn Andersson
2015-02-27 22:30   ` Bjorn Andersson
2015-03-11 21:09   ` Andy Gross
2015-03-12 19:31   ` Lina Iyer
2015-03-12 19:43     ` Andy Gross
2015-03-12 19:55       ` Lina Iyer
2015-03-18 16:10         ` Bjorn Andersson
2015-03-18 15:55     ` Bjorn Andersson
2015-03-18 16:45       ` Lina Iyer
2015-03-18 21:59         ` Bjorn Andersson
2015-03-12 22:29   ` Lina Iyer
2015-03-18 16:12     ` Bjorn Andersson
2015-03-18 19:41       ` Lina Iyer
2015-03-16 22:38   ` Jeffrey Hugo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.