-
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 a regmap type clock struct
Add a clock type that associates a regmap pointer and some enable/disable bits with a clk_hw struct. This will be the struct that a hw specific implementation wraps if it wants to use the regmap helper functions. Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Mike Turquette <mturquette@linaro.org>
- Loading branch information
Stephen Boyd
authored and
Mike Turquette
committed
Jan 16, 2014
1 parent
3fa2252
commit 085d7a4
Showing
6 changed files
with
170 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,5 @@ | ||
config COMMON_CLK_QCOM | ||
tristate "Support for Qualcomm's clock controllers" | ||
depends on OF | ||
select REGMAP_MMIO | ||
|
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_COMMON_CLK_QCOM) += clk-qcom.o | ||
|
||
clk-qcom-$(CONFIG_COMMON_CLK_QCOM) += clk-regmap.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,114 @@ | ||
/* | ||
* 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/device.h> | ||
#include <linux/clk-provider.h> | ||
#include <linux/regmap.h> | ||
#include <linux/export.h> | ||
|
||
#include "clk-regmap.h" | ||
|
||
/** | ||
* clk_is_enabled_regmap - standard is_enabled() for regmap users | ||
* | ||
* @hw: clk to operate on | ||
* | ||
* Clocks that use regmap for their register I/O can set the | ||
* enable_reg and enable_mask fields in their struct clk_regmap and then use | ||
* this as their is_enabled operation, saving some code. | ||
*/ | ||
int clk_is_enabled_regmap(struct clk_hw *hw) | ||
{ | ||
struct clk_regmap *rclk = to_clk_regmap(hw); | ||
unsigned int val; | ||
int ret; | ||
|
||
ret = regmap_read(rclk->regmap, rclk->enable_reg, &val); | ||
if (ret != 0) | ||
return ret; | ||
|
||
if (rclk->enable_is_inverted) | ||
return (val & rclk->enable_mask) == 0; | ||
else | ||
return (val & rclk->enable_mask) != 0; | ||
} | ||
EXPORT_SYMBOL_GPL(clk_is_enabled_regmap); | ||
|
||
/** | ||
* clk_enable_regmap - standard enable() for regmap users | ||
* | ||
* @hw: clk to operate on | ||
* | ||
* Clocks that use regmap for their register I/O can set the | ||
* enable_reg and enable_mask fields in their struct clk_regmap and then use | ||
* this as their enable() operation, saving some code. | ||
*/ | ||
int clk_enable_regmap(struct clk_hw *hw) | ||
{ | ||
struct clk_regmap *rclk = to_clk_regmap(hw); | ||
unsigned int val; | ||
|
||
if (rclk->enable_is_inverted) | ||
val = 0; | ||
else | ||
val = rclk->enable_mask; | ||
|
||
return regmap_update_bits(rclk->regmap, rclk->enable_reg, | ||
rclk->enable_mask, val); | ||
} | ||
EXPORT_SYMBOL_GPL(clk_enable_regmap); | ||
|
||
/** | ||
* clk_disable_regmap - standard disable() for regmap users | ||
* | ||
* @hw: clk to operate on | ||
* | ||
* Clocks that use regmap for their register I/O can set the | ||
* enable_reg and enable_mask fields in their struct clk_regmap and then use | ||
* this as their disable() operation, saving some code. | ||
*/ | ||
void clk_disable_regmap(struct clk_hw *hw) | ||
{ | ||
struct clk_regmap *rclk = to_clk_regmap(hw); | ||
unsigned int val; | ||
|
||
if (rclk->enable_is_inverted) | ||
val = rclk->enable_mask; | ||
else | ||
val = 0; | ||
|
||
regmap_update_bits(rclk->regmap, rclk->enable_reg, rclk->enable_mask, | ||
val); | ||
} | ||
EXPORT_SYMBOL_GPL(clk_disable_regmap); | ||
|
||
/** | ||
* devm_clk_register_regmap - register a clk_regmap clock | ||
* | ||
* @rclk: clk to operate on | ||
* | ||
* Clocks that use regmap for their register I/O should register their | ||
* clk_regmap struct via this function so that the regmap is initialized | ||
* and so that the clock is registered with the common clock framework. | ||
*/ | ||
struct clk *devm_clk_register_regmap(struct device *dev, | ||
struct clk_regmap *rclk) | ||
{ | ||
if (dev && dev_get_regmap(dev, NULL)) | ||
rclk->regmap = dev_get_regmap(dev, NULL); | ||
else if (dev && dev->parent) | ||
rclk->regmap = dev_get_regmap(dev->parent, NULL); | ||
|
||
return devm_clk_register(dev, &rclk->hw); | ||
} | ||
EXPORT_SYMBOL_GPL(devm_clk_register_regmap); |
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,45 @@ | ||
/* | ||
* 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_H__ | ||
#define __QCOM_CLK_REGMAP_H__ | ||
|
||
#include <linux/clk-provider.h> | ||
|
||
struct regmap; | ||
|
||
/** | ||
* struct clk_regmap - regmap supporting clock | ||
* @hw: handle between common and hardware-specific interfaces | ||
* @regmap: regmap to use for regmap helpers and/or by providers | ||
* @enable_reg: register when using regmap enable/disable ops | ||
* @enable_mask: mask when using regmap enable/disable ops | ||
* @enable_is_inverted: flag to indicate set enable_mask bits to disable | ||
* when using clock_enable_regmap and friends APIs. | ||
*/ | ||
struct clk_regmap { | ||
struct clk_hw hw; | ||
struct regmap *regmap; | ||
unsigned int enable_reg; | ||
unsigned int enable_mask; | ||
bool enable_is_inverted; | ||
}; | ||
#define to_clk_regmap(_hw) container_of(_hw, struct clk_regmap, hw) | ||
|
||
int clk_is_enabled_regmap(struct clk_hw *hw); | ||
int clk_enable_regmap(struct clk_hw *hw); | ||
void clk_disable_regmap(struct clk_hw *hw); | ||
struct clk * | ||
devm_clk_register_regmap(struct device *dev, struct clk_regmap *rclk); | ||
|
||
#endif |