-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
clk: sprd: Add common infrastructure
Added Spreadtrum's clock driver framework together with common structures and interface functions. Signed-off-by: Chunyan Zhang <chunyan.zhang@spreadtrum.com> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
- Loading branch information
Chunyan Zhang
authored and
Stephen Boyd
committed
Dec 21, 2017
1 parent
1ded879
commit d41f59f
Showing
6 changed files
with
143 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
config SPRD_COMMON_CLK | ||
tristate "Clock support for Spreadtrum SoCs" | ||
depends on ARCH_SPRD || COMPILE_TEST | ||
default ARCH_SPRD |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
obj-$(CONFIG_SPRD_COMMON_CLK) += clk-sprd.o | ||
|
||
clk-sprd-y += common.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
// | ||
// Spreadtrum clock infrastructure | ||
// | ||
// Copyright (C) 2017 Spreadtrum, Inc. | ||
// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com> | ||
|
||
#include <linux/mfd/syscon.h> | ||
#include <linux/module.h> | ||
#include <linux/of_address.h> | ||
#include <linux/of_platform.h> | ||
#include <linux/regmap.h> | ||
|
||
#include "common.h" | ||
|
||
static const struct regmap_config sprdclk_regmap_config = { | ||
.reg_bits = 32, | ||
.reg_stride = 4, | ||
.val_bits = 32, | ||
.max_register = 0xffff, | ||
.fast_io = true, | ||
}; | ||
|
||
static void sprd_clk_set_regmap(const struct sprd_clk_desc *desc, | ||
struct regmap *regmap) | ||
{ | ||
int i; | ||
struct sprd_clk_common *cclk; | ||
|
||
for (i = 0; i < desc->num_clk_clks; i++) { | ||
cclk = desc->clk_clks[i]; | ||
if (!cclk) | ||
continue; | ||
|
||
cclk->regmap = regmap; | ||
} | ||
} | ||
|
||
int sprd_clk_regmap_init(struct platform_device *pdev, | ||
const struct sprd_clk_desc *desc) | ||
{ | ||
void __iomem *base; | ||
struct device_node *node = pdev->dev.of_node; | ||
struct regmap *regmap; | ||
|
||
if (of_find_property(node, "sprd,syscon", NULL)) { | ||
regmap = syscon_regmap_lookup_by_phandle(node, "sprd,syscon"); | ||
if (IS_ERR_OR_NULL(regmap)) { | ||
pr_err("%s: failed to get syscon regmap\n", __func__); | ||
return PTR_ERR(regmap); | ||
} | ||
} else { | ||
base = of_iomap(node, 0); | ||
regmap = devm_regmap_init_mmio(&pdev->dev, base, | ||
&sprdclk_regmap_config); | ||
if (IS_ERR_OR_NULL(regmap)) { | ||
pr_err("failed to init regmap\n"); | ||
return PTR_ERR(regmap); | ||
} | ||
} | ||
|
||
sprd_clk_set_regmap(desc, regmap); | ||
|
||
return 0; | ||
} | ||
EXPORT_SYMBOL_GPL(sprd_clk_regmap_init); | ||
|
||
int sprd_clk_probe(struct device *dev, struct clk_hw_onecell_data *clkhw) | ||
{ | ||
int i, ret; | ||
struct clk_hw *hw; | ||
|
||
for (i = 0; i < clkhw->num; i++) { | ||
|
||
hw = clkhw->hws[i]; | ||
|
||
if (!hw) | ||
continue; | ||
|
||
ret = devm_clk_hw_register(dev, hw); | ||
if (ret) { | ||
dev_err(dev, "Couldn't register clock %d - %s\n", | ||
i, hw->init->name); | ||
return ret; | ||
} | ||
} | ||
|
||
ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clkhw); | ||
if (ret) | ||
dev_err(dev, "Failed to add clock provider\n"); | ||
|
||
return ret; | ||
} | ||
EXPORT_SYMBOL_GPL(sprd_clk_probe); | ||
|
||
MODULE_LICENSE("GPL v2"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
// | ||
// Spreadtrum clock infrastructure | ||
// | ||
// Copyright (C) 2017 Spreadtrum, Inc. | ||
// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com> | ||
|
||
#ifndef _SPRD_CLK_COMMON_H_ | ||
#define _SPRD_CLK_COMMON_H_ | ||
|
||
#include <linux/clk-provider.h> | ||
#include <linux/of_platform.h> | ||
#include <linux/regmap.h> | ||
|
||
struct device_node; | ||
|
||
struct sprd_clk_common { | ||
struct regmap *regmap; | ||
u32 reg; | ||
struct clk_hw hw; | ||
}; | ||
|
||
struct sprd_clk_desc { | ||
struct sprd_clk_common **clk_clks; | ||
unsigned long num_clk_clks; | ||
struct clk_hw_onecell_data *hw_clks; | ||
}; | ||
|
||
static inline struct sprd_clk_common * | ||
hw_to_sprd_clk_common(const struct clk_hw *hw) | ||
{ | ||
return container_of(hw, struct sprd_clk_common, hw); | ||
} | ||
int sprd_clk_regmap_init(struct platform_device *pdev, | ||
const struct sprd_clk_desc *desc); | ||
int sprd_clk_probe(struct device *dev, struct clk_hw_onecell_data *clkhw); | ||
|
||
#endif /* _SPRD_CLK_COMMON_H_ */ |