#ifndef __GPIO_DEBUG_H_ #define __GPIO_DEBUG_H_ #include struct gpio_debug; #define TYPE_CONF_REG 0x00 #define TYPE_PIN_VALUE 0x01 #define TYPE_DIRECTION 0x02 #define TYPE_IRQ_TYPE 0x03 #define TYPE_PINMUX 0x04 #define TYPE_PULLMODE 0x05 #define TYPE_PULLSTRENGTH 0x06 #define TYPE_OPEN_DRAIN 0x07 #define TYPE_IRQ_COUNT 0x08 #define TYPE_WAKEUP 0x09 #define TYPE_WAKEUP_COUNT 0x0A #define TYPE_OVERRIDE_OUTDIR 0x0B #define TYPE_OVERRIDE_OUTVAL 0x0C #define TYPE_OVERRIDE_INDIR 0x0D #define TYPE_OVERRIDE_INVAL 0x0E #define TYPE_DEBOUNCE 0x0F #define TYPE_SBY_OVR_IO 0x10 #define TYPE_SBY_OVR_OUTVAL 0x11 #define TYPE_SBY_OVR_INVAL 0x12 #define TYPE_SBY_OVR_OUTDIR 0x13 #define TYPE_SBY_OVR_INDIR 0x14 #define TYPE_SBY_PUPD_STATE 0x15 #define TYPE_SBY_OD_DIS 0x16 #define TYPE_IRQ_LINE 0x17 #define TYPE_MAX 0x18 struct gpio_control { unsigned type, num; char **pininfo; u32 reg, invert; u32 shift, rshift; u32 mask; int (*get)(struct gpio_control *control, void *private_data, unsigned gpio); int (*set)(struct gpio_control *control, void *private_data, unsigned gpio, unsigned int num); int (*get_handle)(int val); void (*set_handle)(unsigned int num, int *val); }; struct gpio_debug_ops { unsigned int (*get_conf_reg)(struct gpio_debug *debug, unsigned gpio); void (*set_conf_reg)(struct gpio_debug *debug, unsigned gpio, unsigned int value); char **(*get_avl_pininfo)(struct gpio_debug *debug, unsigned gpio, unsigned int type, unsigned *num); char *(*get_cul_pininfo)(struct gpio_debug *debug, unsigned gpio, unsigned int type); void (*set_pininfo)(struct gpio_debug *debug, unsigned gpio, unsigned int type, const char *info); int (*get_register_msg)(char **buf, unsigned long *size); }; struct gpio_debug { unsigned long typebit[BITS_TO_LONGS(TYPE_MAX)]; struct gpio_chip *chip; struct gpio_debug_ops *ops; unsigned long irq_count[ARCH_NR_GPIOS]; unsigned long wakeup_count[ARCH_NR_GPIOS]; void *private_data; }; #ifdef CONFIG_GPIODEBUG #define DEFINE_DEBUG_IRQ_CONUNT_INCREASE(gpio) (debug->irq_count[gpio]++) struct gpio_control *find_gpio_control(struct gpio_control *control, int num, unsigned type); int find_pininfo_num(struct gpio_control *control, const char *info); struct gpio_debug *gpio_debug_alloc(void); void gpio_debug_remove(struct gpio_debug *debug); int gpio_debug_register(struct gpio_debug *debug); #else #define DEFINE_DEBUG_IRQ_CONUNT_INCREASE(gpio) static inline struct gpio_control *find_gpio_control( struct gpio_control *control, int num, unsigned type) { return NULL; } static inline int find_pininfo_num(struct gpio_control *control, const char *info) { return 0; } static inline struct gpio_debug *gpio_debug_alloc(void) { return NULL; } static inline void gpio_debug_remove(struct gpio_debug *debug) { return NULL; } static inline int gpio_debug_register(struct gpio_debug *debug) { return 0; } #endif #endif