|  | /* | 
|  | *  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, | 
|  |  | 
|  | 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 */ |