Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  1/*
  2 * Copyright (c) 2014, The Linux Foundation. All rights reserved.
  3 *
  4 * This software is licensed under the terms of the GNU General Public
  5 * License version 2, as published by the Free Software Foundation, and
  6 * may be copied, distributed, and modified under those terms.
  7 *
  8 * This program is distributed in the hope that it will be useful,
  9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 11 * GNU General Public License for more details.
 12 */
 13
 14#include <linux/device.h>
 15#include <linux/clk-provider.h>
 16#include <linux/regmap.h>
 17#include <linux/export.h>
 18
 19#include "clk-regmap.h"
 20
 21/**
 22 * clk_is_enabled_regmap - standard is_enabled() for regmap users
 23 *
 24 * @hw: clk to operate on
 25 *
 26 * Clocks that use regmap for their register I/O can set the
 27 * enable_reg and enable_mask fields in their struct clk_regmap and then use
 28 * this as their is_enabled operation, saving some code.
 29 */
 30int clk_is_enabled_regmap(struct clk_hw *hw)
 31{
 32	struct clk_regmap *rclk = to_clk_regmap(hw);
 33	unsigned int val;
 34	int ret;
 35
 36	ret = regmap_read(rclk->regmap, rclk->enable_reg, &val);
 37	if (ret != 0)
 38		return ret;
 39
 40	if (rclk->enable_is_inverted)
 41		return (val & rclk->enable_mask) == 0;
 42	else
 43		return (val & rclk->enable_mask) != 0;
 44}
 45EXPORT_SYMBOL_GPL(clk_is_enabled_regmap);
 46
 47/**
 48 * clk_enable_regmap - standard enable() for regmap users
 49 *
 50 * @hw: clk to operate on
 51 *
 52 * Clocks that use regmap for their register I/O can set the
 53 * enable_reg and enable_mask fields in their struct clk_regmap and then use
 54 * this as their enable() operation, saving some code.
 55 */
 56int clk_enable_regmap(struct clk_hw *hw)
 57{
 58	struct clk_regmap *rclk = to_clk_regmap(hw);
 59	unsigned int val;
 60
 61	if (rclk->enable_is_inverted)
 62		val = 0;
 63	else
 64		val = rclk->enable_mask;
 65
 66	return regmap_update_bits(rclk->regmap, rclk->enable_reg,
 67				  rclk->enable_mask, val);
 68}
 69EXPORT_SYMBOL_GPL(clk_enable_regmap);
 70
 71/**
 72 * clk_disable_regmap - standard disable() for regmap users
 73 *
 74 * @hw: clk to operate on
 75 *
 76 * Clocks that use regmap for their register I/O can set the
 77 * enable_reg and enable_mask fields in their struct clk_regmap and then use
 78 * this as their disable() operation, saving some code.
 79 */
 80void clk_disable_regmap(struct clk_hw *hw)
 81{
 82	struct clk_regmap *rclk = to_clk_regmap(hw);
 83	unsigned int val;
 84
 85	if (rclk->enable_is_inverted)
 86		val = rclk->enable_mask;
 87	else
 88		val = 0;
 89
 90	regmap_update_bits(rclk->regmap, rclk->enable_reg, rclk->enable_mask,
 91			   val);
 92}
 93EXPORT_SYMBOL_GPL(clk_disable_regmap);
 94
 95/**
 96 * devm_clk_register_regmap - register a clk_regmap clock
 97 *
 98 * @rclk: clk to operate on
 99 *
100 * Clocks that use regmap for their register I/O should register their
101 * clk_regmap struct via this function so that the regmap is initialized
102 * and so that the clock is registered with the common clock framework.
103 */
104struct clk *devm_clk_register_regmap(struct device *dev,
105				     struct clk_regmap *rclk)
106{
107	if (dev && dev_get_regmap(dev, NULL))
108		rclk->regmap = dev_get_regmap(dev, NULL);
109	else if (dev && dev->parent)
110		rclk->regmap = dev_get_regmap(dev->parent, NULL);
111
112	return devm_clk_register(dev, &rclk->hw);
113}
114EXPORT_SYMBOL_GPL(devm_clk_register_regmap);