forked from torvalds/linux
-
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: qcom: Add simple regmap based muxes
Add support for muxes that use regmap instead of readl/writel directly. We don't support as many features as clk-mux.c, but this is good enough to support getting and setting parents. Adding a table based lookup can be added in the future if needed. Signed-off-by: Stephen Boyd <[email protected]> Tested-by: Kenneth Westfield <[email protected]> Signed-off-by: Michael Turquette <[email protected]>
- Loading branch information
Showing
3 changed files
with
89 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
/* | ||
* Copyright (c) 2014, The Linux Foundation. All rights reserved. | ||
* | ||
* This software is licensed under the terms of the GNU General Public | ||
* License version 2, as published by the Free Software Foundation, and | ||
* may be copied, distributed, and modified under those terms. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/bitops.h> | ||
#include <linux/regmap.h> | ||
#include <linux/export.h> | ||
|
||
#include "clk-regmap-mux.h" | ||
|
||
static inline struct clk_regmap_mux *to_clk_regmap_mux(struct clk_hw *hw) | ||
{ | ||
return container_of(to_clk_regmap(hw), struct clk_regmap_mux, clkr); | ||
} | ||
|
||
static u8 mux_get_parent(struct clk_hw *hw) | ||
{ | ||
struct clk_regmap_mux *mux = to_clk_regmap_mux(hw); | ||
struct clk_regmap *clkr = to_clk_regmap(hw); | ||
unsigned int mask = GENMASK(mux->width - 1, 0); | ||
unsigned int val; | ||
|
||
regmap_read(clkr->regmap, mux->reg, &val); | ||
|
||
val >>= mux->shift; | ||
val &= mask; | ||
|
||
return val; | ||
} | ||
|
||
static int mux_set_parent(struct clk_hw *hw, u8 index) | ||
{ | ||
struct clk_regmap_mux *mux = to_clk_regmap_mux(hw); | ||
struct clk_regmap *clkr = to_clk_regmap(hw); | ||
unsigned int mask = GENMASK(mux->width + mux->shift - 1, mux->shift); | ||
unsigned int val; | ||
|
||
val = index; | ||
val <<= mux->shift; | ||
|
||
return regmap_update_bits(clkr->regmap, mux->reg, mask, val); | ||
} | ||
|
||
const struct clk_ops clk_regmap_mux_closest_ops = { | ||
.get_parent = mux_get_parent, | ||
.set_parent = mux_set_parent, | ||
.determine_rate = __clk_mux_determine_rate_closest, | ||
}; | ||
EXPORT_SYMBOL_GPL(clk_regmap_mux_closest_ops); |
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,29 @@ | ||
/* | ||
* Copyright (c) 2014, The Linux Foundation. All rights reserved. | ||
* | ||
* This software is licensed under the terms of the GNU General Public | ||
* License version 2, as published by the Free Software Foundation, and | ||
* may be copied, distributed, and modified under those terms. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
|
||
#ifndef __QCOM_CLK_REGMAP_MUX_H__ | ||
#define __QCOM_CLK_REGMAP_MUX_H__ | ||
|
||
#include <linux/clk-provider.h> | ||
#include "clk-regmap.h" | ||
|
||
struct clk_regmap_mux { | ||
u32 reg; | ||
u32 shift; | ||
u32 width; | ||
struct clk_regmap clkr; | ||
}; | ||
|
||
extern const struct clk_ops clk_regmap_mux_closest_ops; | ||
|
||
#endif |