Amlogic clock changes for v5.11
* Add MIPI DSI clocks for axg and g12 * Make it possible to build controllers as modules * Fix Video PLL clock dependency -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE9OFZrhjz9W1fG7cb5vwPHDfy2oUFAl/EBPoACgkQ5vwPHDfy 2oVWlg/+MaLYaOw1+3oPRMXbc6YJ6iu135hxC5QKuRyKV1ULwyV3ts0EXEwE3Jp5 0/14mPZZcI9OKdG/6k20zPmKwud6nxE2cj+Q7eeRCiVlzpXXDDJ7zz2gkmnFYzg7 B+oooIg7T9vymzyylI4YLm229oDftxCMtashmJp3qZfX97qC5oyvk96DBXkRhySu IG77DoQwBhOxmvM4kBmCv47FE+eZqULqPPcaedKo6W9KKLECTgiu1XXHXSzZGiZ1 0gCyvSvXDHuJUKWSqDDDqdDP9UFlT1YYDh5jfAp9yuPsdZeirCnDsfZf5PB+7UiQ pB4y0OxN6flZkSXc29IX+XaWWVJeAr3uAHbJaVvf5mUalx8LIiUUTHZncICHCMNo AVyUPm79XB5vcwv0rH1a4k/SpF5BhqXyMPZ93JEhwoxIWBzFFnBnhfwsAmTzt7QR pQTD2tPL486qiE2CaqNjgjIKjfZqaER9QcTraizS9J+wqE8/YswR44CxgdD6l3Ff UuTxCR0TOG7LhnMS5ax+amD10e3hIkpKBYKceO+dKQ08zKBBOuDqs959IXqGPHIA x+EuFxDuhAZMp6zHeRWB2cUiVc0B3Et7tt5mV1aNzVW8L+vTZAMEqICmwZGJwNrE sKFJxEb0tcZqpCZBZAGnDhtG/FF1BfdHYJb7WBS5SQ9x9nZL6t4= =WQ4K -----END PGP SIGNATURE----- Merge tag 'clk-meson-v5.11-1' of https://github.com/BayLibre/clk-meson into clk-amlogic Pull Amlogic clk driver updates from Jerome Brunet: - Add MIPI DSI clocks for axg and g12 - Make it possible to build controllers as modules - Fix Video PLL clock dependency * tag 'clk-meson-v5.11-1' of https://github.com/BayLibre/clk-meson: clk: meson: g12a: add MIPI DSI Host Pixel Clock dt-bindings: clk: g12a-clkc: add DSI Pixel clock bindings clk: meson: enable building as modules clk: meson: Kconfig: fix dependency for G12A clk: meson: axg: add MIPI DSI Host clock clk: meson: axg: add Video Clocks dt-bindings: clk: axg-clkc: add MIPI DSI Host clock binding dt-bindings: clk: axg-clkc: add Video Clocks clk: meson: g12: use devm variant to register notifiers clk: add devm variant of clk_notifier_register clk: meson: g12: drop use of __clk_lookup() clk: add api to get clk consumer from clk_hw clk: avoid devm_clk_release name clash
This commit is contained in:
commit
cadd53122a
|
@ -3667,6 +3667,24 @@ struct clk *clk_hw_create_clk(struct device *dev, struct clk_hw *hw,
|
|||
return clk;
|
||||
}
|
||||
|
||||
/**
|
||||
* clk_hw_get_clk - get clk consumer given an clk_hw
|
||||
* @hw: clk_hw associated with the clk being consumed
|
||||
* @con_id: connection ID string on device
|
||||
*
|
||||
* Returns: new clk consumer
|
||||
* This is the function to be used by providers which need
|
||||
* to get a consumer clk and act on the clock element
|
||||
* Calls to this function must be balanced with calls clk_put()
|
||||
*/
|
||||
struct clk *clk_hw_get_clk(struct clk_hw *hw, const char *con_id)
|
||||
{
|
||||
struct device *dev = hw->core->dev;
|
||||
|
||||
return clk_hw_create_clk(dev, hw, dev_name(dev), con_id);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_hw_get_clk);
|
||||
|
||||
static int clk_cpy_name(const char **dst_p, const char *src, bool must_exist)
|
||||
{
|
||||
const char *dst;
|
||||
|
@ -4068,12 +4086,12 @@ void clk_hw_unregister(struct clk_hw *hw)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(clk_hw_unregister);
|
||||
|
||||
static void devm_clk_release(struct device *dev, void *res)
|
||||
static void devm_clk_unregister_cb(struct device *dev, void *res)
|
||||
{
|
||||
clk_unregister(*(struct clk **)res);
|
||||
}
|
||||
|
||||
static void devm_clk_hw_release(struct device *dev, void *res)
|
||||
static void devm_clk_hw_unregister_cb(struct device *dev, void *res)
|
||||
{
|
||||
clk_hw_unregister(*(struct clk_hw **)res);
|
||||
}
|
||||
|
@ -4093,7 +4111,7 @@ struct clk *devm_clk_register(struct device *dev, struct clk_hw *hw)
|
|||
struct clk *clk;
|
||||
struct clk **clkp;
|
||||
|
||||
clkp = devres_alloc(devm_clk_release, sizeof(*clkp), GFP_KERNEL);
|
||||
clkp = devres_alloc(devm_clk_unregister_cb, sizeof(*clkp), GFP_KERNEL);
|
||||
if (!clkp)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
|
@ -4123,7 +4141,7 @@ int devm_clk_hw_register(struct device *dev, struct clk_hw *hw)
|
|||
struct clk_hw **hwp;
|
||||
int ret;
|
||||
|
||||
hwp = devres_alloc(devm_clk_hw_release, sizeof(*hwp), GFP_KERNEL);
|
||||
hwp = devres_alloc(devm_clk_hw_unregister_cb, sizeof(*hwp), GFP_KERNEL);
|
||||
if (!hwp)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -4167,7 +4185,7 @@ static int devm_clk_hw_match(struct device *dev, void *res, void *data)
|
|||
*/
|
||||
void devm_clk_unregister(struct device *dev, struct clk *clk)
|
||||
{
|
||||
WARN_ON(devres_release(dev, devm_clk_release, devm_clk_match, clk));
|
||||
WARN_ON(devres_release(dev, devm_clk_unregister_cb, devm_clk_match, clk));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_unregister);
|
||||
|
||||
|
@ -4182,11 +4200,54 @@ EXPORT_SYMBOL_GPL(devm_clk_unregister);
|
|||
*/
|
||||
void devm_clk_hw_unregister(struct device *dev, struct clk_hw *hw)
|
||||
{
|
||||
WARN_ON(devres_release(dev, devm_clk_hw_release, devm_clk_hw_match,
|
||||
WARN_ON(devres_release(dev, devm_clk_hw_unregister_cb, devm_clk_hw_match,
|
||||
hw));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_hw_unregister);
|
||||
|
||||
static void devm_clk_release(struct device *dev, void *res)
|
||||
{
|
||||
clk_put(*(struct clk **)res);
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_clk_hw_get_clk - resource managed clk_hw_get_clk()
|
||||
* @dev: device that is registering this clock
|
||||
* @hw: clk_hw associated with the clk being consumed
|
||||
* @con_id: connection ID string on device
|
||||
*
|
||||
* Managed clk_hw_get_clk(). Clocks got with this function are
|
||||
* automatically clk_put() on driver detach. See clk_put()
|
||||
* for more information.
|
||||
*/
|
||||
struct clk *devm_clk_hw_get_clk(struct device *dev, struct clk_hw *hw,
|
||||
const char *con_id)
|
||||
{
|
||||
struct clk *clk;
|
||||
struct clk **clkp;
|
||||
|
||||
/* This should not happen because it would mean we have drivers
|
||||
* passing around clk_hw pointers instead of having the caller use
|
||||
* proper clk_get() style APIs
|
||||
*/
|
||||
WARN_ON_ONCE(dev != hw->core->dev);
|
||||
|
||||
clkp = devres_alloc(devm_clk_release, sizeof(*clkp), GFP_KERNEL);
|
||||
if (!clkp)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
clk = clk_hw_get_clk(hw, con_id);
|
||||
if (!IS_ERR(clk)) {
|
||||
*clkp = clk;
|
||||
devres_add(dev, clkp);
|
||||
} else {
|
||||
devres_free(clkp);
|
||||
}
|
||||
|
||||
return clk;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_hw_get_clk);
|
||||
|
||||
/*
|
||||
* clkdev helpers
|
||||
*/
|
||||
|
@ -4334,6 +4395,42 @@ int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(clk_notifier_unregister);
|
||||
|
||||
struct clk_notifier_devres {
|
||||
struct clk *clk;
|
||||
struct notifier_block *nb;
|
||||
};
|
||||
|
||||
static void devm_clk_notifier_release(struct device *dev, void *res)
|
||||
{
|
||||
struct clk_notifier_devres *devres = res;
|
||||
|
||||
clk_notifier_unregister(devres->clk, devres->nb);
|
||||
}
|
||||
|
||||
int devm_clk_notifier_register(struct device *dev, struct clk *clk,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
struct clk_notifier_devres *devres;
|
||||
int ret;
|
||||
|
||||
devres = devres_alloc(devm_clk_notifier_release,
|
||||
sizeof(*devres), GFP_KERNEL);
|
||||
|
||||
if (!devres)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = clk_notifier_register(clk, nb);
|
||||
if (!ret) {
|
||||
devres->clk = clk;
|
||||
devres->nb = nb;
|
||||
} else {
|
||||
devres_free(devres);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_notifier_register);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static void clk_core_reparent_orphans(void)
|
||||
{
|
||||
|
|
|
@ -58,7 +58,7 @@ config COMMON_CLK_MESON8B
|
|||
want peripherals and CPU frequency scaling to work.
|
||||
|
||||
config COMMON_CLK_GXBB
|
||||
bool "GXBB and GXL SoC clock controllers support"
|
||||
tristate "GXBB and GXL SoC clock controllers support"
|
||||
depends on ARM64
|
||||
default y
|
||||
select COMMON_CLK_MESON_REGMAP
|
||||
|
@ -74,7 +74,7 @@ config COMMON_CLK_GXBB
|
|||
Say Y if you want peripherals and CPU frequency scaling to work.
|
||||
|
||||
config COMMON_CLK_AXG
|
||||
bool "AXG SoC clock controllers support"
|
||||
tristate "AXG SoC clock controllers support"
|
||||
depends on ARM64
|
||||
default y
|
||||
select COMMON_CLK_MESON_REGMAP
|
||||
|
@ -100,7 +100,7 @@ config COMMON_CLK_AXG_AUDIO
|
|||
aka axg, Say Y if you want audio subsystem to work.
|
||||
|
||||
config COMMON_CLK_G12A
|
||||
bool "G12 and SM1 SoC clock controllers support"
|
||||
tristate "G12 and SM1 SoC clock controllers support"
|
||||
depends on ARM64
|
||||
default y
|
||||
select COMMON_CLK_MESON_REGMAP
|
||||
|
@ -110,6 +110,7 @@ config COMMON_CLK_G12A
|
|||
select COMMON_CLK_MESON_AO_CLKC
|
||||
select COMMON_CLK_MESON_EE_CLKC
|
||||
select COMMON_CLK_MESON_CPU_DYNDIV
|
||||
select COMMON_CLK_MESON_VID_PLL_DIV
|
||||
select MFD_SYSCON
|
||||
help
|
||||
Support for the clock controller on Amlogic S905D2, S905X2 and S905Y2
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/reset-controller.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/module.h>
|
||||
#include "meson-aoclk.h"
|
||||
#include "axg-aoclk.h"
|
||||
|
||||
|
@ -326,6 +327,7 @@ static const struct of_device_id axg_aoclkc_match_table[] = {
|
|||
},
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, axg_aoclkc_match_table);
|
||||
|
||||
static struct platform_driver axg_aoclkc_driver = {
|
||||
.probe = meson_aoclkc_probe,
|
||||
|
@ -335,4 +337,5 @@ static struct platform_driver axg_aoclkc_driver = {
|
|||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(axg_aoclkc_driver);
|
||||
module_platform_driver(axg_aoclkc_driver);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-pll.h"
|
||||
|
@ -1026,6 +1027,743 @@ static struct clk_regmap axg_sd_emmc_c_clk0 = {
|
|||
},
|
||||
};
|
||||
|
||||
/* VPU Clock */
|
||||
|
||||
static const struct clk_hw *axg_vpu_parent_hws[] = {
|
||||
&axg_fclk_div4.hw,
|
||||
&axg_fclk_div3.hw,
|
||||
&axg_fclk_div5.hw,
|
||||
&axg_fclk_div7.hw,
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vpu_0_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VPU_CLK_CNTL,
|
||||
.mask = 0x3,
|
||||
.shift = 9,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vpu_0_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = axg_vpu_parent_hws,
|
||||
.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
|
||||
/* We need a specific parent for VPU clock source, let it be set in DT */
|
||||
.flags = CLK_SET_RATE_NO_REPARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vpu_0_div = {
|
||||
.data = &(struct clk_regmap_div_data){
|
||||
.offset = HHI_VPU_CLK_CNTL,
|
||||
.shift = 0,
|
||||
.width = 7,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vpu_0_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vpu_0_sel.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vpu_0 = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VPU_CLK_CNTL,
|
||||
.bit_idx = 8,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vpu_0",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vpu_0_div.hw },
|
||||
.num_parents = 1,
|
||||
/*
|
||||
* We want to avoid CCF to disable the VPU clock if
|
||||
* display has been set by Bootloader
|
||||
*/
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vpu_1_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VPU_CLK_CNTL,
|
||||
.mask = 0x3,
|
||||
.shift = 25,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vpu_1_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = axg_vpu_parent_hws,
|
||||
.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
|
||||
/* We need a specific parent for VPU clock source, let it be set in DT */
|
||||
.flags = CLK_SET_RATE_NO_REPARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vpu_1_div = {
|
||||
.data = &(struct clk_regmap_div_data){
|
||||
.offset = HHI_VPU_CLK_CNTL,
|
||||
.shift = 16,
|
||||
.width = 7,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vpu_1_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vpu_1_sel.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vpu_1 = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VPU_CLK_CNTL,
|
||||
.bit_idx = 24,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vpu_1",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vpu_1_div.hw },
|
||||
.num_parents = 1,
|
||||
/*
|
||||
* We want to avoid CCF to disable the VPU clock if
|
||||
* display has been set by Bootloader
|
||||
*/
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vpu = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VPU_CLK_CNTL,
|
||||
.mask = 1,
|
||||
.shift = 31,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vpu",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vpu_0.hw,
|
||||
&axg_vpu_1.hw
|
||||
},
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_NO_REPARENT,
|
||||
},
|
||||
};
|
||||
|
||||
/* VAPB Clock */
|
||||
|
||||
static struct clk_regmap axg_vapb_0_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VAPBCLK_CNTL,
|
||||
.mask = 0x3,
|
||||
.shift = 9,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vapb_0_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = axg_vpu_parent_hws,
|
||||
.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
|
||||
.flags = CLK_SET_RATE_NO_REPARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vapb_0_div = {
|
||||
.data = &(struct clk_regmap_div_data){
|
||||
.offset = HHI_VAPBCLK_CNTL,
|
||||
.shift = 0,
|
||||
.width = 7,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vapb_0_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vapb_0_sel.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vapb_0 = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VAPBCLK_CNTL,
|
||||
.bit_idx = 8,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vapb_0",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vapb_0_div.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vapb_1_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VAPBCLK_CNTL,
|
||||
.mask = 0x3,
|
||||
.shift = 25,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vapb_1_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = axg_vpu_parent_hws,
|
||||
.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
|
||||
.flags = CLK_SET_RATE_NO_REPARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vapb_1_div = {
|
||||
.data = &(struct clk_regmap_div_data){
|
||||
.offset = HHI_VAPBCLK_CNTL,
|
||||
.shift = 16,
|
||||
.width = 7,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vapb_1_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vapb_1_sel.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vapb_1 = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VAPBCLK_CNTL,
|
||||
.bit_idx = 24,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vapb_1",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vapb_1_div.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vapb_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VAPBCLK_CNTL,
|
||||
.mask = 1,
|
||||
.shift = 31,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vapb_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vapb_0.hw,
|
||||
&axg_vapb_1.hw
|
||||
},
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_NO_REPARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vapb = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VAPBCLK_CNTL,
|
||||
.bit_idx = 30,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vapb",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vapb_sel.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
/* Video Clocks */
|
||||
|
||||
static const struct clk_hw *axg_vclk_parent_hws[] = {
|
||||
&axg_gp0_pll.hw,
|
||||
&axg_fclk_div4.hw,
|
||||
&axg_fclk_div3.hw,
|
||||
&axg_fclk_div5.hw,
|
||||
&axg_fclk_div2.hw,
|
||||
&axg_fclk_div7.hw,
|
||||
&axg_mpll1.hw,
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VID_CLK_CNTL,
|
||||
.mask = 0x7,
|
||||
.shift = 16,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = axg_vclk_parent_hws,
|
||||
.num_parents = ARRAY_SIZE(axg_vclk_parent_hws),
|
||||
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk2_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VIID_CLK_CNTL,
|
||||
.mask = 0x7,
|
||||
.shift = 16,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk2_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = axg_vclk_parent_hws,
|
||||
.num_parents = ARRAY_SIZE(axg_vclk_parent_hws),
|
||||
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk_input = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VID_CLK_DIV,
|
||||
.bit_idx = 16,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk_input",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk_sel.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk2_input = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VIID_CLK_DIV,
|
||||
.bit_idx = 16,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk2_input",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk2_sel.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk_div = {
|
||||
.data = &(struct clk_regmap_div_data){
|
||||
.offset = HHI_VID_CLK_DIV,
|
||||
.shift = 0,
|
||||
.width = 8,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vclk_input.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_GET_RATE_NOCACHE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk2_div = {
|
||||
.data = &(struct clk_regmap_div_data){
|
||||
.offset = HHI_VIID_CLK_DIV,
|
||||
.shift = 0,
|
||||
.width = 8,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk2_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vclk2_input.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_GET_RATE_NOCACHE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VID_CLK_CNTL,
|
||||
.bit_idx = 19,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk_div.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk2 = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VIID_CLK_CNTL,
|
||||
.bit_idx = 19,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk2",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk2_div.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk_div1 = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VID_CLK_CNTL,
|
||||
.bit_idx = 0,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk_div1",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk_div2_en = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VID_CLK_CNTL,
|
||||
.bit_idx = 1,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk_div2_en",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk_div4_en = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VID_CLK_CNTL,
|
||||
.bit_idx = 2,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk_div4_en",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk_div6_en = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VID_CLK_CNTL,
|
||||
.bit_idx = 3,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk_div6_en",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk_div12_en = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VID_CLK_CNTL,
|
||||
.bit_idx = 4,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk_div12_en",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk2_div1 = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VIID_CLK_CNTL,
|
||||
.bit_idx = 0,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk2_div1",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk2_div2_en = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VIID_CLK_CNTL,
|
||||
.bit_idx = 1,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk2_div2_en",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk2_div4_en = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VIID_CLK_CNTL,
|
||||
.bit_idx = 2,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk2_div4_en",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk2_div6_en = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VIID_CLK_CNTL,
|
||||
.bit_idx = 3,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk2_div6_en",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vclk2_div12_en = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VIID_CLK_CNTL,
|
||||
.bit_idx = 4,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vclk2_div12_en",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_fixed_factor axg_vclk_div2 = {
|
||||
.mult = 1,
|
||||
.div = 2,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk_div2",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vclk_div2_en.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_fixed_factor axg_vclk_div4 = {
|
||||
.mult = 1,
|
||||
.div = 4,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk_div4",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vclk_div4_en.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_fixed_factor axg_vclk_div6 = {
|
||||
.mult = 1,
|
||||
.div = 6,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk_div6",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vclk_div6_en.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_fixed_factor axg_vclk_div12 = {
|
||||
.mult = 1,
|
||||
.div = 12,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk_div12",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vclk_div12_en.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_fixed_factor axg_vclk2_div2 = {
|
||||
.mult = 1,
|
||||
.div = 2,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk2_div2",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vclk2_div2_en.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_fixed_factor axg_vclk2_div4 = {
|
||||
.mult = 1,
|
||||
.div = 4,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk2_div4",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vclk2_div4_en.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_fixed_factor axg_vclk2_div6 = {
|
||||
.mult = 1,
|
||||
.div = 6,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk2_div6",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vclk2_div6_en.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_fixed_factor axg_vclk2_div12 = {
|
||||
.mult = 1,
|
||||
.div = 12,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vclk2_div12",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vclk2_div12_en.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
|
||||
static const struct clk_hw *axg_cts_parent_hws[] = {
|
||||
&axg_vclk_div1.hw,
|
||||
&axg_vclk_div2.hw,
|
||||
&axg_vclk_div4.hw,
|
||||
&axg_vclk_div6.hw,
|
||||
&axg_vclk_div12.hw,
|
||||
&axg_vclk2_div1.hw,
|
||||
&axg_vclk2_div2.hw,
|
||||
&axg_vclk2_div4.hw,
|
||||
&axg_vclk2_div6.hw,
|
||||
&axg_vclk2_div12.hw,
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_cts_encl_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VIID_CLK_DIV,
|
||||
.mask = 0xf,
|
||||
.shift = 12,
|
||||
.table = mux_table_cts_sel,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cts_encl_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = axg_cts_parent_hws,
|
||||
.num_parents = ARRAY_SIZE(axg_cts_parent_hws),
|
||||
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_cts_encl = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VID_CLK_CNTL2,
|
||||
.bit_idx = 3,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "cts_encl",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_cts_encl_sel.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
/* MIPI DSI Host Clock */
|
||||
|
||||
static u32 mux_table_axg_vdin_meas[] = { 0, 1, 2, 3, 6, 7 };
|
||||
static const struct clk_parent_data axg_vdin_meas_parent_data[] = {
|
||||
{ .fw_name = "xtal", },
|
||||
{ .hw = &axg_fclk_div4.hw },
|
||||
{ .hw = &axg_fclk_div3.hw },
|
||||
{ .hw = &axg_fclk_div5.hw },
|
||||
{ .hw = &axg_fclk_div2.hw },
|
||||
{ .hw = &axg_fclk_div7.hw },
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vdin_meas_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VDIN_MEAS_CLK_CNTL,
|
||||
.mask = 0x7,
|
||||
.shift = 21,
|
||||
.flags = CLK_MUX_ROUND_CLOSEST,
|
||||
.table = mux_table_axg_vdin_meas,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vdin_meas_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_data = axg_vdin_meas_parent_data,
|
||||
.num_parents = ARRAY_SIZE(axg_vdin_meas_parent_data),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vdin_meas_div = {
|
||||
.data = &(struct clk_regmap_div_data){
|
||||
.offset = HHI_VDIN_MEAS_CLK_CNTL,
|
||||
.shift = 12,
|
||||
.width = 7,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "vdin_meas_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vdin_meas_sel.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_vdin_meas = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VDIN_MEAS_CLK_CNTL,
|
||||
.bit_idx = 20,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "vdin_meas",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&axg_vdin_meas_div.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static u32 mux_table_gen_clk[] = { 0, 4, 5, 6, 7, 8,
|
||||
9, 10, 11, 13, 14, };
|
||||
static const struct clk_parent_data gen_clk_parent_data[] = {
|
||||
|
@ -1246,6 +1984,52 @@ static struct clk_hw_onecell_data axg_hw_onecell_data = {
|
|||
[CLKID_HIFI_PLL_DCO] = &axg_hifi_pll_dco.hw,
|
||||
[CLKID_PCIE_PLL_DCO] = &axg_pcie_pll_dco.hw,
|
||||
[CLKID_PCIE_PLL_OD] = &axg_pcie_pll_od.hw,
|
||||
[CLKID_VPU_0_DIV] = &axg_vpu_0_div.hw,
|
||||
[CLKID_VPU_0_SEL] = &axg_vpu_0_sel.hw,
|
||||
[CLKID_VPU_0] = &axg_vpu_0.hw,
|
||||
[CLKID_VPU_1_DIV] = &axg_vpu_1_div.hw,
|
||||
[CLKID_VPU_1_SEL] = &axg_vpu_1_sel.hw,
|
||||
[CLKID_VPU_1] = &axg_vpu_1.hw,
|
||||
[CLKID_VPU] = &axg_vpu.hw,
|
||||
[CLKID_VAPB_0_DIV] = &axg_vapb_0_div.hw,
|
||||
[CLKID_VAPB_0_SEL] = &axg_vapb_0_sel.hw,
|
||||
[CLKID_VAPB_0] = &axg_vapb_0.hw,
|
||||
[CLKID_VAPB_1_DIV] = &axg_vapb_1_div.hw,
|
||||
[CLKID_VAPB_1_SEL] = &axg_vapb_1_sel.hw,
|
||||
[CLKID_VAPB_1] = &axg_vapb_1.hw,
|
||||
[CLKID_VAPB_SEL] = &axg_vapb_sel.hw,
|
||||
[CLKID_VAPB] = &axg_vapb.hw,
|
||||
[CLKID_VCLK] = &axg_vclk.hw,
|
||||
[CLKID_VCLK2] = &axg_vclk2.hw,
|
||||
[CLKID_VCLK_SEL] = &axg_vclk_sel.hw,
|
||||
[CLKID_VCLK2_SEL] = &axg_vclk2_sel.hw,
|
||||
[CLKID_VCLK_INPUT] = &axg_vclk_input.hw,
|
||||
[CLKID_VCLK2_INPUT] = &axg_vclk2_input.hw,
|
||||
[CLKID_VCLK_DIV] = &axg_vclk_div.hw,
|
||||
[CLKID_VCLK2_DIV] = &axg_vclk2_div.hw,
|
||||
[CLKID_VCLK_DIV2_EN] = &axg_vclk_div2_en.hw,
|
||||
[CLKID_VCLK_DIV4_EN] = &axg_vclk_div4_en.hw,
|
||||
[CLKID_VCLK_DIV6_EN] = &axg_vclk_div6_en.hw,
|
||||
[CLKID_VCLK_DIV12_EN] = &axg_vclk_div12_en.hw,
|
||||
[CLKID_VCLK2_DIV2_EN] = &axg_vclk2_div2_en.hw,
|
||||
[CLKID_VCLK2_DIV4_EN] = &axg_vclk2_div4_en.hw,
|
||||
[CLKID_VCLK2_DIV6_EN] = &axg_vclk2_div6_en.hw,
|
||||
[CLKID_VCLK2_DIV12_EN] = &axg_vclk2_div12_en.hw,
|
||||
[CLKID_VCLK_DIV1] = &axg_vclk_div1.hw,
|
||||
[CLKID_VCLK_DIV2] = &axg_vclk_div2.hw,
|
||||
[CLKID_VCLK_DIV4] = &axg_vclk_div4.hw,
|
||||
[CLKID_VCLK_DIV6] = &axg_vclk_div6.hw,
|
||||
[CLKID_VCLK_DIV12] = &axg_vclk_div12.hw,
|
||||
[CLKID_VCLK2_DIV1] = &axg_vclk2_div1.hw,
|
||||
[CLKID_VCLK2_DIV2] = &axg_vclk2_div2.hw,
|
||||
[CLKID_VCLK2_DIV4] = &axg_vclk2_div4.hw,
|
||||
[CLKID_VCLK2_DIV6] = &axg_vclk2_div6.hw,
|
||||
[CLKID_VCLK2_DIV12] = &axg_vclk2_div12.hw,
|
||||
[CLKID_CTS_ENCL_SEL] = &axg_cts_encl_sel.hw,
|
||||
[CLKID_CTS_ENCL] = &axg_cts_encl.hw,
|
||||
[CLKID_VDIN_MEAS_SEL] = &axg_vdin_meas_sel.hw,
|
||||
[CLKID_VDIN_MEAS_DIV] = &axg_vdin_meas_div.hw,
|
||||
[CLKID_VDIN_MEAS] = &axg_vdin_meas.hw,
|
||||
[NR_CLKS] = NULL,
|
||||
},
|
||||
.num = NR_CLKS,
|
||||
|
@ -1341,6 +2125,42 @@ static struct clk_regmap *const axg_clk_regmaps[] = {
|
|||
&axg_hifi_pll_dco,
|
||||
&axg_pcie_pll_dco,
|
||||
&axg_pcie_pll_od,
|
||||
&axg_vpu_0_div,
|
||||
&axg_vpu_0_sel,
|
||||
&axg_vpu_0,
|
||||
&axg_vpu_1_div,
|
||||
&axg_vpu_1_sel,
|
||||
&axg_vpu_1,
|
||||
&axg_vpu,
|
||||
&axg_vapb_0_div,
|
||||
&axg_vapb_0_sel,
|
||||
&axg_vapb_0,
|
||||
&axg_vapb_1_div,
|
||||
&axg_vapb_1_sel,
|
||||
&axg_vapb_1,
|
||||
&axg_vapb_sel,
|
||||
&axg_vapb,
|
||||
&axg_vclk,
|
||||
&axg_vclk2,
|
||||
&axg_vclk_sel,
|
||||
&axg_vclk2_sel,
|
||||
&axg_vclk_input,
|
||||
&axg_vclk2_input,
|
||||
&axg_vclk_div,
|
||||
&axg_vclk2_div,
|
||||
&axg_vclk_div2_en,
|
||||
&axg_vclk_div4_en,
|
||||
&axg_vclk_div6_en,
|
||||
&axg_vclk_div12_en,
|
||||
&axg_vclk2_div2_en,
|
||||
&axg_vclk2_div4_en,
|
||||
&axg_vclk2_div6_en,
|
||||
&axg_vclk2_div12_en,
|
||||
&axg_cts_encl_sel,
|
||||
&axg_cts_encl,
|
||||
&axg_vdin_meas_sel,
|
||||
&axg_vdin_meas_div,
|
||||
&axg_vdin_meas,
|
||||
};
|
||||
|
||||
static const struct meson_eeclkc_data axg_clkc_data = {
|
||||
|
@ -1354,6 +2174,7 @@ static const struct of_device_id clkc_match_table[] = {
|
|||
{ .compatible = "amlogic,axg-clkc", .data = &axg_clkc_data },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, clkc_match_table);
|
||||
|
||||
static struct platform_driver axg_driver = {
|
||||
.probe = meson_eeclkc_probe,
|
||||
|
@ -1363,4 +2184,5 @@ static struct platform_driver axg_driver = {
|
|||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(axg_driver);
|
||||
module_platform_driver(axg_driver);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -139,8 +139,29 @@
|
|||
#define CLKID_HIFI_PLL_DCO 88
|
||||
#define CLKID_PCIE_PLL_DCO 89
|
||||
#define CLKID_PCIE_PLL_OD 90
|
||||
#define CLKID_VPU_0_DIV 91
|
||||
#define CLKID_VPU_1_DIV 94
|
||||
#define CLKID_VAPB_0_DIV 98
|
||||
#define CLKID_VAPB_1_DIV 101
|
||||
#define CLKID_VCLK_SEL 108
|
||||
#define CLKID_VCLK2_SEL 109
|
||||
#define CLKID_VCLK_INPUT 110
|
||||
#define CLKID_VCLK2_INPUT 111
|
||||
#define CLKID_VCLK_DIV 112
|
||||
#define CLKID_VCLK2_DIV 113
|
||||
#define CLKID_VCLK_DIV2_EN 114
|
||||
#define CLKID_VCLK_DIV4_EN 115
|
||||
#define CLKID_VCLK_DIV6_EN 116
|
||||
#define CLKID_VCLK_DIV12_EN 117
|
||||
#define CLKID_VCLK2_DIV2_EN 118
|
||||
#define CLKID_VCLK2_DIV4_EN 119
|
||||
#define CLKID_VCLK2_DIV6_EN 120
|
||||
#define CLKID_VCLK2_DIV12_EN 121
|
||||
#define CLKID_CTS_ENCL_SEL 132
|
||||
#define CLKID_VDIN_MEAS_SEL 134
|
||||
#define CLKID_VDIN_MEAS_DIV 135
|
||||
|
||||
#define NR_CLKS 91
|
||||
#define NR_CLKS 137
|
||||
|
||||
/* include the CLKIDs that have been made part of the DT binding */
|
||||
#include <dt-bindings/clock/axg-clkc.h>
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/reset-controller.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/module.h>
|
||||
#include "meson-aoclk.h"
|
||||
#include "g12a-aoclk.h"
|
||||
|
||||
|
@ -461,6 +462,7 @@ static const struct of_device_id g12a_aoclkc_match_table[] = {
|
|||
},
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, g12a_aoclkc_match_table);
|
||||
|
||||
static struct platform_driver g12a_aoclkc_driver = {
|
||||
.probe = meson_aoclkc_probe,
|
||||
|
@ -470,4 +472,5 @@ static struct platform_driver g12a_aoclkc_driver = {
|
|||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(g12a_aoclkc_driver);
|
||||
module_platform_driver(g12a_aoclkc_driver);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "clk-mpll.h"
|
||||
#include "clk-pll.h"
|
||||
|
@ -3657,6 +3658,68 @@ static struct clk_regmap g12a_hdmi_tx = {
|
|||
},
|
||||
};
|
||||
|
||||
/* MIPI DSI Host Clocks */
|
||||
|
||||
static const struct clk_hw *g12a_mipi_dsi_pxclk_parent_hws[] = {
|
||||
&g12a_vid_pll.hw,
|
||||
&g12a_gp0_pll.hw,
|
||||
&g12a_hifi_pll.hw,
|
||||
&g12a_mpll1.hw,
|
||||
&g12a_fclk_div2.hw,
|
||||
&g12a_fclk_div2p5.hw,
|
||||
&g12a_fclk_div3.hw,
|
||||
&g12a_fclk_div7.hw,
|
||||
};
|
||||
|
||||
static struct clk_regmap g12a_mipi_dsi_pxclk_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
|
||||
.mask = 0x7,
|
||||
.shift = 12,
|
||||
.flags = CLK_MUX_ROUND_CLOSEST,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mipi_dsi_pxclk_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = g12a_mipi_dsi_pxclk_parent_hws,
|
||||
.num_parents = ARRAY_SIZE(g12a_mipi_dsi_pxclk_parent_hws),
|
||||
.flags = CLK_SET_RATE_NO_REPARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap g12a_mipi_dsi_pxclk_div = {
|
||||
.data = &(struct clk_regmap_div_data){
|
||||
.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
|
||||
.shift = 0,
|
||||
.width = 7,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mipi_dsi_pxclk_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12a_mipi_dsi_pxclk_sel.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap g12a_mipi_dsi_pxclk = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
|
||||
.bit_idx = 8,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "mipi_dsi_pxclk",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12a_mipi_dsi_pxclk_div.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
/* HDMI Clocks */
|
||||
|
||||
static const struct clk_parent_data g12a_hdmi_parent_data[] = {
|
||||
|
@ -4402,6 +4465,9 @@ static struct clk_hw_onecell_data g12a_hw_onecell_data = {
|
|||
[CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw,
|
||||
[CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw,
|
||||
[CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw,
|
||||
[NR_CLKS] = NULL,
|
||||
},
|
||||
.num = NR_CLKS,
|
||||
|
@ -4657,6 +4723,9 @@ static struct clk_hw_onecell_data g12b_hw_onecell_data = {
|
|||
[CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw,
|
||||
[CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw,
|
||||
[CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw,
|
||||
[NR_CLKS] = NULL,
|
||||
},
|
||||
.num = NR_CLKS,
|
||||
|
@ -4903,6 +4972,9 @@ static struct clk_hw_onecell_data sm1_hw_onecell_data = {
|
|||
[CLKID_NNA_CORE_CLK_SEL] = &sm1_nna_core_clk_sel.hw,
|
||||
[CLKID_NNA_CORE_CLK_DIV] = &sm1_nna_core_clk_div.hw,
|
||||
[CLKID_NNA_CORE_CLK] = &sm1_nna_core_clk.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw,
|
||||
[NR_CLKS] = NULL,
|
||||
},
|
||||
.num = NR_CLKS,
|
||||
|
@ -5150,16 +5222,20 @@ static struct clk_regmap *const g12a_clk_regmaps[] = {
|
|||
&sm1_nna_core_clk_sel,
|
||||
&sm1_nna_core_clk_div,
|
||||
&sm1_nna_core_clk,
|
||||
&g12a_mipi_dsi_pxclk_sel,
|
||||
&g12a_mipi_dsi_pxclk_div,
|
||||
&g12a_mipi_dsi_pxclk,
|
||||
};
|
||||
|
||||
static const struct reg_sequence g12a_init_regs[] = {
|
||||
{ .reg = HHI_MPLL_CNTL0, .def = 0x00000543 },
|
||||
};
|
||||
|
||||
static int meson_g12a_dvfs_setup_common(struct platform_device *pdev,
|
||||
#define DVFS_CON_ID "dvfs"
|
||||
|
||||
static int meson_g12a_dvfs_setup_common(struct device *dev,
|
||||
struct clk_hw **hws)
|
||||
{
|
||||
const char *notifier_clk_name;
|
||||
struct clk *notifier_clk;
|
||||
struct clk_hw *xtal;
|
||||
int ret;
|
||||
|
@ -5168,21 +5244,22 @@ static int meson_g12a_dvfs_setup_common(struct platform_device *pdev,
|
|||
|
||||
/* Setup clock notifier for cpu_clk_postmux0 */
|
||||
g12a_cpu_clk_postmux0_nb_data.xtal = xtal;
|
||||
notifier_clk_name = clk_hw_get_name(&g12a_cpu_clk_postmux0.hw);
|
||||
notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
ret = clk_notifier_register(notifier_clk,
|
||||
&g12a_cpu_clk_postmux0_nb_data.nb);
|
||||
notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_postmux0.hw,
|
||||
DVFS_CON_ID);
|
||||
ret = devm_clk_notifier_register(dev, notifier_clk,
|
||||
&g12a_cpu_clk_postmux0_nb_data.nb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register the cpu_clk_postmux0 notifier\n");
|
||||
dev_err(dev, "failed to register the cpu_clk_postmux0 notifier\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Setup clock notifier for cpu_clk_dyn mux */
|
||||
notifier_clk_name = clk_hw_get_name(&g12a_cpu_clk_dyn.hw);
|
||||
notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
|
||||
notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_dyn.hw,
|
||||
DVFS_CON_ID);
|
||||
ret = devm_clk_notifier_register(dev, notifier_clk,
|
||||
&g12a_cpu_clk_mux_nb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register the cpu_clk_dyn notifier\n");
|
||||
dev_err(dev, "failed to register the cpu_clk_dyn notifier\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -5192,33 +5269,34 @@ static int meson_g12a_dvfs_setup_common(struct platform_device *pdev,
|
|||
static int meson_g12b_dvfs_setup(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw **hws = g12b_hw_onecell_data.hws;
|
||||
const char *notifier_clk_name;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct clk *notifier_clk;
|
||||
struct clk_hw *xtal;
|
||||
int ret;
|
||||
|
||||
ret = meson_g12a_dvfs_setup_common(pdev, hws);
|
||||
ret = meson_g12a_dvfs_setup_common(dev, hws);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
|
||||
|
||||
/* Setup clock notifier for cpu_clk mux */
|
||||
notifier_clk_name = clk_hw_get_name(&g12b_cpu_clk.hw);
|
||||
notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
|
||||
notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpu_clk.hw,
|
||||
DVFS_CON_ID);
|
||||
ret = devm_clk_notifier_register(dev, notifier_clk,
|
||||
&g12a_cpu_clk_mux_nb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register the cpu_clk notifier\n");
|
||||
dev_err(dev, "failed to register the cpu_clk notifier\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Setup clock notifier for sys1_pll */
|
||||
notifier_clk_name = clk_hw_get_name(&g12b_sys1_pll.hw);
|
||||
notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
ret = clk_notifier_register(notifier_clk,
|
||||
&g12b_cpu_clk_sys1_pll_nb_data.nb);
|
||||
notifier_clk = devm_clk_hw_get_clk(dev, &g12b_sys1_pll.hw,
|
||||
DVFS_CON_ID);
|
||||
ret = devm_clk_notifier_register(dev, notifier_clk,
|
||||
&g12b_cpu_clk_sys1_pll_nb_data.nb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register the sys1_pll notifier\n");
|
||||
dev_err(dev, "failed to register the sys1_pll notifier\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -5226,40 +5304,39 @@ static int meson_g12b_dvfs_setup(struct platform_device *pdev)
|
|||
|
||||
/* Setup clock notifier for cpub_clk_postmux0 */
|
||||
g12b_cpub_clk_postmux0_nb_data.xtal = xtal;
|
||||
notifier_clk_name = clk_hw_get_name(&g12b_cpub_clk_postmux0.hw);
|
||||
notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
ret = clk_notifier_register(notifier_clk,
|
||||
&g12b_cpub_clk_postmux0_nb_data.nb);
|
||||
notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_postmux0.hw,
|
||||
DVFS_CON_ID);
|
||||
ret = devm_clk_notifier_register(dev, notifier_clk,
|
||||
&g12b_cpub_clk_postmux0_nb_data.nb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register the cpub_clk_postmux0 notifier\n");
|
||||
dev_err(dev, "failed to register the cpub_clk_postmux0 notifier\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Setup clock notifier for cpub_clk_dyn mux */
|
||||
notifier_clk_name = clk_hw_get_name(&g12b_cpub_clk_dyn.hw);
|
||||
notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
|
||||
notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_dyn.hw, "dvfs");
|
||||
ret = devm_clk_notifier_register(dev, notifier_clk,
|
||||
&g12a_cpu_clk_mux_nb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register the cpub_clk_dyn notifier\n");
|
||||
dev_err(dev, "failed to register the cpub_clk_dyn notifier\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Setup clock notifier for cpub_clk mux */
|
||||
notifier_clk_name = clk_hw_get_name(&g12b_cpub_clk.hw);
|
||||
notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
|
||||
notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk.hw, DVFS_CON_ID);
|
||||
ret = devm_clk_notifier_register(dev, notifier_clk,
|
||||
&g12a_cpu_clk_mux_nb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register the cpub_clk notifier\n");
|
||||
dev_err(dev, "failed to register the cpub_clk notifier\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Setup clock notifier for sys_pll */
|
||||
notifier_clk_name = clk_hw_get_name(&g12a_sys_pll.hw);
|
||||
notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
ret = clk_notifier_register(notifier_clk,
|
||||
&g12b_cpub_clk_sys_pll_nb_data.nb);
|
||||
notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
|
||||
ret = devm_clk_notifier_register(dev, notifier_clk,
|
||||
&g12b_cpub_clk_sys_pll_nb_data.nb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register the sys_pll notifier\n");
|
||||
dev_err(dev, "failed to register the sys_pll notifier\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -5269,29 +5346,29 @@ static int meson_g12b_dvfs_setup(struct platform_device *pdev)
|
|||
static int meson_g12a_dvfs_setup(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw **hws = g12a_hw_onecell_data.hws;
|
||||
const char *notifier_clk_name;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct clk *notifier_clk;
|
||||
int ret;
|
||||
|
||||
ret = meson_g12a_dvfs_setup_common(pdev, hws);
|
||||
ret = meson_g12a_dvfs_setup_common(dev, hws);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Setup clock notifier for cpu_clk mux */
|
||||
notifier_clk_name = clk_hw_get_name(&g12a_cpu_clk.hw);
|
||||
notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
|
||||
notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk.hw, DVFS_CON_ID);
|
||||
ret = devm_clk_notifier_register(dev, notifier_clk,
|
||||
&g12a_cpu_clk_mux_nb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register the cpu_clk notifier\n");
|
||||
dev_err(dev, "failed to register the cpu_clk notifier\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Setup clock notifier for sys_pll */
|
||||
notifier_clk_name = clk_hw_get_name(&g12a_sys_pll.hw);
|
||||
notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
ret = clk_notifier_register(notifier_clk, &g12a_sys_pll_nb_data.nb);
|
||||
notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
|
||||
ret = devm_clk_notifier_register(dev, notifier_clk,
|
||||
&g12a_sys_pll_nb_data.nb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register the sys_pll notifier\n");
|
||||
dev_err(dev, "failed to register the sys_pll notifier\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -5370,6 +5447,7 @@ static const struct of_device_id clkc_match_table[] = {
|
|||
},
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, clkc_match_table);
|
||||
|
||||
static struct platform_driver g12a_driver = {
|
||||
.probe = meson_g12a_probe,
|
||||
|
@ -5379,4 +5457,5 @@ static struct platform_driver g12a_driver = {
|
|||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(g12a_driver);
|
||||
module_platform_driver(g12a_driver);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -264,8 +264,9 @@
|
|||
#define CLKID_NNA_AXI_CLK_DIV 263
|
||||
#define CLKID_NNA_CORE_CLK_SEL 265
|
||||
#define CLKID_NNA_CORE_CLK_DIV 266
|
||||
#define CLKID_MIPI_DSI_PXCLK_DIV 268
|
||||
|
||||
#define NR_CLKS 268
|
||||
#define NR_CLKS 271
|
||||
|
||||
/* include the CLKIDs that have been made part of the DT binding */
|
||||
#include <dt-bindings/clock/g12a-clkc.h>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/module.h>
|
||||
#include "meson-aoclk.h"
|
||||
#include "gxbb-aoclk.h"
|
||||
|
||||
|
@ -287,6 +288,7 @@ static const struct of_device_id gxbb_aoclkc_match_table[] = {
|
|||
},
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, gxbb_aoclkc_match_table);
|
||||
|
||||
static struct platform_driver gxbb_aoclkc_driver = {
|
||||
.probe = meson_aoclkc_probe,
|
||||
|
@ -295,4 +297,5 @@ static struct platform_driver gxbb_aoclkc_driver = {
|
|||
.of_match_table = gxbb_aoclkc_match_table,
|
||||
},
|
||||
};
|
||||
builtin_platform_driver(gxbb_aoclkc_driver);
|
||||
module_platform_driver(gxbb_aoclkc_driver);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "gxbb.h"
|
||||
#include "clk-regmap.h"
|
||||
|
@ -3519,6 +3520,7 @@ static const struct of_device_id clkc_match_table[] = {
|
|||
{ .compatible = "amlogic,gxl-clkc", .data = &gxl_clkc_data },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, clkc_match_table);
|
||||
|
||||
static struct platform_driver gxbb_driver = {
|
||||
.probe = meson_eeclkc_probe,
|
||||
|
@ -3528,4 +3530,5 @@ static struct platform_driver gxbb_driver = {
|
|||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(gxbb_driver);
|
||||
module_platform_driver(gxbb_driver);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
#include <linux/reset-controller.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include "meson-aoclk.h"
|
||||
|
||||
|
@ -84,3 +86,5 @@ int meson_aoclkc_probe(struct platform_device *pdev)
|
|||
return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
|
||||
(void *) data->hw_data);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(meson_aoclkc_probe);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "clk-regmap.h"
|
||||
#include "meson-eeclk.h"
|
||||
|
@ -54,3 +55,5 @@ int meson_eeclkc_probe(struct platform_device *pdev)
|
|||
return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
|
||||
data->hw_onecell_data);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(meson_eeclkc_probe);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -72,5 +72,30 @@
|
|||
#define CLKID_PCIE_CML_EN1 80
|
||||
#define CLKID_MIPI_ENABLE 81
|
||||
#define CLKID_GEN_CLK 84
|
||||
#define CLKID_VPU_0_SEL 92
|
||||
#define CLKID_VPU_0 93
|
||||
#define CLKID_VPU_1_SEL 95
|
||||
#define CLKID_VPU_1 96
|
||||
#define CLKID_VPU 97
|
||||
#define CLKID_VAPB_0_SEL 99
|
||||
#define CLKID_VAPB_0 100
|
||||
#define CLKID_VAPB_1_SEL 102
|
||||
#define CLKID_VAPB_1 103
|
||||
#define CLKID_VAPB_SEL 104
|
||||
#define CLKID_VAPB 105
|
||||
#define CLKID_VCLK 106
|
||||
#define CLKID_VCLK2 107
|
||||
#define CLKID_VCLK_DIV1 122
|
||||
#define CLKID_VCLK_DIV2 123
|
||||
#define CLKID_VCLK_DIV4 124
|
||||
#define CLKID_VCLK_DIV6 125
|
||||
#define CLKID_VCLK_DIV12 126
|
||||
#define CLKID_VCLK2_DIV1 127
|
||||
#define CLKID_VCLK2_DIV2 128
|
||||
#define CLKID_VCLK2_DIV4 129
|
||||
#define CLKID_VCLK2_DIV6 130
|
||||
#define CLKID_VCLK2_DIV12 131
|
||||
#define CLKID_CTS_ENCL 133
|
||||
#define CLKID_VDIN_MEAS 136
|
||||
|
||||
#endif /* __AXG_CLKC_H */
|
||||
|
|
|
@ -147,5 +147,7 @@
|
|||
#define CLKID_SPICC1_SCLK 261
|
||||
#define CLKID_NNA_AXI_CLK 264
|
||||
#define CLKID_NNA_CORE_CLK 267
|
||||
#define CLKID_MIPI_DSI_PXCLK_SEL 269
|
||||
#define CLKID_MIPI_DSI_PXCLK 270
|
||||
|
||||
#endif /* __G12A_CLKC_H */
|
||||
|
|
|
@ -1088,6 +1088,11 @@ static inline struct clk_hw *__clk_get_hw(struct clk *clk)
|
|||
return (struct clk_hw *)clk;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct clk *clk_hw_get_clk(struct clk_hw *hw, const char *con_id);
|
||||
struct clk *devm_clk_hw_get_clk(struct device *dev, struct clk_hw *hw,
|
||||
const char *con_id);
|
||||
|
||||
unsigned int clk_hw_get_num_parents(const struct clk_hw *hw);
|
||||
struct clk_hw *clk_hw_get_parent(const struct clk_hw *hw);
|
||||
struct clk_hw *clk_hw_get_parent_by_index(const struct clk_hw *hw,
|
||||
|
|
|
@ -109,6 +109,17 @@ int clk_notifier_register(struct clk *clk, struct notifier_block *nb);
|
|||
*/
|
||||
int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb);
|
||||
|
||||
/**
|
||||
* devm_clk_notifier_register - register a managed rate-change notifier callback
|
||||
* @dev: device for clock "consumer"
|
||||
* @clk: clock whose rate we are interested in
|
||||
* @nb: notifier block with callback function pointer
|
||||
*
|
||||
* Returns 0 on success, -EERROR otherwise
|
||||
*/
|
||||
int devm_clk_notifier_register(struct device *dev, struct clk *clk,
|
||||
struct notifier_block *nb);
|
||||
|
||||
/**
|
||||
* clk_get_accuracy - obtain the clock accuracy in ppb (parts per billion)
|
||||
* for a clock source.
|
||||
|
@ -186,6 +197,13 @@ static inline int clk_notifier_unregister(struct clk *clk,
|
|||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline int devm_clk_notifier_register(struct device *dev,
|
||||
struct clk *clk,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline long clk_get_accuracy(struct clk *clk)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
|
|
Loading…
Reference in New Issue