From: Stephen Boyd <sboyd@codeaurora.org> To: Mike Turquette <mturquette@linaro.org> Cc: linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Viresh Kumar <viresh.kumar@linaro.org>, linux-pm@vger.kernel.org Subject: [PATCH v2 00/15] Krait clocks + Krait CPUfreq Date: Fri, 5 Sep 2014 15:47:19 -0700 [thread overview] Message-ID: <1409957256-23729-1-git-send-email-sboyd@codeaurora.org> (raw) These patches provide cpufreq scaling on devices with Krait CPUs. In Krait CPU designs there's one PLL and two muxes per CPU, allowing us to switch CPU frequencies independently. secondary +-----+ + | QSB |-------+------------|\ +-----+ | | |-+ | +-------|/ | | | + | +-----+ | | | | PLL |----+-------+ | primary +-----+ | | | + | | +-----|\ +------+ +-------+ | | | \ | | | HFPLL |----------+-----------------| |-----| CPU0 | +-------+ | | | | | | | | | | +-----+ | / +------+ | | +-| / 2 |---------|/ | | +-----+ + | | secondary | | + | +------------|\ | | |-+ +---------------|/ | primary + | + +-----|\ +------+ +-------+ | \ | | | HFPLL |----------------------------| |-----| CPU1 | +-------+ | | | | | | +-----+ | / +------+ +-| / 2 |---------|/ +-----+ + To support this in the common clock framework we model the muxes, dividers, and PLLs as different clocks. CPUfreq only interacts with the primary mux (farthest right in the diagram). When CPUfreq sets a rate, the mux code finds the best parent that can provide the rate. Due to the design, QSB and the top PLL are always a fixed rate and thus only support one frequency each. These sources provide the lowest frequencies for the CPUs. The HFPLLs are where we can make the CPU go faster (GHz range). Sometimes we need to run the HFPLL twice as fast and divide it by two to get a particular frequency. When switching rates we can't leave the CPU clocked by the HFPLL because we need to turn off the output of the PLL when changing its frequency. This means we have to switch over to the secondary mux and use one of the fixed sources. This is why we need something like the safe parent patch. I plan to submit the DTS changes through arm-soc, but I've included everything here to make it easier to pick things up for testing, etc. Please note that these patches rely on the Krait L2 accessor patch I posted a while back in another series[1]. This also relies on the cpufreq-generic patchset from Viresh[2]. If anything can be picked up right now it would be better to reduce the churn over time as other pieces settle. The series gets progressively more controversial as it goes on, so I hope that things near the beggining will be picked up earlier. Changes since v1: * Added IPQ and APQ8064 support * Switched to cpufreq-generic * Added OPP parsing from DT (need to write binding though) * New patches to make clk-generic.c go away * Made mux and divider reusable for non-MMIO devices * Added a mux_determine_rate_closest (not sure if this is really needed) * Added unregistration of muxes * New patch to avoid sending high frequencies down to devices using clocks TODO: * Add Krait regulator voltage scaling (not strictly necessary) * Document DT bindings * Use a new efuse/eeprom API instead of hardcoding the location in the driver * Add some thermal awareness Stephen Boyd (15): clk: mux: Add unregistration API clk: mux: Split out register accessors for reuse clk: Add __clk_mux_determine_rate_closest clk: divider: Make generic for usage elsewhere clk: Add safe switch hook clk: Avoid sending high rates to downstream clocks during set_rate clk: qcom: Add support for High-Frequency PLLs (HFPLLs) clk: qcom: Add HFPLL driver clk: qcom: Add MSM8960/APQ8064's HFPLLs clk: qcom: Add IPQ806X's HFPLLs clk: qcom: Add support for Krait clocks clk: qcom: Add KPSS ACC/GCC driver clk: qcom: Add Krait clock controller driver cpufreq: Add module to register cpufreq on Krait CPUs ARM: dts: qcom: Add necessary DT data for Krait cpufreq arch/arm/boot/dts/qcom-apq8064.dtsi | 230 +++++++++++++++++ arch/arm/boot/dts/qcom-msm8960.dtsi | 49 ++++ arch/arm/boot/dts/qcom-msm8974.dtsi | 311 ++++++++++++++++++++++- drivers/clk/clk-divider.c | 197 +++++++++------ drivers/clk/clk-mux.c | 91 ++++--- drivers/clk/clk.c | 133 +++++++--- drivers/clk/qcom/Kconfig | 28 +++ drivers/clk/qcom/Makefile | 5 + drivers/clk/qcom/clk-hfpll.c | 253 +++++++++++++++++++ drivers/clk/qcom/clk-hfpll.h | 54 ++++ drivers/clk/qcom/clk-krait.c | 166 +++++++++++++ drivers/clk/qcom/clk-krait.h | 49 ++++ drivers/clk/qcom/gcc-ipq806x.c | 83 +++++++ drivers/clk/qcom/gcc-msm8960.c | 172 +++++++++++++ drivers/clk/qcom/hfpll.c | 110 +++++++++ drivers/clk/qcom/kpss-xcc.c | 94 +++++++ drivers/clk/qcom/krait-cc.c | 357 +++++++++++++++++++++++++++ drivers/cpufreq/Kconfig.arm | 9 + drivers/cpufreq/Makefile | 1 + drivers/cpufreq/qcom-cpufreq.c | 199 +++++++++++++++ include/dt-bindings/clock/qcom,gcc-msm8960.h | 2 + include/linux/clk-private.h | 2 + include/linux/clk-provider.h | 32 ++- 23 files changed, 2486 insertions(+), 141 deletions(-) create mode 100644 drivers/clk/qcom/clk-hfpll.c create mode 100644 drivers/clk/qcom/clk-hfpll.h create mode 100644 drivers/clk/qcom/clk-krait.c create mode 100644 drivers/clk/qcom/clk-krait.h create mode 100644 drivers/clk/qcom/hfpll.c create mode 100644 drivers/clk/qcom/kpss-xcc.c create mode 100644 drivers/clk/qcom/krait-cc.c create mode 100644 drivers/cpufreq/qcom-cpufreq.c [1] http://lkml.iu.edu/hypermail/linux/kernel/1404.0/02636.html [2] git://git.linaro.org/people/viresh.kumar/linux cpufreq/cpu0-krait-v3 -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation
WARNING: multiple messages have this Message-ID (diff)
From: sboyd@codeaurora.org (Stephen Boyd) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v2 00/15] Krait clocks + Krait CPUfreq Date: Fri, 5 Sep 2014 15:47:19 -0700 [thread overview] Message-ID: <1409957256-23729-1-git-send-email-sboyd@codeaurora.org> (raw) These patches provide cpufreq scaling on devices with Krait CPUs. In Krait CPU designs there's one PLL and two muxes per CPU, allowing us to switch CPU frequencies independently. secondary +-----+ + | QSB |-------+------------|\ +-----+ | | |-+ | +-------|/ | | | + | +-----+ | | | | PLL |----+-------+ | primary +-----+ | | | + | | +-----|\ +------+ +-------+ | | | \ | | | HFPLL |----------+-----------------| |-----| CPU0 | +-------+ | | | | | | | | | | +-----+ | / +------+ | | +-| / 2 |---------|/ | | +-----+ + | | secondary | | + | +------------|\ | | |-+ +---------------|/ | primary + | + +-----|\ +------+ +-------+ | \ | | | HFPLL |----------------------------| |-----| CPU1 | +-------+ | | | | | | +-----+ | / +------+ +-| / 2 |---------|/ +-----+ + To support this in the common clock framework we model the muxes, dividers, and PLLs as different clocks. CPUfreq only interacts with the primary mux (farthest right in the diagram). When CPUfreq sets a rate, the mux code finds the best parent that can provide the rate. Due to the design, QSB and the top PLL are always a fixed rate and thus only support one frequency each. These sources provide the lowest frequencies for the CPUs. The HFPLLs are where we can make the CPU go faster (GHz range). Sometimes we need to run the HFPLL twice as fast and divide it by two to get a particular frequency. When switching rates we can't leave the CPU clocked by the HFPLL because we need to turn off the output of the PLL when changing its frequency. This means we have to switch over to the secondary mux and use one of the fixed sources. This is why we need something like the safe parent patch. I plan to submit the DTS changes through arm-soc, but I've included everything here to make it easier to pick things up for testing, etc. Please note that these patches rely on the Krait L2 accessor patch I posted a while back in another series[1]. This also relies on the cpufreq-generic patchset from Viresh[2]. If anything can be picked up right now it would be better to reduce the churn over time as other pieces settle. The series gets progressively more controversial as it goes on, so I hope that things near the beggining will be picked up earlier. Changes since v1: * Added IPQ and APQ8064 support * Switched to cpufreq-generic * Added OPP parsing from DT (need to write binding though) * New patches to make clk-generic.c go away * Made mux and divider reusable for non-MMIO devices * Added a mux_determine_rate_closest (not sure if this is really needed) * Added unregistration of muxes * New patch to avoid sending high frequencies down to devices using clocks TODO: * Add Krait regulator voltage scaling (not strictly necessary) * Document DT bindings * Use a new efuse/eeprom API instead of hardcoding the location in the driver * Add some thermal awareness Stephen Boyd (15): clk: mux: Add unregistration API clk: mux: Split out register accessors for reuse clk: Add __clk_mux_determine_rate_closest clk: divider: Make generic for usage elsewhere clk: Add safe switch hook clk: Avoid sending high rates to downstream clocks during set_rate clk: qcom: Add support for High-Frequency PLLs (HFPLLs) clk: qcom: Add HFPLL driver clk: qcom: Add MSM8960/APQ8064's HFPLLs clk: qcom: Add IPQ806X's HFPLLs clk: qcom: Add support for Krait clocks clk: qcom: Add KPSS ACC/GCC driver clk: qcom: Add Krait clock controller driver cpufreq: Add module to register cpufreq on Krait CPUs ARM: dts: qcom: Add necessary DT data for Krait cpufreq arch/arm/boot/dts/qcom-apq8064.dtsi | 230 +++++++++++++++++ arch/arm/boot/dts/qcom-msm8960.dtsi | 49 ++++ arch/arm/boot/dts/qcom-msm8974.dtsi | 311 ++++++++++++++++++++++- drivers/clk/clk-divider.c | 197 +++++++++------ drivers/clk/clk-mux.c | 91 ++++--- drivers/clk/clk.c | 133 +++++++--- drivers/clk/qcom/Kconfig | 28 +++ drivers/clk/qcom/Makefile | 5 + drivers/clk/qcom/clk-hfpll.c | 253 +++++++++++++++++++ drivers/clk/qcom/clk-hfpll.h | 54 ++++ drivers/clk/qcom/clk-krait.c | 166 +++++++++++++ drivers/clk/qcom/clk-krait.h | 49 ++++ drivers/clk/qcom/gcc-ipq806x.c | 83 +++++++ drivers/clk/qcom/gcc-msm8960.c | 172 +++++++++++++ drivers/clk/qcom/hfpll.c | 110 +++++++++ drivers/clk/qcom/kpss-xcc.c | 94 +++++++ drivers/clk/qcom/krait-cc.c | 357 +++++++++++++++++++++++++++ drivers/cpufreq/Kconfig.arm | 9 + drivers/cpufreq/Makefile | 1 + drivers/cpufreq/qcom-cpufreq.c | 199 +++++++++++++++ include/dt-bindings/clock/qcom,gcc-msm8960.h | 2 + include/linux/clk-private.h | 2 + include/linux/clk-provider.h | 32 ++- 23 files changed, 2486 insertions(+), 141 deletions(-) create mode 100644 drivers/clk/qcom/clk-hfpll.c create mode 100644 drivers/clk/qcom/clk-hfpll.h create mode 100644 drivers/clk/qcom/clk-krait.c create mode 100644 drivers/clk/qcom/clk-krait.h create mode 100644 drivers/clk/qcom/hfpll.c create mode 100644 drivers/clk/qcom/kpss-xcc.c create mode 100644 drivers/clk/qcom/krait-cc.c create mode 100644 drivers/cpufreq/qcom-cpufreq.c [1] http://lkml.iu.edu/hypermail/linux/kernel/1404.0/02636.html [2] git://git.linaro.org/people/viresh.kumar/linux cpufreq/cpu0-krait-v3 -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation
next reply other threads:[~2014-09-05 22:47 UTC|newest] Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top 2014-09-05 22:47 Stephen Boyd [this message] 2014-09-05 22:47 ` [PATCH v2 00/15] Krait clocks + Krait CPUfreq Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 01/15] clk: mux: Add unregistration API Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 02/15] clk: mux: Split out register accessors for reuse Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 03/15] clk: Add __clk_mux_determine_rate_closest Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 04/15] clk: divider: Make generic for usage elsewhere Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-10-03 18:07 ` Stephen Boyd 2014-10-03 18:07 ` Stephen Boyd 2014-10-07 17:27 ` Srinivas Kandagatla 2014-10-07 17:27 ` Srinivas Kandagatla 2014-10-07 18:26 ` Stephen Boyd 2014-10-07 18:26 ` Stephen Boyd 2014-10-07 19:28 ` Srinivas Kandagatla 2014-10-07 19:28 ` Srinivas Kandagatla 2014-10-08 15:04 ` Srinivas Kandagatla 2014-10-08 15:04 ` Srinivas Kandagatla 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 05/15] clk: Add safe switch hook Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 06/15] clk: Avoid sending high rates to downstream clocks during set_rate Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 07/15] clk: qcom: Add support for High-Frequency PLLs (HFPLLs) Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 08/15] clk: qcom: Add HFPLL driver Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 09/15] clk: qcom: Add MSM8960/APQ8064's HFPLLs Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 10/15] clk: qcom: Add IPQ806X's HFPLLs Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 11/15] clk: qcom: Add support for Krait clocks Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 12/15] clk: qcom: Add KPSS ACC/GCC driver Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 13/15] clk: qcom: Add Krait clock controller driver Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 14/15] cpufreq: Add module to register cpufreq on Krait CPUs Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-08 4:46 ` Viresh Kumar 2014-09-08 4:46 ` Viresh Kumar 2014-09-08 4:46 ` Viresh Kumar 2014-09-08 17:15 ` Christopher Covington 2014-09-08 17:15 ` Christopher Covington 2014-09-08 17:15 ` Christopher Covington 2014-09-09 0:37 ` Stephen Boyd 2014-09-09 0:37 ` Stephen Boyd 2014-09-09 0:37 ` Stephen Boyd 2014-09-09 4:53 ` Viresh Kumar 2014-09-09 4:53 ` Viresh Kumar 2014-09-09 4:53 ` Viresh Kumar 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-05 22:47 ` [PATCH v2 15/15] ARM: dts: qcom: Add necessary DT data for Krait cpufreq Stephen Boyd 2014-09-05 22:47 ` Stephen Boyd 2014-09-08 9:42 ` [PATCH v2 00/15] Krait clocks + Krait CPUfreq Pramod Gurav 2014-09-08 9:42 ` Pramod Gurav 2014-09-08 9:42 ` Pramod Gurav 2014-09-08 11:59 ` Pramod Gurav 2014-09-08 11:59 ` Pramod Gurav
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1409957256-23729-1-git-send-email-sboyd@codeaurora.org \ --to=sboyd@codeaurora.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-arm-msm@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pm@vger.kernel.org \ --cc=mturquette@linaro.org \ --cc=viresh.kumar@linaro.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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.