0001
0002
0003
0004
0005
0006 #include <linux/device.h>
0007 #include <linux/clk-provider.h>
0008 #include <linux/regmap.h>
0009 #include <linux/export.h>
0010
0011 #include "clk-regmap.h"
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 int clk_is_enabled_regmap(struct clk_hw *hw)
0023 {
0024 struct clk_regmap *rclk = to_clk_regmap(hw);
0025 unsigned int val;
0026 int ret;
0027
0028 ret = regmap_read(rclk->regmap, rclk->enable_reg, &val);
0029 if (ret != 0)
0030 return ret;
0031
0032 if (rclk->enable_is_inverted)
0033 return (val & rclk->enable_mask) == 0;
0034 else
0035 return (val & rclk->enable_mask) != 0;
0036 }
0037 EXPORT_SYMBOL_GPL(clk_is_enabled_regmap);
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 int clk_enable_regmap(struct clk_hw *hw)
0049 {
0050 struct clk_regmap *rclk = to_clk_regmap(hw);
0051 unsigned int val;
0052
0053 if (rclk->enable_is_inverted)
0054 val = 0;
0055 else
0056 val = rclk->enable_mask;
0057
0058 return regmap_update_bits(rclk->regmap, rclk->enable_reg,
0059 rclk->enable_mask, val);
0060 }
0061 EXPORT_SYMBOL_GPL(clk_enable_regmap);
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072 void clk_disable_regmap(struct clk_hw *hw)
0073 {
0074 struct clk_regmap *rclk = to_clk_regmap(hw);
0075 unsigned int val;
0076
0077 if (rclk->enable_is_inverted)
0078 val = rclk->enable_mask;
0079 else
0080 val = 0;
0081
0082 regmap_update_bits(rclk->regmap, rclk->enable_reg, rclk->enable_mask,
0083 val);
0084 }
0085 EXPORT_SYMBOL_GPL(clk_disable_regmap);
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 int devm_clk_register_regmap(struct device *dev, struct clk_regmap *rclk)
0098 {
0099 if (dev && dev_get_regmap(dev, NULL))
0100 rclk->regmap = dev_get_regmap(dev, NULL);
0101 else if (dev && dev->parent)
0102 rclk->regmap = dev_get_regmap(dev->parent, NULL);
0103
0104 return devm_clk_hw_register(dev, &rclk->hw);
0105 }
0106 EXPORT_SYMBOL_GPL(devm_clk_register_regmap);