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