#ifndef __PINCTRL_BRCMSTB_H__
#define __PINCTRL_BRCMSTB_H__
#include <linux/types.h>
#include <linux/platform_device.h>
#define BRCMSTB_FUNC(f) \
[func_##f] = #f
#define MUX_BIT_VALID 0x8000
#define PAD_BIT_INVALID 0xffff
#define MUX_BIT(muxreg, muxshift) \
(MUX_BIT_VALID + ((muxreg) << 5) + ((muxshift) << 2))
#define PAD_BIT(padreg, padshift) \
(((padreg) << 5) + ((padshift) << 1))
#define GPIO_REGS(n, muxreg, muxshift, padreg, padshift) \
[n] = { MUX_BIT(muxreg, muxshift), PAD_BIT(padreg, padshift) }
#define EMMC_REGS(n, padreg, padshift) \
[n] = { 0, PAD_BIT(padreg, padshift) }
#define AON_GPIO_REGS(n, muxreg, muxshift, padreg, padshift) \
GPIO_REGS(n, muxreg, muxshift, padreg, padshift)
#define AON_SGPIO_REGS(n, muxreg, muxshift) \
[(n) + 32] = { MUX_BIT(muxreg, muxshift), PAD_BIT_INVALID }
#define GPIO_PIN(n) PINCTRL_PIN(n, "gpio" #n)
#define AON_GPIO_PIN(n) PINCTRL_PIN(n, "aon_gpio" #n)
#define AON_SGPIO_PIN(n) PINCTRL_PIN((n) + 32, "aon_sgpio" #n)
struct pin_regs {
u16 mux_bit;
u16 pad_bit;
};
struct brcmstb_pin_funcs {
const u32 func_mask;
const u8 *funcs;
const unsigned int n_funcs;
};
struct brcmstb_pdata {
const struct pinctrl_desc *pctl_desc;
const struct pinctrl_gpio_range *gpio_range;
const struct pin_regs *pin_regs;
const struct brcmstb_pin_funcs *pin_funcs;
const unsigned int func_count;
const unsigned int func_gpio;
const char * const *func_names;
};
int brcmstb_pinctrl_probe(struct platform_device *pdev);
#endif