2019-05-27 08:55:01 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2016-08-30 17:24:24 +09:30
/*
* Copyright ( C ) 2016 IBM Corp .
*/
# ifndef PINCTRL_ASPEED
# define PINCTRL_ASPEED
# include <linux/pinctrl/pinctrl.h>
# include <linux/pinctrl/pinmux.h>
# include <linux/pinctrl/pinconf.h>
# include <linux/pinctrl/pinconf-generic.h>
# include <linux/regmap.h>
2019-07-09 13:41:53 +02:00
# include "pinmux-aspeed.h"
2016-08-30 17:24:24 +09:30
2017-04-07 22:27:11 +09:30
/**
* @ param The pinconf parameter type
* @ pins The pin range this config struct covers , [ low , high ]
* @ reg The register housing the configuration bits
* @ mask The mask to select the bits of interest in @ reg
*/
struct aspeed_pin_config {
enum pin_config_param param ;
unsigned int pins [ 2 ] ;
unsigned int reg ;
2019-12-02 16:44:31 +10:30
u32 mask ;
2017-04-07 22:27:11 +09:30
} ;
2016-08-30 17:24:24 +09:30
# define ASPEED_PINCTRL_PIN(name_) \
[ name_ ] = { \
. number = name_ , \
. name = # name_ , \
. drv_data = ( void * ) & ( PIN_SYM ( name_ ) ) \
}
2019-12-02 16:44:29 +10:30
# define ASPEED_SB_PINCONF(param_, pin0_, pin1_, reg_, bit_) { \
. param = param_ , \
. pins = { pin0_ , pin1_ } , \
. reg = reg_ , \
2019-12-02 16:44:31 +10:30
. mask = BIT_MASK ( bit_ ) \
2019-12-02 16:44:29 +10:30
}
2019-12-02 16:44:32 +10:30
# define ASPEED_PULL_DOWN_PINCONF(pin_, reg_, bit_) \
ASPEED_SB_PINCONF ( PIN_CONFIG_BIAS_PULL_DOWN , pin_ , pin_ , reg_ , bit_ ) , \
ASPEED_SB_PINCONF ( PIN_CONFIG_BIAS_DISABLE , pin_ , pin_ , reg_ , bit_ )
# define ASPEED_PULL_UP_PINCONF(pin_, reg_, bit_) \
ASPEED_SB_PINCONF ( PIN_CONFIG_BIAS_PULL_UP , pin_ , pin_ , reg_ , bit_ ) , \
ASPEED_SB_PINCONF ( PIN_CONFIG_BIAS_DISABLE , pin_ , pin_ , reg_ , bit_ )
2019-12-02 16:44:30 +10:30
/*
* Aspeed pin configuration description .
*
* @ param : pinconf configuration parameter
* @ arg : The supported argument for @ param , or - 1 if any value is supported
* @ val : The register value to write to configure @ arg for @ param
2019-12-02 16:44:31 +10:30
* @ mask : The bitfield mask for @ val
2019-12-02 16:44:30 +10:30
*
* The map is to be used in conjunction with the configuration array supplied
* by the driver implementation .
*/
struct aspeed_pin_config_map {
enum pin_config_param param ;
s32 arg ;
u32 val ;
2019-12-02 16:44:31 +10:30
u32 mask ;
2019-12-02 16:44:30 +10:30
} ;
2019-06-28 12:08:37 +09:30
struct aspeed_pinctrl_data {
struct regmap * scu ;
const struct pinctrl_pin_desc * pins ;
2016-08-30 17:24:24 +09:30
const unsigned int npins ;
2019-06-28 12:08:37 +09:30
const struct aspeed_pin_config * configs ;
const unsigned int nconfigs ;
2016-08-30 17:24:24 +09:30
2019-06-28 12:08:37 +09:30
struct aspeed_pinmux_data pinmux ;
2019-12-02 16:44:30 +10:30
const struct aspeed_pin_config_map * confmaps ;
const unsigned int nconfmaps ;
2016-08-30 17:24:24 +09:30
} ;
2019-06-28 12:08:37 +09:30
/* Aspeed pinctrl helpers */
2016-08-30 17:24:24 +09:30
int aspeed_pinctrl_get_groups_count ( struct pinctrl_dev * pctldev ) ;
const char * aspeed_pinctrl_get_group_name ( struct pinctrl_dev * pctldev ,
unsigned int group ) ;
int aspeed_pinctrl_get_group_pins ( struct pinctrl_dev * pctldev ,
unsigned int group , const unsigned int * * pins ,
unsigned int * npins ) ;
void aspeed_pinctrl_pin_dbg_show ( struct pinctrl_dev * pctldev ,
struct seq_file * s , unsigned int offset ) ;
int aspeed_pinmux_get_fn_count ( struct pinctrl_dev * pctldev ) ;
const char * aspeed_pinmux_get_fn_name ( struct pinctrl_dev * pctldev ,
unsigned int function ) ;
int aspeed_pinmux_get_fn_groups ( struct pinctrl_dev * pctldev ,
unsigned int function , const char * const * * groups ,
unsigned int * const num_groups ) ;
int aspeed_pinmux_set_mux ( struct pinctrl_dev * pctldev , unsigned int function ,
unsigned int group ) ;
int aspeed_gpio_request_enable ( struct pinctrl_dev * pctldev ,
struct pinctrl_gpio_range * range ,
unsigned int offset ) ;
int aspeed_pinctrl_probe ( struct platform_device * pdev ,
struct pinctrl_desc * pdesc ,
struct aspeed_pinctrl_data * pdata ) ;
2017-04-07 22:27:11 +09:30
int aspeed_pin_config_get ( struct pinctrl_dev * pctldev , unsigned int offset ,
unsigned long * config ) ;
int aspeed_pin_config_set ( struct pinctrl_dev * pctldev , unsigned int offset ,
unsigned long * configs , unsigned int num_configs ) ;
int aspeed_pin_config_group_get ( struct pinctrl_dev * pctldev ,
unsigned int selector ,
unsigned long * config ) ;
int aspeed_pin_config_group_set ( struct pinctrl_dev * pctldev ,
unsigned int selector ,
unsigned long * configs ,
unsigned int num_configs ) ;
2016-08-30 17:24:24 +09:30
# endif /* PINCTRL_ASPEED */