| /* | |
| * linux/drivers/pinctrl/pinctrl-lantiq.h | |
| * based on linux/drivers/pinctrl/pinctrl-pxa3xx.h | |
| * | |
| * This program is free software; you can redistribute it and/or modify | |
| * it under the terms of the GNU General Public License version 2 as | |
| * publishhed by the Free Software Foundation. | |
| * | |
| * Copyright (C) 2012 John Crispin <blogic@openwrt.org> | |
| */ | |
| #ifndef __PINCTRL_LANTIQ_H | |
| #define __PINCTRL_LANTIQ_H | |
| #include <linux/clkdev.h> | |
| #include <linux/pinctrl/pinctrl.h> | |
| #include <linux/pinctrl/pinconf.h> | |
| #include <linux/pinctrl/pinmux.h> | |
| #include <linux/pinctrl/consumer.h> | |
| #include <linux/pinctrl/machine.h> | |
| #include "core.h" | |
| #define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x) | |
| #define LTQ_MAX_MUX 4 | |
| #define MFPR_FUNC_MASK 0x3 | |
| #define LTQ_PINCONF_PACK(param, arg) ((param) << 16 | (arg)) | |
| #define LTQ_PINCONF_UNPACK_PARAM(conf) ((conf) >> 16) | |
| #define LTQ_PINCONF_UNPACK_ARG(conf) ((conf) & 0xffff) | |
| enum ltq_pinconf_param { | |
| LTQ_PINCONF_PARAM_PULL, | |
| LTQ_PINCONF_PARAM_OPEN_DRAIN, | |
| LTQ_PINCONF_PARAM_DRIVE_CURRENT, | |
| LTQ_PINCONF_PARAM_SLEW_RATE, | |
| LTQ_PINCONF_PARAM_OUTPUT, | |
| }; | |
| struct ltq_cfg_param { | |
| const char *property; | |
| enum ltq_pinconf_param param; | |
| }; | |
| struct ltq_mfp_pin { | |
| const char *name; | |
| const unsigned int pin; | |
| const unsigned short func[LTQ_MAX_MUX]; | |
| }; | |
| struct ltq_pin_group { | |
| const char *name; | |
| const unsigned mux; | |
| const unsigned *pins; | |
| const unsigned npins; | |
| }; | |
| struct ltq_pmx_func { | |
| const char *name; | |
| const char * const *groups; | |
| const unsigned num_groups; | |
| }; | |
| struct ltq_pinmux_info { | |
| struct device *dev; | |
| struct pinctrl_dev *pctrl; | |
| /* we need to manage up to 5 pad controllers */ | |
| void __iomem *membase[5]; | |
| /* the descriptor for the subsystem */ | |
| struct pinctrl_desc *desc; | |
| /* we expose our pads to the subsystem */ | |
| struct pinctrl_pin_desc *pads; | |
| /* the number of pads. this varies between socs */ | |
| unsigned int num_pads; | |
| /* these are our multifunction pins */ | |
| const struct ltq_mfp_pin *mfp; | |
| unsigned int num_mfp; | |
| /* a number of multifunction pins can be grouped together */ | |
| const struct ltq_pin_group *grps; | |
| unsigned int num_grps; | |
| /* a mapping between function string and id */ | |
| const struct ltq_pmx_func *funcs; | |
| unsigned int num_funcs; | |
| /* the pinconf options that we are able to read from the DT */ | |
| const struct ltq_cfg_param *params; | |
| unsigned int num_params; | |
| /* the pad controller can have a irq mapping */ | |
| const unsigned *exin; | |
| unsigned int num_exin; | |
| /* we need 5 clocks max */ | |
| struct clk *clk[5]; | |
| /* soc specific callback used to apply muxing */ | |
| int (*apply_mux)(struct pinctrl_dev *pctrldev, int pin, int mux); | |
| }; | |
| enum ltq_pin { | |
| GPIO0 = 0, | |
| GPIO1, | |
| GPIO2, | |
| GPIO3, | |
| GPIO4, | |
| GPIO5, | |
| GPIO6, | |
| GPIO7, | |
| GPIO8, | |
| GPIO9, | |
| GPIO10, /* 10 */ | |
| GPIO11, | |
| GPIO12, | |
| GPIO13, | |
| GPIO14, | |
| GPIO15, | |
| GPIO16, | |
| GPIO17, | |
| GPIO18, | |
| GPIO19, | |
| GPIO20, /* 20 */ | |
| GPIO21, | |
| GPIO22, | |
| GPIO23, | |
| GPIO24, | |
| GPIO25, | |
| GPIO26, | |
| GPIO27, | |
| GPIO28, | |
| GPIO29, | |
| GPIO30, /* 30 */ | |
| GPIO31, | |
| GPIO32, | |
| GPIO33, | |
| GPIO34, | |
| GPIO35, | |
| GPIO36, | |
| GPIO37, | |
| GPIO38, | |
| GPIO39, | |
| GPIO40, /* 40 */ | |
| GPIO41, | |
| GPIO42, | |
| GPIO43, | |
| GPIO44, | |
| GPIO45, | |
| GPIO46, | |
| GPIO47, | |
| GPIO48, | |
| GPIO49, | |
| GPIO50, /* 50 */ | |
| GPIO51, | |
| GPIO52, | |
| GPIO53, | |
| GPIO54, | |
| GPIO55, | |
| GPIO56, | |
| GPIO57, | |
| GPIO58, | |
| GPIO59, | |
| GPIO60, /* 60 */ | |
| GPIO61, | |
| GPIO62, | |
| GPIO63, | |
| GPIO64, | |
| GPIO65, | |
| GPIO66, | |
| GPIO67, | |
| GPIO68, | |
| GPIO69, | |
| GPIO70, | |
| GPIO71, | |
| GPIO72, | |
| GPIO73, | |
| GPIO74, | |
| GPIO75, | |
| GPIO76, | |
| GPIO77, | |
| GPIO78, | |
| GPIO79, | |
| GPIO80, | |
| GPIO81, | |
| GPIO82, | |
| GPIO83, | |
| GPIO84, | |
| GPIO85, | |
| GPIO86, | |
| GPIO87, | |
| GPIO88, | |
| }; | |
| extern int ltq_pinctrl_register(struct platform_device *pdev, | |
| struct ltq_pinmux_info *info); | |
| extern int ltq_pinctrl_unregister(struct platform_device *pdev); | |
| #endif /* __PINCTRL_LANTIQ_H */ |