mbox series

[v10,0/6] Add support for Qualcomm A53 CPU clock

Message ID 20171201170224.25053-1-georgi.djakov@linaro.org
Headers show
Series Add support for Qualcomm A53 CPU clock | expand

Message

Georgi Djakov Dec. 1, 2017, 5:02 p.m. UTC
This patchset adds support for the A53 CPU clock on MSM8916 platforms
and allows scaling of the CPU frequency on msm8916 based platforms.

Changes since v9 (https://lkml.org/lkml/2017/9/21/511)
* Added the clock properties to the APCS DT node, instead of adding a subnode
and also replaced patch "mailbox: qcom: Populate APCS child platform devices"
with "mailbox: qcom: Create APCS child device for clock controller".
* Dropped patch "mailbox: qcom: Move the apcs struct into a separate header",
and use dev_get_regmap(dev->parent) in the child driver.
* Addressed Bjorn's comments on a53-pll and apcs-clk drivers.
* Added SPDX copyright identifiers.

Changes since v8 (https://lkml.org/lkml/2017/6/23/476)
 * Converted APCS mailbox driver to use regmap and to populate child
 platform devices that will handle the rest of the functionality
 provided by APCS block.
 * Picked Rob's Ack for the PLL binding.
 * Changed the APCS binding and put it into a separate patch.
 * Addressed review comments.
 * Minor changes.

Changes since v7 (https://lkml.org/lkml/2016/10/31/296)
 * Add the APCS clock controller to the APCS driver to expose both the
 mailbox and clock controller functionality as discussed earlier:
 https://lkml.org/lkml/2016/11/14/860
 * Changed the a53pll compatible string as suggested by Rob.

Changes since v6 (https://lkml.org/lkml/2016/9/7/347)
 * Addressed various comments from Stephen Boyd

Changes since v5 (https://lkml.org/lkml/2016/2/1/407)
 * Rebase to clk-next and update according to the recent API changes.

Changes since v4 (https://lkml.org/lkml/2015/12/14/367)
 * Convert to builtin drivers as now __clk_lookup() is used

Changes since v3 (https://lkml.org/lkml/2015/8/12/585)
 * Split driver into two parts - and separate A53 PLL and
   A53 clock controller drivers.
 * Drop the safe switch hook patch. Add a clock notifier in
   the clock provider to handle switching via safe mux and
   divider configuration.

Changes since v2 (https://lkml.org/lkml/2015/7/24/526)
 * Drop gpll0_vote patch.
 * Switch to the new clk_hw_* APIs.
 * Rebase to the current clk-next.

Changes since v1 (https://lkml.org/lkml/2015/6/12/193)
 * Drop SR2 PLL patch, as it is already applied.
 * Add gpll0_vote rate propagation patch.
 * Update/rebase patches to the current clk-next.


Georgi Djakov (6):
  mailbox: qcom: Convert APCS IPC driver to use regmap
  mailbox: qcom: Create APCS child device for clock controller
  clk: qcom: Add A53 PLL support
  clk: qcom: Add regmap mux-div clocks support
  dt-bindings: mailbox: qcom: Document the APCS clock binding
  clk: qcom: Add APCS clock controller support

 .../devicetree/bindings/clock/qcom,a53pll.txt      |  22 ++
 .../bindings/mailbox/qcom,apcs-kpss-global.txt     |  18 ++
 drivers/clk/qcom/Kconfig                           |  21 ++
 drivers/clk/qcom/Makefile                          |   3 +
 drivers/clk/qcom/a53-pll.c                         | 109 ++++++++++
 drivers/clk/qcom/apcs-msm8916.c                    | 149 +++++++++++++
 drivers/clk/qcom/clk-regmap-mux-div.c              | 230 +++++++++++++++++++++
 drivers/clk/qcom/clk-regmap-mux-div.h              |  47 +++++
 drivers/mailbox/qcom-apcs-ipc-mailbox.c            |  35 +++-
 9 files changed, 629 insertions(+), 5 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/clock/qcom,a53pll.txt
 create mode 100644 drivers/clk/qcom/a53-pll.c
 create mode 100644 drivers/clk/qcom/apcs-msm8916.c
 create mode 100644 drivers/clk/qcom/clk-regmap-mux-div.c
 create mode 100644 drivers/clk/qcom/clk-regmap-mux-div.h

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Rob Herring Dec. 4, 2017, 9:49 p.m. UTC | #1
On Fri, Dec 01, 2017 at 07:02:23PM +0200, Georgi Djakov wrote:
> Update the binding documentation for APCS to mention that the APCS

> hardware block also expose a clock controller functionality.

> 

> The APCS clock controller is a mux and half-integer divider. It has the

> main CPU PLL as an input and provides the clock for the application CPU.

> 

> Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>

> ---

>  .../bindings/mailbox/qcom,apcs-kpss-global.txt         | 18 ++++++++++++++++++

>  1 file changed, 18 insertions(+)


Reviewed-by: Rob Herring <robh@kernel.org>


--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bjorn Andersson Dec. 5, 2017, 5:49 a.m. UTC | #2
On Fri 01 Dec 09:02 PST 2017, Georgi Djakov wrote:

> Update the binding documentation for APCS to mention that the APCS

> hardware block also expose a clock controller functionality.

> 

> The APCS clock controller is a mux and half-integer divider. It has the

> main CPU PLL as an input and provides the clock for the application CPU.

> 

> Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>


Nice!

Acked-by: Bjorn Andersson <bjorn.andersson@linaro.org>


Regards,
Bjorn

> ---

>  .../bindings/mailbox/qcom,apcs-kpss-global.txt         | 18 ++++++++++++++++++

>  1 file changed, 18 insertions(+)

> 

> diff --git a/Documentation/devicetree/bindings/mailbox/qcom,apcs-kpss-global.txt b/Documentation/devicetree/bindings/mailbox/qcom,apcs-kpss-global.txt

> index fb961c310f44..16964f0c1773 100644

> --- a/Documentation/devicetree/bindings/mailbox/qcom,apcs-kpss-global.txt

> +++ b/Documentation/devicetree/bindings/mailbox/qcom,apcs-kpss-global.txt

> @@ -15,12 +15,21 @@ platforms.

>  	Usage: required

>  	Value type: <prop-encoded-array>

>  	Definition: must specify the base address and size of the global block

> +- clocks:

> +	Usage: required if #clocks-cells property is present

> +	Value type: <phandle>

> +	Definition: phandle to the input PLL, which feeds the APCS mux/divider

>  

>  - #mbox-cells:

>  	Usage: required

>  	Value type: <u32>

>  	Definition: as described in mailbox.txt, must be 1

>  

> +- #clock-cells:

> +	Usage: optional

> +	Value type: <u32>

> +	Definition: as described in clock.txt, must be 0

> +

>  

>  = EXAMPLE

>  The following example describes the APCS HMSS found in MSM8996 and part of the

> @@ -44,3 +53,12 @@ GLINK RPM referencing the "rpm_hlos" doorbell therein.

>  		mbox-names = "rpm_hlos";

>  	};

>  

> +Below is another example of the APCS binding on MSM8916 platforms:

> +

> +	apcs: mailbox@b011000 {

> +		compatible = "qcom,msm8916-apcs-kpss-global";

> +		reg = <0xb011000 0x1000>;

> +		#mbox-cells = <1>;

> +		clocks = <&a53pll>;

> +		#clock-cells = <0>;

> +	};

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bjorn Andersson Dec. 5, 2017, 6:03 a.m. UTC | #3
On Fri 01 Dec 09:02 PST 2017, Georgi Djakov wrote:

> The CPUs on Qualcomm MSM8916-based platforms are clocked by two PLLs,

> a primary (A53) CPU PLL and a secondary fixed-rate GPLL0. These sources

> are connected to a mux and half-integer divider, which is feeding the

> CPU cores.

> 

> This patch adds support for the primary CPU PLL which generates the

> higher range of frequencies above 1GHz.

> 

> Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>

> Acked-by: Rob Herring <robh@kernel.org>


Acked-by: Bjorn Andersson <bjorn.andersson@linaro.org>


Regards,
Bjorn

> ---

>  .../devicetree/bindings/clock/qcom,a53pll.txt      |  22 +++++

>  drivers/clk/qcom/Kconfig                           |  10 ++

>  drivers/clk/qcom/Makefile                          |   1 +

>  drivers/clk/qcom/a53-pll.c                         | 109 +++++++++++++++++++++

>  4 files changed, 142 insertions(+)

>  create mode 100644 Documentation/devicetree/bindings/clock/qcom,a53pll.txt

>  create mode 100644 drivers/clk/qcom/a53-pll.c

> 

> diff --git a/Documentation/devicetree/bindings/clock/qcom,a53pll.txt b/Documentation/devicetree/bindings/clock/qcom,a53pll.txt

> new file mode 100644

> index 000000000000..e3fa8118eaee

> --- /dev/null

> +++ b/Documentation/devicetree/bindings/clock/qcom,a53pll.txt

> @@ -0,0 +1,22 @@

> +Qualcomm MSM8916 A53 PLL Binding

> +--------------------------------

> +The A53 PLL on MSM8916 platforms is the main CPU PLL used used for frequencies

> +above 1GHz.

> +

> +Required properties :

> +- compatible : Shall contain only one of the following:

> +

> +		"qcom,msm8916-a53pll"

> +

> +- reg : shall contain base register location and length

> +

> +- #clock-cells : must be set to <0>

> +

> +Example:

> +

> +	a53pll: clock@b016000 {

> +		compatible = "qcom,msm8916-a53pll";

> +		reg = <0xb016000 0x40>;

> +		#clock-cells = <0>;

> +	};

> +

> diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig

> index 9f6c278deead..81ac7b9378fe 100644

> --- a/drivers/clk/qcom/Kconfig

> +++ b/drivers/clk/qcom/Kconfig

> @@ -12,6 +12,16 @@ config COMMON_CLK_QCOM

>  	select REGMAP_MMIO

>  	select RESET_CONTROLLER

>  

> +config QCOM_A53PLL

> +	bool "MSM8916 A53 PLL"

> +	depends on COMMON_CLK_QCOM

> +	default ARCH_QCOM

> +	help

> +	  Support for the A53 PLL on MSM8916 devices. It provides

> +	  the CPU with frequencies above 1GHz.

> +	  Say Y if you want to support higher CPU frequencies on MSM8916

> +	  devices.

> +

>  config QCOM_CLK_RPM

>  	tristate "RPM based Clock Controller"

>  	depends on COMMON_CLK_QCOM && MFD_QCOM_RPM

> diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile

> index 26410d31446b..e767c60c24ec 100644

> --- a/drivers/clk/qcom/Makefile

> +++ b/drivers/clk/qcom/Makefile

> @@ -32,5 +32,6 @@ obj-$(CONFIG_MSM_LCC_8960) += lcc-msm8960.o

>  obj-$(CONFIG_MSM_MMCC_8960) += mmcc-msm8960.o

>  obj-$(CONFIG_MSM_MMCC_8974) += mmcc-msm8974.o

>  obj-$(CONFIG_MSM_MMCC_8996) += mmcc-msm8996.o

> +obj-$(CONFIG_QCOM_A53PLL) += a53-pll.o

>  obj-$(CONFIG_QCOM_CLK_RPM) += clk-rpm.o

>  obj-$(CONFIG_QCOM_CLK_SMD_RPM) += clk-smd-rpm.o

> diff --git a/drivers/clk/qcom/a53-pll.c b/drivers/clk/qcom/a53-pll.c

> new file mode 100644

> index 000000000000..b2bb8e9437f1

> --- /dev/null

> +++ b/drivers/clk/qcom/a53-pll.c

> @@ -0,0 +1,109 @@

> +/*

> + * Copyright (c) 2017, Linaro Limited

> + * Copyright (c) 2014, The Linux Foundation. All rights reserved.

> + *

> + * SPDX-License-Identifier: GPL-2.0

> + */

> +

> +#include <linux/clk-provider.h>

> +#include <linux/kernel.h>

> +#include <linux/platform_device.h>

> +#include <linux/regmap.h>

> +

> +#include "clk-pll.h"

> +#include "clk-regmap.h"

> +

> +static const struct pll_freq_tbl a53pll_freq[] = {

> +	{  998400000, 52, 0x0, 0x1, 0 },

> +	{ 1094400000, 57, 0x0, 0x1, 0 },

> +	{ 1152000000, 62, 0x0, 0x1, 0 },

> +	{ 1209600000, 63, 0x0, 0x1, 0 },

> +	{ 1248000000, 65, 0x0, 0x1, 0 },

> +	{ 1363200000, 71, 0x0, 0x1, 0 },

> +	{ 1401600000, 73, 0x0, 0x1, 0 },

> +};

> +

> +static const struct regmap_config a53pll_regmap_config = {

> +	.reg_bits		= 32,

> +	.reg_stride		= 4,

> +	.val_bits		= 32,

> +	.max_register		= 0x40,

> +	.fast_io		= true,

> +};

> +

> +static int qcom_a53pll_remove(struct platform_device *pdev)

> +{

> +	of_clk_del_provider(pdev->dev.of_node);

> +	return 0;

> +}

> +

> +static int qcom_a53pll_probe(struct platform_device *pdev)

> +{

> +	struct device *dev = &pdev->dev;

> +	struct regmap *regmap;

> +	struct resource *res;

> +	struct clk_pll *pll;

> +	void __iomem *base;

> +	struct clk_init_data init = { };

> +	int ret;

> +

> +	pll = devm_kzalloc(dev, sizeof(*pll), GFP_KERNEL);

> +	if (!pll)

> +		return -ENOMEM;

> +

> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

> +	base = devm_ioremap_resource(dev, res);

> +	if (IS_ERR(base))

> +		return PTR_ERR(base);

> +

> +	regmap = devm_regmap_init_mmio(dev, base, &a53pll_regmap_config);

> +	if (IS_ERR(regmap))

> +		return PTR_ERR(regmap);

> +

> +	pll->l_reg = 0x04;

> +	pll->m_reg = 0x08;

> +	pll->n_reg = 0x0c;

> +	pll->config_reg = 0x14;

> +	pll->mode_reg = 0x00;

> +	pll->status_reg = 0x1c;

> +	pll->status_bit = 16;

> +	pll->freq_tbl = a53pll_freq;

> +

> +	init.name = "a53pll";

> +	init.parent_names = (const char *[]){ "xo" };

> +	init.num_parents = 1;

> +	init.ops = &clk_pll_sr2_ops;

> +	init.flags = CLK_IS_CRITICAL;

> +	pll->clkr.hw.init = &init;

> +

> +	ret = devm_clk_register_regmap(dev, &pll->clkr);

> +	if (ret) {

> +		dev_err(dev, "failed to register regmap clock: %d\n", ret);

> +		return ret;

> +	}

> +

> +	ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_simple_get,

> +				     &pll->clkr.hw);

> +	if (ret) {

> +		dev_err(dev, "failed to add clock provider: %d\n", ret);

> +		return ret;

> +	}

> +

> +	return 0;

> +}

> +

> +static const struct of_device_id qcom_a53pll_match_table[] = {

> +	{ .compatible = "qcom,msm8916-a53pll" },

> +	{ }

> +};

> +

> +static struct platform_driver qcom_a53pll_driver = {

> +	.probe = qcom_a53pll_probe,

> +	.remove = qcom_a53pll_remove,

> +	.driver = {

> +		.name = "qcom-a53pll",

> +		.of_match_table = qcom_a53pll_match_table,

> +	},

> +};

> +

> +builtin_platform_driver(qcom_a53pll_driver);

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html