Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sh: Break out SuperH PFC code

This file breaks out the SuperH PFC code from
arch/sh/kernel/gpio.c + arch/sh/include/asm/gpio.h
to drivers/sh/pfc.c + include/linux/sh_pfc.h.

Similar to the INTC stuff. The non-SuperH specific
file location makes it possible to share the code
between multiple architectures.

Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>

authored by

Magnus Damm and committed by
Paul Mundt
fae43399 fc1d003d

+98 -82
+1 -81
arch/sh/include/asm/gpio.h
··· 20 20 #endif 21 21 22 22 #define ARCH_NR_GPIOS 512 23 - #include <asm-generic/gpio.h> 23 + #include <linux/sh_pfc.h> 24 24 25 25 #ifdef CONFIG_GPIOLIB 26 26 ··· 52 52 } 53 53 54 54 #endif /* CONFIG_GPIOLIB */ 55 - 56 - typedef unsigned short pinmux_enum_t; 57 - typedef unsigned short pinmux_flag_t; 58 - 59 - #define PINMUX_TYPE_NONE 0 60 - #define PINMUX_TYPE_FUNCTION 1 61 - #define PINMUX_TYPE_GPIO 2 62 - #define PINMUX_TYPE_OUTPUT 3 63 - #define PINMUX_TYPE_INPUT 4 64 - #define PINMUX_TYPE_INPUT_PULLUP 5 65 - #define PINMUX_TYPE_INPUT_PULLDOWN 6 66 - 67 - #define PINMUX_FLAG_TYPE (0x7) 68 - #define PINMUX_FLAG_WANT_PULLUP (1 << 3) 69 - #define PINMUX_FLAG_WANT_PULLDOWN (1 << 4) 70 - 71 - #define PINMUX_FLAG_DBIT_SHIFT 5 72 - #define PINMUX_FLAG_DBIT (0x1f << PINMUX_FLAG_DBIT_SHIFT) 73 - #define PINMUX_FLAG_DREG_SHIFT 10 74 - #define PINMUX_FLAG_DREG (0x3f << PINMUX_FLAG_DREG_SHIFT) 75 - 76 - struct pinmux_gpio { 77 - pinmux_enum_t enum_id; 78 - pinmux_flag_t flags; 79 - }; 80 - 81 - #define PINMUX_GPIO(gpio, data_or_mark) [gpio] = { data_or_mark } 82 - #define PINMUX_DATA(data_or_mark, ids...) data_or_mark, ids, 0 83 - 84 - struct pinmux_cfg_reg { 85 - unsigned long reg, reg_width, field_width; 86 - unsigned long *cnt; 87 - pinmux_enum_t *enum_ids; 88 - }; 89 - 90 - #define PINMUX_CFG_REG(name, r, r_width, f_width) \ 91 - .reg = r, .reg_width = r_width, .field_width = f_width, \ 92 - .cnt = (unsigned long [r_width / f_width]) {}, \ 93 - .enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)]) \ 94 - 95 - struct pinmux_data_reg { 96 - unsigned long reg, reg_width, reg_shadow; 97 - pinmux_enum_t *enum_ids; 98 - }; 99 - 100 - #define PINMUX_DATA_REG(name, r, r_width) \ 101 - .reg = r, .reg_width = r_width, \ 102 - .enum_ids = (pinmux_enum_t [r_width]) \ 103 - 104 - struct pinmux_range { 105 - pinmux_enum_t begin; 106 - pinmux_enum_t end; 107 - pinmux_enum_t force; 108 - }; 109 - 110 - struct pinmux_info { 111 - char *name; 112 - pinmux_enum_t reserved_id; 113 - struct pinmux_range data; 114 - struct pinmux_range input; 115 - struct pinmux_range input_pd; 116 - struct pinmux_range input_pu; 117 - struct pinmux_range output; 118 - struct pinmux_range mark; 119 - struct pinmux_range function; 120 - 121 - unsigned first_gpio, last_gpio; 122 - 123 - struct pinmux_gpio *gpios; 124 - struct pinmux_cfg_reg *cfg_regs; 125 - struct pinmux_data_reg *data_regs; 126 - 127 - pinmux_enum_t *gpio_data; 128 - unsigned int gpio_data_size; 129 - 130 - unsigned long *gpio_in_use; 131 - struct gpio_chip chip; 132 - }; 133 - 134 - int register_pinmux(struct pinmux_info *pip); 135 55 136 56 #endif /* __ASM_SH_GPIO_H */
-1
arch/sh/kernel/Makefile
··· 32 32 obj-$(CONFIG_STACKTRACE) += stacktrace.o 33 33 obj-$(CONFIG_IO_TRAPPED) += io_trapped.o 34 34 obj-$(CONFIG_KPROBES) += kprobes.o 35 - obj-$(CONFIG_GENERIC_GPIO) += gpio.o 36 35 obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o 37 36 obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o 38 37 obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
arch/sh/kernel/gpio.c drivers/sh/pfc.c
+1
drivers/sh/Makefile
··· 3 3 # 4 4 obj-$(CONFIG_SUPERHYWAY) += superhyway/ 5 5 obj-$(CONFIG_MAPLE) += maple/ 6 + obj-$(CONFIG_GENERIC_GPIO) += pfc.o 6 7 obj-y += intc.o
+96
include/linux/sh_pfc.h
··· 1 + /* 2 + * SuperH Pin Function Controller Support 3 + * 4 + * Copyright (c) 2008 Magnus Damm 5 + * 6 + * This file is subject to the terms and conditions of the GNU General Public 7 + * License. See the file "COPYING" in the main directory of this archive 8 + * for more details. 9 + */ 10 + 11 + #ifndef __SH_PFC_H 12 + #define __SH_PFC_H 13 + 14 + #include <asm-generic/gpio.h> 15 + 16 + typedef unsigned short pinmux_enum_t; 17 + typedef unsigned short pinmux_flag_t; 18 + 19 + #define PINMUX_TYPE_NONE 0 20 + #define PINMUX_TYPE_FUNCTION 1 21 + #define PINMUX_TYPE_GPIO 2 22 + #define PINMUX_TYPE_OUTPUT 3 23 + #define PINMUX_TYPE_INPUT 4 24 + #define PINMUX_TYPE_INPUT_PULLUP 5 25 + #define PINMUX_TYPE_INPUT_PULLDOWN 6 26 + 27 + #define PINMUX_FLAG_TYPE (0x7) 28 + #define PINMUX_FLAG_WANT_PULLUP (1 << 3) 29 + #define PINMUX_FLAG_WANT_PULLDOWN (1 << 4) 30 + 31 + #define PINMUX_FLAG_DBIT_SHIFT 5 32 + #define PINMUX_FLAG_DBIT (0x1f << PINMUX_FLAG_DBIT_SHIFT) 33 + #define PINMUX_FLAG_DREG_SHIFT 10 34 + #define PINMUX_FLAG_DREG (0x3f << PINMUX_FLAG_DREG_SHIFT) 35 + 36 + struct pinmux_gpio { 37 + pinmux_enum_t enum_id; 38 + pinmux_flag_t flags; 39 + }; 40 + 41 + #define PINMUX_GPIO(gpio, data_or_mark) [gpio] = { data_or_mark } 42 + #define PINMUX_DATA(data_or_mark, ids...) data_or_mark, ids, 0 43 + 44 + struct pinmux_cfg_reg { 45 + unsigned long reg, reg_width, field_width; 46 + unsigned long *cnt; 47 + pinmux_enum_t *enum_ids; 48 + }; 49 + 50 + #define PINMUX_CFG_REG(name, r, r_width, f_width) \ 51 + .reg = r, .reg_width = r_width, .field_width = f_width, \ 52 + .cnt = (unsigned long [r_width / f_width]) {}, \ 53 + .enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)]) \ 54 + 55 + struct pinmux_data_reg { 56 + unsigned long reg, reg_width, reg_shadow; 57 + pinmux_enum_t *enum_ids; 58 + }; 59 + 60 + #define PINMUX_DATA_REG(name, r, r_width) \ 61 + .reg = r, .reg_width = r_width, \ 62 + .enum_ids = (pinmux_enum_t [r_width]) \ 63 + 64 + struct pinmux_range { 65 + pinmux_enum_t begin; 66 + pinmux_enum_t end; 67 + pinmux_enum_t force; 68 + }; 69 + 70 + struct pinmux_info { 71 + char *name; 72 + pinmux_enum_t reserved_id; 73 + struct pinmux_range data; 74 + struct pinmux_range input; 75 + struct pinmux_range input_pd; 76 + struct pinmux_range input_pu; 77 + struct pinmux_range output; 78 + struct pinmux_range mark; 79 + struct pinmux_range function; 80 + 81 + unsigned first_gpio, last_gpio; 82 + 83 + struct pinmux_gpio *gpios; 84 + struct pinmux_cfg_reg *cfg_regs; 85 + struct pinmux_data_reg *data_regs; 86 + 87 + pinmux_enum_t *gpio_data; 88 + unsigned int gpio_data_size; 89 + 90 + unsigned long *gpio_in_use; 91 + struct gpio_chip chip; 92 + }; 93 + 94 + int register_pinmux(struct pinmux_info *pip); 95 + 96 + #endif /* __SH_PFC_H */