123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- /* SPDX-License-Identifier: GPL-2.0-or-later */
- /*
- * 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>
- #include "pinmux-aspeed.h"
- /**
- * @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;
- u32 mask;
- };
- #define ASPEED_PINCTRL_PIN(name_) \
- [name_] = { \
- .number = name_, \
- .name = #name_, \
- .drv_data = (void *) &(PIN_SYM(name_)) \
- }
- #define ASPEED_SB_PINCONF(param_, pin0_, pin1_, reg_, bit_) { \
- .param = param_, \
- .pins = {pin0_, pin1_}, \
- .reg = reg_, \
- .mask = BIT_MASK(bit_) \
- }
- #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_)
- /*
- * 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
- * @mask: The bitfield mask for @val
- *
- * 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;
- u32 mask;
- };
- struct aspeed_pinctrl_data {
- struct regmap *scu;
- const struct pinctrl_pin_desc *pins;
- const unsigned int npins;
- const struct aspeed_pin_config *configs;
- const unsigned int nconfigs;
- struct aspeed_pinmux_data pinmux;
- const struct aspeed_pin_config_map *confmaps;
- const unsigned int nconfmaps;
- };
- /* Aspeed pinctrl helpers */
- 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);
- 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);
- #endif /* PINCTRL_ASPEED */
|