2015-08-06 13:37:42 +03:00
/*
* Copyright ( c ) 2015 , The Linux Foundation . All rights reserved .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation .
*
* 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_GDSC_H__
# define __QCOM_GDSC_H__
# include <linux/err.h>
# include <linux/pm_domain.h>
struct regmap ;
2015-08-06 13:37:45 +03:00
struct reset_controller_dev ;
2015-08-06 13:37:42 +03:00
/**
* struct gdsc - Globally Distributed Switch Controller
* @ pd : generic power domain
* @ regmap : regmap for MMIO accesses
* @ gdscr : gsdc control register
2015-12-01 19:12:12 +03:00
* @ gds_hw_ctrl : gds_hw_ctrl register
2015-08-06 13:37:44 +03:00
* @ cxcs : offsets of branch registers to toggle mem / periph bits in
* @ cxc_count : number of @ cxcs
* @ pwrsts : Possible powerdomain power states
2015-08-06 13:37:45 +03:00
* @ resets : ids of resets associated with this gdsc
* @ reset_count : number of @ resets
* @ rcdev : reset controller
2015-08-06 13:37:42 +03:00
*/
struct gdsc {
struct generic_pm_domain pd ;
2015-12-01 19:12:11 +03:00
struct generic_pm_domain * parent ;
2015-08-06 13:37:42 +03:00
struct regmap * regmap ;
unsigned int gdscr ;
2015-12-01 19:12:12 +03:00
unsigned int gds_hw_ctrl ;
2015-08-06 13:37:44 +03:00
unsigned int * cxcs ;
unsigned int cxc_count ;
const u8 pwrsts ;
2015-12-01 19:12:13 +03:00
/* Powerdomain allowable state bitfields */
# define PWRSTS_OFF BIT(0)
# define PWRSTS_RET BIT(1)
# define PWRSTS_ON BIT(2)
# define PWRSTS_OFF_ON (PWRSTS_OFF | PWRSTS_ON)
# define PWRSTS_RET_ON (PWRSTS_RET | PWRSTS_ON)
const u8 flags ;
# define VOTABLE BIT(0)
2015-08-06 13:37:45 +03:00
struct reset_controller_dev * rcdev ;
unsigned int * resets ;
unsigned int reset_count ;
2015-08-06 13:37:42 +03:00
} ;
2015-12-01 19:12:11 +03:00
struct gdsc_desc {
struct device * dev ;
struct gdsc * * scs ;
size_t num ;
} ;
2015-08-06 13:37:42 +03:00
# ifdef CONFIG_QCOM_GDSC
2015-12-01 19:12:11 +03:00
int gdsc_register ( struct gdsc_desc * desc , struct reset_controller_dev * ,
struct regmap * ) ;
void gdsc_unregister ( struct gdsc_desc * desc ) ;
2015-08-06 13:37:42 +03:00
# else
2015-12-01 19:12:11 +03:00
static inline int gdsc_register ( struct gdsc_desc * desc ,
2015-08-06 13:37:45 +03:00
struct reset_controller_dev * rcdev ,
2015-08-06 13:37:42 +03:00
struct regmap * r )
{
return - ENOSYS ;
}
2015-12-01 19:12:11 +03:00
static inline void gdsc_unregister ( struct gdsc_desc * desc ) { } ;
2015-08-06 13:37:42 +03:00
# endif /* CONFIG_QCOM_GDSC */
# endif /* __QCOM_GDSC_H__ */