2018-07-16 08:54:32 +03:00
// SPDX-License-Identifier: GPL-2.0
2014-01-15 22:47:23 +04:00
/*
* Copyright ( c ) 2014 , The Linux Foundation . All rights reserved .
*/
# 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
*
2021-01-26 15:45:23 +03:00
* @ dev : reference to the caller ' s device
2014-01-15 22:47:23 +04:00
* @ 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 .
*/
2016-08-17 01:38:27 +03:00
int devm_clk_register_regmap ( struct device * dev , struct clk_regmap * rclk )
2014-01-15 22:47:23 +04:00
{
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 ) ;
2016-08-17 01:38:27 +03:00
return devm_clk_hw_register ( dev , & rclk - > hw ) ;
2014-01-15 22:47:23 +04:00
}
EXPORT_SYMBOL_GPL ( devm_clk_register_regmap ) ;