* [PATCH v2 0/2] Introduce support for AM62 DSS VP0 Divider Clock @ 2023-02-13 11:59 Aradhya Bhatia 2023-02-13 11:59 ` [PATCH v2 1/2] dt-bindings: clock: Add binding documentation for TI AM62 DSS Clock Aradhya Bhatia 2023-02-13 11:59 ` [PATCH v2 2/2] clk: keystone: Add support AM62 DSS clock divider Aradhya Bhatia 0 siblings, 2 replies; 5+ messages in thread From: Aradhya Bhatia @ 2023-02-13 11:59 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Santosh Shilimkar, Rob Herring, Krzysztof Kozlowski Cc: Tomi Valkeinen, Samuel Holland, Linux Clock List, Devicetree List, Linux Kernel List, Nishanth Menon, Vignesh Raghavendra, Devarsh Thakkar, Jai Luthra, Aradhya Bhatia Introduce clock divider driver and bindings for AM62 DSS (VP0). The OLDI transmitters in AM62 SoC, require a serial clock, which is 7 times the pixel clock required by the Video Port 0 (VP0) of the DSS. The clock architecture is such that the relevant PLL is connected to the DSS VP0 through a clock divider (by-7). The DSS requests the pixel clock to the clock divider, which forwards the request to parent PLL. The PLL, in turn, is supposed to generate a 7x pixel-clock (serial clock) to feed the OLDI transmitters directly, and the DSS through the said divider. This ensures that both the OLDI TXes and DSS get their required clocks. Change Log: v2: - Create separate devicetree binding and driver for the clock. The previous version of the series added the compatible inside the fixed-factor clock driver, and explicitly set the flag CLK_SET_RATE_PARENT to have the set clock rate request propagate to the parent PLL. The driver is referenced from the fixed-factor clock driver and modified specifically to support AM62 DSS requirements. Links: V1: https://lore.kernel.org/all/20221226095745.19757-1-a-bhatia1@ti.com/ Aradhya Bhatia (2): dt-bindings: clock: Add binding documentation for TI AM62 DSS Clock clk: keystone: Add support AM62 DSS clock divider .../clock/ti,am62-dss-vp0-div-clk.yaml | 44 +++++ drivers/clk/keystone/Kconfig | 9 + drivers/clk/keystone/Makefile | 1 + drivers/clk/keystone/clk-am62-dss.c | 164 ++++++++++++++++++ 4 files changed, 218 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/ti,am62-dss-vp0-div-clk.yaml create mode 100644 drivers/clk/keystone/clk-am62-dss.c -- 2.39.1 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] dt-bindings: clock: Add binding documentation for TI AM62 DSS Clock 2023-02-13 11:59 [PATCH v2 0/2] Introduce support for AM62 DSS VP0 Divider Clock Aradhya Bhatia @ 2023-02-13 11:59 ` Aradhya Bhatia 2023-02-15 19:44 ` Rob Herring 2023-02-13 11:59 ` [PATCH v2 2/2] clk: keystone: Add support AM62 DSS clock divider Aradhya Bhatia 1 sibling, 1 reply; 5+ messages in thread From: Aradhya Bhatia @ 2023-02-13 11:59 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Santosh Shilimkar, Rob Herring, Krzysztof Kozlowski Cc: Tomi Valkeinen, Samuel Holland, Linux Clock List, Devicetree List, Linux Kernel List, Nishanth Menon, Vignesh Raghavendra, Devarsh Thakkar, Jai Luthra, Aradhya Bhatia Add DT bindings for DSS clock divider of TI's AM62 family of SoCs. Signed-off-by: Aradhya Bhatia <a-bhatia1@ti.com> --- .../clock/ti,am62-dss-vp0-div-clk.yaml | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/ti,am62-dss-vp0-div-clk.yaml diff --git a/Documentation/devicetree/bindings/clock/ti,am62-dss-vp0-div-clk.yaml b/Documentation/devicetree/bindings/clock/ti,am62-dss-vp0-div-clk.yaml new file mode 100644 index 000000000000..310d2a989d5b --- /dev/null +++ b/Documentation/devicetree/bindings/clock/ti,am62-dss-vp0-div-clk.yaml @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/clock/ti,am62-dss-vp0-div-clk.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: TI AM62 DSS - OLDI Divider Clock + +maintainers: + - Aradhya Bhatia <a-bhatia1@ti.com> + +properties: + compatible: + items: + - const: ti,am62-dss-vp0-div-clk + + "#clock-cells": + const: 0 + + clocks: + maxItems: 1 + + clock-div: + description: Fixed divider + $ref: /schemas/types.yaml#/definitions/uint32 + minimum: 1 + +required: + - compatible + - clocks + - "#clock-cells" + - clock-div + +additionalProperties: false + +examples: + - | + clock { + compatible = "ti,am62-dss-vp0-div-clk"; + clocks = <&parent_clock>; + #clock-cells = <0>; + clock-div = <7>; + }; +... -- 2.39.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] dt-bindings: clock: Add binding documentation for TI AM62 DSS Clock 2023-02-13 11:59 ` [PATCH v2 1/2] dt-bindings: clock: Add binding documentation for TI AM62 DSS Clock Aradhya Bhatia @ 2023-02-15 19:44 ` Rob Herring 0 siblings, 0 replies; 5+ messages in thread From: Rob Herring @ 2023-02-15 19:44 UTC (permalink / raw) To: Aradhya Bhatia Cc: Michael Turquette, Stephen Boyd, Santosh Shilimkar, Krzysztof Kozlowski, Tomi Valkeinen, Samuel Holland, Linux Clock List, Devicetree List, Linux Kernel List, Nishanth Menon, Vignesh Raghavendra, Devarsh Thakkar, Jai Luthra On Mon, Feb 13, 2023 at 05:29:53PM +0530, Aradhya Bhatia wrote: > Add DT bindings for DSS clock divider of TI's AM62 family of SoCs. Subject: Drop 'binding documentation for ' > > Signed-off-by: Aradhya Bhatia <a-bhatia1@ti.com> > --- > .../clock/ti,am62-dss-vp0-div-clk.yaml | 44 +++++++++++++++++++ > 1 file changed, 44 insertions(+) > create mode 100644 Documentation/devicetree/bindings/clock/ti,am62-dss-vp0-div-clk.yaml > > diff --git a/Documentation/devicetree/bindings/clock/ti,am62-dss-vp0-div-clk.yaml b/Documentation/devicetree/bindings/clock/ti,am62-dss-vp0-div-clk.yaml > new file mode 100644 > index 000000000000..310d2a989d5b > --- /dev/null > +++ b/Documentation/devicetree/bindings/clock/ti,am62-dss-vp0-div-clk.yaml > @@ -0,0 +1,44 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/clock/ti,am62-dss-vp0-div-clk.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: TI AM62 DSS - OLDI Divider Clock > + > +maintainers: > + - Aradhya Bhatia <a-bhatia1@ti.com> > + > +properties: > + compatible: > + items: > + - const: ti,am62-dss-vp0-div-clk What's wrong with 'fixed-factor-clock' binding? > + > + "#clock-cells": > + const: 0 > + > + clocks: > + maxItems: 1 > + > + clock-div: > + description: Fixed divider > + $ref: /schemas/types.yaml#/definitions/uint32 > + minimum: 1 > + > +required: > + - compatible > + - clocks > + - "#clock-cells" > + - clock-div > + > +additionalProperties: false > + > +examples: > + - | > + clock { > + compatible = "ti,am62-dss-vp0-div-clk"; > + clocks = <&parent_clock>; > + #clock-cells = <0>; > + clock-div = <7>; > + }; > +... > -- > 2.39.1 > ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] clk: keystone: Add support AM62 DSS clock divider 2023-02-13 11:59 [PATCH v2 0/2] Introduce support for AM62 DSS VP0 Divider Clock Aradhya Bhatia 2023-02-13 11:59 ` [PATCH v2 1/2] dt-bindings: clock: Add binding documentation for TI AM62 DSS Clock Aradhya Bhatia @ 2023-02-13 11:59 ` Aradhya Bhatia 2023-03-03 18:02 ` kernel test robot 1 sibling, 1 reply; 5+ messages in thread From: Aradhya Bhatia @ 2023-02-13 11:59 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Santosh Shilimkar, Rob Herring, Krzysztof Kozlowski Cc: Tomi Valkeinen, Samuel Holland, Linux Clock List, Devicetree List, Linux Kernel List, Nishanth Menon, Vignesh Raghavendra, Devarsh Thakkar, Jai Luthra, Aradhya Bhatia On TI's AM62 Family of SoCs, the pixel frequency of the DSS Video Port 0 comes from a by-7 clock divider. This is done to support the clock for OLDI transmitters that need serial clock 7 times the pixel frequency. A clock set request on this clock, is forwarded to its parent clock by default, using the SET_RATE_PARENT flag. The PLL (in this case the parent) generates serial clock for OLDI, which is then also fed to DSS using this clock divider. Signed-off-by: Aradhya Bhatia <a-bhatia1@ti.com> --- drivers/clk/keystone/Kconfig | 9 ++ drivers/clk/keystone/Makefile | 1 + drivers/clk/keystone/clk-am62-dss.c | 164 ++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 drivers/clk/keystone/clk-am62-dss.c diff --git a/drivers/clk/keystone/Kconfig b/drivers/clk/keystone/Kconfig index e64d6726048f..543314ddfd2c 100644 --- a/drivers/clk/keystone/Kconfig +++ b/drivers/clk/keystone/Kconfig @@ -34,3 +34,12 @@ config TI_SYSCON_CLK help This adds clock driver support for syscon based gate clocks on TI's K2 and K3 SoCs. + +config TI_AM62_DSS_CLK + tristate "Clock Divider for DSS VP0 of AM62 Family of SoCs" + depends on ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST + default TI_SCI_CLK + help + This adds clock divider driver support for Video Port 0 of Display + SubSystems (DSS) under AM62 Family of SoCs. This clock divider + forwards a seventh (1/7) of the incoming clock. diff --git a/drivers/clk/keystone/Makefile b/drivers/clk/keystone/Makefile index 0e426e648f7c..3a683d622a60 100644 --- a/drivers/clk/keystone/Makefile +++ b/drivers/clk/keystone/Makefile @@ -2,3 +2,4 @@ obj-$(CONFIG_COMMON_CLK_KEYSTONE) += pll.o gate.o obj-$(CONFIG_TI_SCI_CLK) += sci-clk.o obj-$(CONFIG_TI_SYSCON_CLK) += syscon-clk.o +obj-$(CONFIG_TI_AM62_DSS_CLK) += clk-am62-dss.o diff --git a/drivers/clk/keystone/clk-am62-dss.c b/drivers/clk/keystone/clk-am62-dss.c new file mode 100644 index 000000000000..2c9fc4bc89e3 --- /dev/null +++ b/drivers/clk/keystone/clk-am62-dss.c @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/ + */ +#include <linux/module.h> +#include <linux/clk-provider.h> +#include <linux/platform_device.h> + +struct ti_am62_dss_clk { + struct clk_hw hw; + unsigned int div; +}; + +#define to_ti_am62_dss_clk(_hw) \ + container_of(_hw, struct ti_am62_dss_clk, hw) + +static unsigned long ti_am62_dss_clk_recalc_rate(struct clk_hw *hw, + unsigned long parent_rate) +{ + struct ti_am62_dss_clk *priv = to_ti_am62_dss_clk(hw); + unsigned long rate; + + rate = parent_rate; + do_div(rate, priv->div); + return (unsigned long)rate; +} + +static long ti_am62_dss_clk_round_rate(struct clk_hw *hw, unsigned long rate, + unsigned long *prate) +{ + struct ti_am62_dss_clk *priv = to_ti_am62_dss_clk(hw); + + if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) { + unsigned long best_parent; + + best_parent = rate * priv->div; + *prate = clk_hw_round_rate(clk_hw_get_parent(hw), best_parent); + } + + return (*prate / priv->div); +} + +static int ti_am62_dss_clk_set_rate(struct clk_hw *hw, unsigned long rate, + unsigned long parent_rate) +{ + /* + * We must report success but we can do so unconditionally because + * ti_am62_dss_clk_round_rate returns values that ensure this call is a + * nop. + */ + + return 0; +} + +static const struct clk_ops ti_am62_dss_clk_ops = { + .round_rate = ti_am62_dss_clk_round_rate, + .set_rate = ti_am62_dss_clk_set_rate, + .recalc_rate = ti_am62_dss_clk_recalc_rate, +}; + +static struct clk_hw * +clk_hw_register_am62_dss_clk(struct device *dev, const char *name, + unsigned long flags, unsigned int div) +{ + struct ti_am62_dss_clk *priv; + struct clk_init_data init = { }; + struct clk_parent_data pdata = { .index = 0 }; + int ret; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return ERR_PTR(-ENOMEM); + + /* struct ti_am62_dss_clk assignments */ + priv->div = div; + priv->hw.init = &init; + + init.name = name; + init.ops = &ti_am62_dss_clk_ops; + init.flags = flags; + init.parent_names = NULL; + init.parent_data = &pdata; + init.num_parents = 1; + + ret = devm_clk_hw_register(dev, &priv->hw); + if (ret) + return ERR_PTR(ret); + + return &priv->hw; +} + +static void clk_hw_unregister_am62_dss_clk(struct clk_hw *hw) +{ + struct ti_am62_dss_clk *priv; + + priv = to_ti_am62_dss_clk(hw); + + clk_hw_unregister(hw); + kfree(priv); +} + +static int ti_am62_dss_clk_remove(struct platform_device *pdev) +{ + struct clk_hw *hw = platform_get_drvdata(pdev); + + of_clk_del_provider(pdev->dev.of_node); + clk_hw_unregister_am62_dss_clk(hw); + + return 0; +} + +static int ti_am62_dss_clk_probe(struct platform_device *pdev) +{ + struct clk_hw *hw; + const char *clk_name = pdev->name; + struct device *dev = &pdev->dev; + unsigned long flags = 0; + u32 div; + int ret; + + if (of_property_read_u32(dev->of_node, "clock-div", &div)) { + dev_err(dev, "%s: TI AM62 DSS clock must have a clock-div property.\n", + __func__); + return -EIO; + } + + flags |= CLK_SET_RATE_PARENT; + + hw = clk_hw_register_am62_dss_clk(dev, clk_name, flags, div); + if (IS_ERR(hw)) { + dev_err(dev, "%s: failed to register %s\n", __func__, clk_name); + return PTR_ERR(hw); + } + + ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw); + if (ret) { + clk_hw_unregister_am62_dss_clk(hw); + return ret; + } + + platform_set_drvdata(pdev, hw); + + return 0; +} + +static const struct of_device_id ti_am62_dss_clk_ids[] = { + { .compatible = "ti,am62-dss-vp0-div-clk" }, + { } +}; +MODULE_DEVICE_TABLE(of, ti_am62_dss_clk_ids); + +static struct platform_driver ti_am62_dss_clk_driver = { + .driver = { + .name = "ti_am62_dss_clk", + .of_match_table = ti_am62_dss_clk_ids, + }, + .probe = ti_am62_dss_clk_probe, + .remove = ti_am62_dss_clk_remove, +}; +module_platform_driver(ti_am62_dss_clk_driver); + +MODULE_AUTHOR("Aradhya Bhatia <a-bhatia1@ti.com>"); +MODULE_DESCRIPTION("TI AM62 DSS - OLDI Fixed Clock Divider driver"); +MODULE_LICENSE("GPL"); -- 2.39.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] clk: keystone: Add support AM62 DSS clock divider 2023-02-13 11:59 ` [PATCH v2 2/2] clk: keystone: Add support AM62 DSS clock divider Aradhya Bhatia @ 2023-03-03 18:02 ` kernel test robot 0 siblings, 0 replies; 5+ messages in thread From: kernel test robot @ 2023-03-03 18:02 UTC (permalink / raw) To: Aradhya Bhatia, Michael Turquette, Stephen Boyd, Santosh Shilimkar, Rob Herring, Krzysztof Kozlowski Cc: oe-kbuild-all, Tomi Valkeinen, Samuel Holland, Linux Clock List, Devicetree List, Linux Kernel List, Vignesh Raghavendra, Devarsh Thakkar, Jai Luthra, Aradhya Bhatia Hi Aradhya, Thank you for the patch! Yet something to improve: [auto build test ERROR on clk/clk-next] [also build test ERROR on linus/master v6.2 next-20230303] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Aradhya-Bhatia/dt-bindings-clock-Add-binding-documentation-for-TI-AM62-DSS-Clock/20230213-200203 base: https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git clk-next patch link: https://lore.kernel.org/r/20230213115954.553-3-a-bhatia1%40ti.com patch subject: [PATCH v2 2/2] clk: keystone: Add support AM62 DSS clock divider config: arm-randconfig-r046-20230302 (https://download.01.org/0day-ci/archive/20230304/202303040131.k7AUxAg5-lkp@intel.com/config) compiler: arm-linux-gnueabi-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/2ddb7301b11092b73d4a16af06362954f3d5f714 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Aradhya-Bhatia/dt-bindings-clock-Add-binding-documentation-for-TI-AM62-DSS-Clock/20230213-200203 git checkout 2ddb7301b11092b73d4a16af06362954f3d5f714 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=arm olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash drivers/clk/ mm// net/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Link: https://lore.kernel.org/oe-kbuild-all/202303040131.k7AUxAg5-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from arch/arm/include/asm/div64.h:107, from include/linux/math.h:6, from include/linux/math64.h:6, from include/linux/time.h:6, from include/linux/stat.h:19, from include/linux/module.h:13, from drivers/clk/keystone/clk-am62-dss.c:5: drivers/clk/keystone/clk-am62-dss.c: In function 'ti_am62_dss_clk_recalc_rate': include/asm-generic/div64.h:222:35: warning: comparison of distinct pointer types lacks a cast 222 | (void)(((typeof((n)) *)0) == ((uint64_t *)0)); \ | ^~ drivers/clk/keystone/clk-am62-dss.c:24:9: note: in expansion of macro 'do_div' 24 | do_div(rate, priv->div); | ^~~~~~ In file included from include/linux/build_bug.h:5, from include/linux/container_of.h:5, from include/linux/list.h:5, from include/linux/module.h:12: include/asm-generic/div64.h:234:32: warning: right shift count >= width of type [-Wshift-count-overflow] 234 | } else if (likely(((n) >> 32) == 0)) { \ | ^~ include/linux/compiler.h:77:45: note: in definition of macro 'likely' 77 | # define likely(x) __builtin_expect(!!(x), 1) | ^ drivers/clk/keystone/clk-am62-dss.c:24:9: note: in expansion of macro 'do_div' 24 | do_div(rate, priv->div); | ^~~~~~ include/asm-generic/div64.h:238:36: error: passing argument 1 of '__div64_32' from incompatible pointer type [-Werror=incompatible-pointer-types] 238 | __rem = __div64_32(&(n), __base); \ | ^~~~ | | | long unsigned int * drivers/clk/keystone/clk-am62-dss.c:24:9: note: in expansion of macro 'do_div' 24 | do_div(rate, priv->div); | ^~~~~~ arch/arm/include/asm/div64.h:24:45: note: expected 'uint64_t *' {aka 'long long unsigned int *'} but argument is of type 'long unsigned int *' 24 | static inline uint32_t __div64_32(uint64_t *n, uint32_t base) | ~~~~~~~~~~^ drivers/clk/keystone/clk-am62-dss.c: In function 'clk_hw_unregister_am62_dss_clk': >> drivers/clk/keystone/clk-am62-dss.c:99:9: error: implicit declaration of function 'kfree'; did you mean 'kvfree'? [-Werror=implicit-function-declaration] 99 | kfree(priv); | ^~~~~ | kvfree cc1: some warnings being treated as errors vim +99 drivers/clk/keystone/clk-am62-dss.c 91 92 static void clk_hw_unregister_am62_dss_clk(struct clk_hw *hw) 93 { 94 struct ti_am62_dss_clk *priv; 95 96 priv = to_ti_am62_dss_clk(hw); 97 98 clk_hw_unregister(hw); > 99 kfree(priv); 100 } 101 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-03-03 18:04 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-02-13 11:59 [PATCH v2 0/2] Introduce support for AM62 DSS VP0 Divider Clock Aradhya Bhatia 2023-02-13 11:59 ` [PATCH v2 1/2] dt-bindings: clock: Add binding documentation for TI AM62 DSS Clock Aradhya Bhatia 2023-02-15 19:44 ` Rob Herring 2023-02-13 11:59 ` [PATCH v2 2/2] clk: keystone: Add support AM62 DSS clock divider Aradhya Bhatia 2023-03-03 18:02 ` kernel test robot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).