diff options
115 files changed, 2576 insertions, 1032 deletions
diff --git a/.gitignore b/.gitignore index 946c7ec5c922..fb2190c61af0 100644 --- a/.gitignore +++ b/.gitignore | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | *.lst | 22 | *.lst |
| 23 | *.symtypes | 23 | *.symtypes |
| 24 | *.order | 24 | *.order |
| 25 | modules.builtin | ||
| 25 | *.elf | 26 | *.elf |
| 26 | *.bin | 27 | *.bin |
| 27 | *.gz | 28 | *.gz |
| @@ -45,14 +46,8 @@ Module.symvers | |||
| 45 | # | 46 | # |
| 46 | # Generated include files | 47 | # Generated include files |
| 47 | # | 48 | # |
| 48 | include/asm | ||
| 49 | include/asm-*/asm-offsets.h | ||
| 50 | include/config | 49 | include/config |
| 51 | include/linux/autoconf.h | ||
| 52 | include/linux/compile.h | ||
| 53 | include/linux/version.h | 50 | include/linux/version.h |
| 54 | include/linux/utsrelease.h | ||
| 55 | include/linux/bounds.h | ||
| 56 | include/generated | 51 | include/generated |
| 57 | 52 | ||
| 58 | # stgit generated dirs | 53 | # stgit generated dirs |
diff --git a/Documentation/dontdiff b/Documentation/dontdiff index e151b2a36267..3ad6acead949 100644 --- a/Documentation/dontdiff +++ b/Documentation/dontdiff | |||
| @@ -103,6 +103,7 @@ gconf | |||
| 103 | gen-devlist | 103 | gen-devlist |
| 104 | gen_crc32table | 104 | gen_crc32table |
| 105 | gen_init_cpio | 105 | gen_init_cpio |
| 106 | generated | ||
| 106 | genheaders | 107 | genheaders |
| 107 | genksyms | 108 | genksyms |
| 108 | *_gray256.c | 109 | *_gray256.c |
diff --git a/Documentation/kbuild/kbuild.txt b/Documentation/kbuild/kbuild.txt index bb3bf38f03da..6f8c1cabbc5d 100644 --- a/Documentation/kbuild/kbuild.txt +++ b/Documentation/kbuild/kbuild.txt | |||
| @@ -1,3 +1,17 @@ | |||
| 1 | Output files | ||
| 2 | |||
| 3 | modules.order | ||
| 4 | -------------------------------------------------- | ||
| 5 | This file records the order in which modules appear in Makefiles. This | ||
| 6 | is used by modprobe to deterministically resolve aliases that match | ||
| 7 | multiple modules. | ||
| 8 | |||
| 9 | modules.builtin | ||
| 10 | -------------------------------------------------- | ||
| 11 | This file lists all modules that are built into the kernel. This is used | ||
| 12 | by modprobe to not fail when trying to load something builtin. | ||
| 13 | |||
| 14 | |||
| 1 | Environment variables | 15 | Environment variables |
| 2 | 16 | ||
| 3 | KCPPFLAGS | 17 | KCPPFLAGS |
diff --git a/Documentation/kbuild/kconfig.txt b/Documentation/kbuild/kconfig.txt index 849b5e56d06f..49efae703979 100644 --- a/Documentation/kbuild/kconfig.txt +++ b/Documentation/kbuild/kconfig.txt | |||
| @@ -103,10 +103,16 @@ KCONFIG_AUTOCONFIG | |||
| 103 | This environment variable can be set to specify the path & name of the | 103 | This environment variable can be set to specify the path & name of the |
| 104 | "auto.conf" file. Its default value is "include/config/auto.conf". | 104 | "auto.conf" file. Its default value is "include/config/auto.conf". |
| 105 | 105 | ||
| 106 | KCONFIG_TRISTATE | ||
| 107 | -------------------------------------------------- | ||
| 108 | This environment variable can be set to specify the path & name of the | ||
| 109 | "tristate.conf" file. Its default value is "include/config/tristate.conf". | ||
| 110 | |||
| 106 | KCONFIG_AUTOHEADER | 111 | KCONFIG_AUTOHEADER |
| 107 | -------------------------------------------------- | 112 | -------------------------------------------------- |
| 108 | This environment variable can be set to specify the path & name of the | 113 | This environment variable can be set to specify the path & name of the |
| 109 | "autoconf.h" (header) file. Its default value is "include/linux/autoconf.h". | 114 | "autoconf.h" (header) file. |
| 115 | Its default value is "include/generated/autoconf.h". | ||
| 110 | 116 | ||
| 111 | 117 | ||
| 112 | ====================================================================== | 118 | ====================================================================== |
| @@ -8,7 +8,7 @@ | |||
| 8 | ##### | 8 | ##### |
| 9 | # 1) Generate bounds.h | 9 | # 1) Generate bounds.h |
| 10 | 10 | ||
| 11 | bounds-file := include/linux/bounds.h | 11 | bounds-file := include/generated/bounds.h |
| 12 | 12 | ||
| 13 | always := $(bounds-file) | 13 | always := $(bounds-file) |
| 14 | targets := $(bounds-file) kernel/bounds.s | 14 | targets := $(bounds-file) kernel/bounds.s |
| @@ -43,7 +43,7 @@ $(obj)/$(bounds-file): kernel/bounds.s Kbuild | |||
| 43 | # 2) Generate asm-offsets.h | 43 | # 2) Generate asm-offsets.h |
| 44 | # | 44 | # |
| 45 | 45 | ||
| 46 | offsets-file := include/asm/asm-offsets.h | 46 | offsets-file := include/generated/asm-offsets.h |
| 47 | 47 | ||
| 48 | always += $(offsets-file) | 48 | always += $(offsets-file) |
| 49 | targets += $(offsets-file) | 49 | targets += $(offsets-file) |
diff --git a/MAINTAINERS b/MAINTAINERS index 0699782f8c5b..efd2ef2c2660 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -5434,6 +5434,12 @@ F: drivers/uwb/* | |||
| 5434 | F: include/linux/uwb.h | 5434 | F: include/linux/uwb.h |
| 5435 | F: include/linux/uwb/ | 5435 | F: include/linux/uwb/ |
| 5436 | 5436 | ||
| 5437 | UNIFDEF | ||
| 5438 | M: Tony Finch <dot@dotat.at> | ||
| 5439 | W: http://dotat.at/prog/unifdef | ||
| 5440 | S: Maintained | ||
| 5441 | F: scripts/unifdef.c | ||
| 5442 | |||
| 5437 | UNIFORM CDROM DRIVER | 5443 | UNIFORM CDROM DRIVER |
| 5438 | M: Jens Axboe <axboe@kernel.dk> | 5444 | M: Jens Axboe <axboe@kernel.dk> |
| 5439 | W: http://www.kernel.dk | 5445 | W: http://www.kernel.dk |
| @@ -334,10 +334,9 @@ CFLAGS_GCOV = -fprofile-arcs -ftest-coverage | |||
| 334 | 334 | ||
| 335 | # Use LINUXINCLUDE when you must reference the include/ directory. | 335 | # Use LINUXINCLUDE when you must reference the include/ directory. |
| 336 | # Needed to be compatible with the O= option | 336 | # Needed to be compatible with the O= option |
| 337 | LINUXINCLUDE := -Iinclude \ | 337 | LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \ |
| 338 | $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \ | 338 | $(if $(KBUILD_SRC), -I$(srctree)/include) \ |
| 339 | -I$(srctree)/arch/$(hdr-arch)/include \ | 339 | -include include/generated/autoconf.h |
| 340 | -include include/linux/autoconf.h | ||
| 341 | 340 | ||
| 342 | KBUILD_CPPFLAGS := -D__KERNEL__ | 341 | KBUILD_CPPFLAGS := -D__KERNEL__ |
| 343 | 342 | ||
| @@ -465,7 +464,7 @@ ifeq ($(KBUILD_EXTMOD),) | |||
| 465 | # Carefully list dependencies so we do not try to build scripts twice | 464 | # Carefully list dependencies so we do not try to build scripts twice |
| 466 | # in parallel | 465 | # in parallel |
| 467 | PHONY += scripts | 466 | PHONY += scripts |
| 468 | scripts: scripts_basic include/config/auto.conf | 467 | scripts: scripts_basic include/config/auto.conf include/config/tristate.conf |
| 469 | $(Q)$(MAKE) $(build)=$(@) | 468 | $(Q)$(MAKE) $(build)=$(@) |
| 470 | 469 | ||
| 471 | # Objects we will link into vmlinux / subdirs we need to visit | 470 | # Objects we will link into vmlinux / subdirs we need to visit |
| @@ -492,18 +491,18 @@ $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ; | |||
| 492 | # with it and forgot to run make oldconfig. | 491 | # with it and forgot to run make oldconfig. |
| 493 | # if auto.conf.cmd is missing then we are probably in a cleaned tree so | 492 | # if auto.conf.cmd is missing then we are probably in a cleaned tree so |
| 494 | # we execute the config step to be sure to catch updated Kconfig files | 493 | # we execute the config step to be sure to catch updated Kconfig files |
| 495 | include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd | 494 | include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd |
| 496 | $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig | 495 | $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig |
| 497 | else | 496 | else |
| 498 | # external modules needs include/linux/autoconf.h and include/config/auto.conf | 497 | # external modules needs include/generated/autoconf.h and include/config/auto.conf |
| 499 | # but do not care if they are up-to-date. Use auto.conf to trigger the test | 498 | # but do not care if they are up-to-date. Use auto.conf to trigger the test |
| 500 | PHONY += include/config/auto.conf | 499 | PHONY += include/config/auto.conf |
| 501 | 500 | ||
| 502 | include/config/auto.conf: | 501 | include/config/auto.conf: |
| 503 | $(Q)test -e include/linux/autoconf.h -a -e $@ || ( \ | 502 | $(Q)test -e include/generated/autoconf.h -a -e $@ || ( \ |
| 504 | echo; \ | 503 | echo; \ |
| 505 | echo " ERROR: Kernel configuration is invalid."; \ | 504 | echo " ERROR: Kernel configuration is invalid."; \ |
| 506 | echo " include/linux/autoconf.h or $@ are missing."; \ | 505 | echo " include/generated/autoconf.h or $@ are missing.";\ |
| 507 | echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \ | 506 | echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \ |
| 508 | echo; \ | 507 | echo; \ |
| 509 | /bin/false) | 508 | /bin/false) |
| @@ -877,6 +876,9 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ; | |||
| 877 | PHONY += $(vmlinux-dirs) | 876 | PHONY += $(vmlinux-dirs) |
| 878 | $(vmlinux-dirs): prepare scripts | 877 | $(vmlinux-dirs): prepare scripts |
| 879 | $(Q)$(MAKE) $(build)=$@ | 878 | $(Q)$(MAKE) $(build)=$@ |
| 879 | ifdef CONFIG_MODULES | ||
| 880 | $(Q)$(MAKE) $(modbuiltin)=$@ | ||
| 881 | endif | ||
| 880 | 882 | ||
| 881 | # Build the kernel release string | 883 | # Build the kernel release string |
| 882 | # | 884 | # |
| @@ -955,7 +957,6 @@ PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3 | |||
| 955 | # prepare3 is used to check if we are building in a separate output directory, | 957 | # prepare3 is used to check if we are building in a separate output directory, |
| 956 | # and if so do: | 958 | # and if so do: |
| 957 | # 1) Check that make has not been executed in the kernel src $(srctree) | 959 | # 1) Check that make has not been executed in the kernel src $(srctree) |
| 958 | # 2) Create the include2 directory, used for the second asm symlink | ||
| 959 | prepare3: include/config/kernel.release | 960 | prepare3: include/config/kernel.release |
| 960 | ifneq ($(KBUILD_SRC),) | 961 | ifneq ($(KBUILD_SRC),) |
| 961 | @$(kecho) ' Using $(srctree) as source for kernel' | 962 | @$(kecho) ' Using $(srctree) as source for kernel' |
| @@ -964,17 +965,13 @@ ifneq ($(KBUILD_SRC),) | |||
| 964 | echo " in the '$(srctree)' directory.";\ | 965 | echo " in the '$(srctree)' directory.";\ |
| 965 | /bin/false; \ | 966 | /bin/false; \ |
| 966 | fi; | 967 | fi; |
| 967 | $(Q)if [ ! -d include2 ]; then \ | ||
| 968 | mkdir -p include2; \ | ||
| 969 | ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm; \ | ||
| 970 | fi | ||
| 971 | endif | 968 | endif |
| 972 | 969 | ||
| 973 | # prepare2 creates a makefile if using a separate output directory | 970 | # prepare2 creates a makefile if using a separate output directory |
| 974 | prepare2: prepare3 outputmakefile | 971 | prepare2: prepare3 outputmakefile |
| 975 | 972 | ||
| 976 | prepare1: prepare2 include/linux/version.h include/linux/utsrelease.h \ | 973 | prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \ |
| 977 | include/asm include/config/auto.conf | 974 | include/config/auto.conf |
| 978 | $(cmd_crmodverdir) | 975 | $(cmd_crmodverdir) |
| 979 | 976 | ||
| 980 | archprepare: prepare1 scripts_basic | 977 | archprepare: prepare1 scripts_basic |
| @@ -986,42 +983,6 @@ prepare0: archprepare FORCE | |||
| 986 | # All the preparing.. | 983 | # All the preparing.. |
| 987 | prepare: prepare0 | 984 | prepare: prepare0 |
| 988 | 985 | ||
| 989 | # The asm symlink changes when $(ARCH) changes. | ||
| 990 | # Detect this and ask user to run make mrproper | ||
| 991 | # If asm is a stale symlink (point to dir that does not exist) remove it | ||
| 992 | define check-symlink | ||
| 993 | set -e; \ | ||
| 994 | if [ -L include/asm ]; then \ | ||
| 995 | asmlink=`readlink include/asm | cut -d '-' -f 2`; \ | ||
| 996 | if [ "$$asmlink" != "$(SRCARCH)" ]; then \ | ||
| 997 | echo "ERROR: the symlink $@ points to asm-$$asmlink but asm-$(SRCARCH) was expected"; \ | ||
| 998 | echo " set ARCH or save .config and run 'make mrproper' to fix it"; \ | ||
| 999 | exit 1; \ | ||
| 1000 | fi; \ | ||
| 1001 | test -e $$asmlink || rm include/asm; \ | ||
| 1002 | elif [ -d include/asm ]; then \ | ||
| 1003 | echo "ERROR: $@ is a directory but a symlink was expected";\ | ||
| 1004 | exit 1; \ | ||
| 1005 | fi | ||
| 1006 | endef | ||
| 1007 | |||
| 1008 | # We create the target directory of the symlink if it does | ||
| 1009 | # not exist so the test in check-symlink works and we have a | ||
| 1010 | # directory for generated filesas used by some architectures. | ||
| 1011 | define create-symlink | ||
| 1012 | if [ ! -L include/asm ]; then \ | ||
| 1013 | $(kecho) ' SYMLINK $@ -> include/asm-$(SRCARCH)'; \ | ||
| 1014 | if [ ! -d include/asm-$(SRCARCH) ]; then \ | ||
| 1015 | mkdir -p include/asm-$(SRCARCH); \ | ||
| 1016 | fi; \ | ||
| 1017 | ln -fsn asm-$(SRCARCH) $@; \ | ||
| 1018 | fi | ||
| 1019 | endef | ||
| 1020 | |||
| 1021 | include/asm: FORCE | ||
| 1022 | $(Q)$(check-symlink) | ||
| 1023 | $(Q)$(create-symlink) | ||
| 1024 | |||
| 1025 | # Generate some files | 986 | # Generate some files |
| 1026 | # --------------------------------------------------------------------------- | 987 | # --------------------------------------------------------------------------- |
| 1027 | 988 | ||
| @@ -1046,7 +1007,7 @@ endef | |||
| 1046 | include/linux/version.h: $(srctree)/Makefile FORCE | 1007 | include/linux/version.h: $(srctree)/Makefile FORCE |
| 1047 | $(call filechk,version.h) | 1008 | $(call filechk,version.h) |
| 1048 | 1009 | ||
| 1049 | include/linux/utsrelease.h: include/config/kernel.release FORCE | 1010 | include/generated/utsrelease.h: include/config/kernel.release FORCE |
| 1050 | $(call filechk,utsrelease.h) | 1011 | $(call filechk,utsrelease.h) |
| 1051 | 1012 | ||
| 1052 | PHONY += headerdep | 1013 | PHONY += headerdep |
| @@ -1076,11 +1037,6 @@ firmware_install: FORCE | |||
| 1076 | export INSTALL_HDR_PATH = $(objtree)/usr | 1037 | export INSTALL_HDR_PATH = $(objtree)/usr |
| 1077 | 1038 | ||
| 1078 | hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj | 1039 | hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj |
| 1079 | # Find out where the Kbuild file is located to support | ||
| 1080 | # arch/$(ARCH)/include/asm | ||
| 1081 | hdr-dir = $(strip \ | ||
| 1082 | $(if $(wildcard $(srctree)/arch/$(hdr-arch)/include/asm/Kbuild), \ | ||
| 1083 | arch/$(hdr-arch)/include/asm, include/asm-$(hdr-arch))) | ||
| 1084 | 1040 | ||
| 1085 | # If we do an all arch process set dst to asm-$(hdr-arch) | 1041 | # If we do an all arch process set dst to asm-$(hdr-arch) |
| 1086 | hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm) | 1042 | hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm) |
| @@ -1095,10 +1051,10 @@ headers_install_all: | |||
| 1095 | 1051 | ||
| 1096 | PHONY += headers_install | 1052 | PHONY += headers_install |
| 1097 | headers_install: __headers | 1053 | headers_install: __headers |
| 1098 | $(if $(wildcard $(srctree)/$(hdr-dir)/Kbuild),, \ | 1054 | $(if $(wildcard $(srctree)/arch/$(hdr-arch)/include/asm/Kbuild),, \ |
| 1099 | $(error Headers not exportable for the $(SRCARCH) architecture)) | 1055 | $(error Headers not exportable for the $(SRCARCH) architecture)) |
| 1100 | $(Q)$(MAKE) $(hdr-inst)=include | 1056 | $(Q)$(MAKE) $(hdr-inst)=include |
| 1101 | $(Q)$(MAKE) $(hdr-inst)=$(hdr-dir) $(hdr-dst) | 1057 | $(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/asm $(hdr-dst) |
| 1102 | 1058 | ||
| 1103 | PHONY += headers_check_all | 1059 | PHONY += headers_check_all |
| 1104 | headers_check_all: headers_install_all | 1060 | headers_check_all: headers_install_all |
| @@ -1107,7 +1063,7 @@ headers_check_all: headers_install_all | |||
| 1107 | PHONY += headers_check | 1063 | PHONY += headers_check |
| 1108 | headers_check: headers_install | 1064 | headers_check: headers_install |
| 1109 | $(Q)$(MAKE) $(hdr-inst)=include HDRCHECK=1 | 1065 | $(Q)$(MAKE) $(hdr-inst)=include HDRCHECK=1 |
| 1110 | $(Q)$(MAKE) $(hdr-inst)=$(hdr-dir) $(hdr-dst) HDRCHECK=1 | 1066 | $(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/asm $(hdr-dst) HDRCHECK=1 |
| 1111 | 1067 | ||
| 1112 | # --------------------------------------------------------------------------- | 1068 | # --------------------------------------------------------------------------- |
| 1113 | # Modules | 1069 | # Modules |
| @@ -1127,6 +1083,7 @@ all: modules | |||
| 1127 | PHONY += modules | 1083 | PHONY += modules |
| 1128 | modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) | 1084 | modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) |
| 1129 | $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order | 1085 | $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order |
| 1086 | $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.builtin) > $(objtree)/modules.builtin | ||
| 1130 | @$(kecho) ' Building modules, stage 2.'; | 1087 | @$(kecho) ' Building modules, stage 2.'; |
| 1131 | $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost | 1088 | $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost |
| 1132 | $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild | 1089 | $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild |
| @@ -1156,6 +1113,7 @@ _modinst_: | |||
| 1156 | ln -s $(objtree) $(MODLIB)/build ; \ | 1113 | ln -s $(objtree) $(MODLIB)/build ; \ |
| 1157 | fi | 1114 | fi |
| 1158 | @cp -f $(objtree)/modules.order $(MODLIB)/ | 1115 | @cp -f $(objtree)/modules.order $(MODLIB)/ |
| 1116 | @cp -f $(objtree)/modules.builtin $(MODLIB)/ | ||
| 1159 | $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst | 1117 | $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst |
| 1160 | 1118 | ||
| 1161 | # This depmod is only for convenience to give the initial | 1119 | # This depmod is only for convenience to give the initial |
| @@ -1194,12 +1152,10 @@ CLEAN_FILES += vmlinux System.map \ | |||
| 1194 | .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map | 1152 | .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map |
| 1195 | 1153 | ||
| 1196 | # Directories & files removed with 'make mrproper' | 1154 | # Directories & files removed with 'make mrproper' |
| 1197 | MRPROPER_DIRS += include/config include2 usr/include include/generated | 1155 | MRPROPER_DIRS += include/config usr/include include/generated |
| 1198 | MRPROPER_FILES += .config .config.old include/asm .version .old_version \ | 1156 | MRPROPER_FILES += .config .config.old .version .old_version \ |
| 1199 | include/linux/autoconf.h include/linux/version.h \ | 1157 | include/linux/version.h \ |
| 1200 | include/linux/utsrelease.h \ | 1158 | Module.symvers tags TAGS cscope* |
| 1201 | include/linux/bounds.h include/asm*/asm-offsets.h \ | ||
| 1202 | Module.symvers Module.markers tags TAGS cscope* | ||
| 1203 | 1159 | ||
| 1204 | # clean - Delete most, but leave enough to build external modules | 1160 | # clean - Delete most, but leave enough to build external modules |
| 1205 | # | 1161 | # |
| @@ -1218,7 +1174,7 @@ clean: archclean $(clean-dirs) | |||
| 1218 | \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ | 1174 | \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ |
| 1219 | -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \ | 1175 | -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \ |
| 1220 | -o -name '*.symtypes' -o -name 'modules.order' \ | 1176 | -o -name '*.symtypes' -o -name 'modules.order' \ |
| 1221 | -o -name 'Module.markers' -o -name '.tmp_*.o.*' \ | 1177 | -o -name modules.builtin -o -name '.tmp_*.o.*' \ |
| 1222 | -o -name '*.gcno' \) -type f -print | xargs rm -f | 1178 | -o -name '*.gcno' \) -type f -print | xargs rm -f |
| 1223 | 1179 | ||
| 1224 | # mrproper - Delete all generated files, including .config | 1180 | # mrproper - Delete all generated files, including .config |
| @@ -1416,8 +1372,8 @@ $(clean-dirs): | |||
| 1416 | 1372 | ||
| 1417 | clean: rm-dirs := $(MODVERDIR) | 1373 | clean: rm-dirs := $(MODVERDIR) |
| 1418 | clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \ | 1374 | clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \ |
| 1419 | $(KBUILD_EXTMOD)/Module.markers \ | 1375 | $(KBUILD_EXTMOD)/modules.order \ |
| 1420 | $(KBUILD_EXTMOD)/modules.order | 1376 | $(KBUILD_EXTMOD)/modules.builtin |
| 1421 | clean: $(clean-dirs) | 1377 | clean: $(clean-dirs) |
| 1422 | $(call cmd,rmdirs) | 1378 | $(call cmd,rmdirs) |
| 1423 | $(call cmd,rmfiles) | 1379 | $(call cmd,rmfiles) |
diff --git a/arch/alpha/boot/bootp.c b/arch/alpha/boot/bootp.c index 3af21c789339..3c8d1b25c661 100644 --- a/arch/alpha/boot/bootp.c +++ b/arch/alpha/boot/bootp.c | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | */ | 9 | */ |
| 10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
| 11 | #include <linux/string.h> | 11 | #include <linux/string.h> |
| 12 | #include <linux/utsrelease.h> | 12 | #include <generated/utsrelease.h> |
| 13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
| 14 | 14 | ||
| 15 | #include <asm/system.h> | 15 | #include <asm/system.h> |
diff --git a/arch/alpha/boot/bootpz.c b/arch/alpha/boot/bootpz.c index 1036b515e20c..ade3f129dc27 100644 --- a/arch/alpha/boot/bootpz.c +++ b/arch/alpha/boot/bootpz.c | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | */ | 11 | */ |
| 12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
| 13 | #include <linux/string.h> | 13 | #include <linux/string.h> |
| 14 | #include <linux/utsrelease.h> | 14 | #include <generated/utsrelease.h> |
| 15 | #include <linux/mm.h> | 15 | #include <linux/mm.h> |
| 16 | 16 | ||
| 17 | #include <asm/system.h> | 17 | #include <asm/system.h> |
diff --git a/arch/alpha/boot/main.c b/arch/alpha/boot/main.c index 89f3be071ae5..644b7db55438 100644 --- a/arch/alpha/boot/main.c +++ b/arch/alpha/boot/main.c | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | */ | 7 | */ |
| 8 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
| 9 | #include <linux/string.h> | 9 | #include <linux/string.h> |
| 10 | #include <linux/utsrelease.h> | 10 | #include <generated/utsrelease.h> |
| 11 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
| 12 | 12 | ||
| 13 | #include <asm/system.h> | 13 | #include <asm/system.h> |
diff --git a/arch/alpha/include/asm/asm-offsets.h b/arch/alpha/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/alpha/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index fa0cdab2e1d3..e9da08483b3c 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
| @@ -242,15 +242,8 @@ all: $(KBUILD_IMAGE) | |||
| 242 | 242 | ||
| 243 | boot := arch/arm/boot | 243 | boot := arch/arm/boot |
| 244 | 244 | ||
| 245 | # Update machine arch and proc symlinks if something which affects | 245 | archprepare: |
| 246 | # them changed. We use .arch to indicate when they were updated | 246 | $(Q)$(MAKE) $(build)=arch/arm/tools include/generated/mach-types.h |
| 247 | # last, otherwise make uses the target directory mtime. | ||
| 248 | |||
| 249 | archprepare: maketools | ||
| 250 | |||
| 251 | PHONY += maketools FORCE | ||
| 252 | maketools: include/linux/version.h FORCE | ||
| 253 | $(Q)$(MAKE) $(build)=arch/arm/tools include/asm-arm/mach-types.h | ||
| 254 | 247 | ||
| 255 | # Convert bzImage to zImage | 248 | # Convert bzImage to zImage |
| 256 | bzImage: zImage | 249 | bzImage: zImage |
| @@ -261,9 +254,6 @@ zImage Image xipImage bootpImage uImage: vmlinux | |||
| 261 | zinstall install: vmlinux | 254 | zinstall install: vmlinux |
| 262 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@ | 255 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@ |
| 263 | 256 | ||
| 264 | CLEAN_FILES += include/asm-arm/mach-types.h \ | ||
| 265 | include/asm-arm/arch include/asm-arm/.arch | ||
| 266 | |||
| 267 | # We use MRPROPER_FILES and CLEAN_FILES now | 257 | # We use MRPROPER_FILES and CLEAN_FILES now |
| 268 | archclean: | 258 | archclean: |
| 269 | $(Q)$(MAKE) $(clean)=$(boot) | 259 | $(Q)$(MAKE) $(clean)=$(boot) |
diff --git a/arch/arm/include/asm/asm-offsets.h b/arch/arm/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/arm/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/arm/include/asm/mach-types.h b/arch/arm/include/asm/mach-types.h new file mode 100644 index 000000000000..948178cc6ba8 --- /dev/null +++ b/arch/arm/include/asm/mach-types.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/mach-types.h> | |||
diff --git a/arch/arm/tools/Makefile b/arch/arm/tools/Makefile index 1dbaa29ac4d7..635cb1865e4d 100644 --- a/arch/arm/tools/Makefile +++ b/arch/arm/tools/Makefile | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | # Copyright (C) 2001 Russell King | 4 | # Copyright (C) 2001 Russell King |
| 5 | # | 5 | # |
| 6 | 6 | ||
| 7 | include/asm-arm/mach-types.h: $(src)/gen-mach-types $(src)/mach-types | 7 | include/generated/mach-types.h: $(src)/gen-mach-types $(src)/mach-types |
| 8 | @echo ' Generating $@' | 8 | @echo ' Generating $@' |
| 9 | @mkdir -p $(dir $@) | 9 | @mkdir -p $(dir $@) |
| 10 | $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; } | 10 | $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; } |
diff --git a/arch/arm/tools/gen-mach-types b/arch/arm/tools/gen-mach-types index ce319ef64bc1..04fef71d7be9 100644 --- a/arch/arm/tools/gen-mach-types +++ b/arch/arm/tools/gen-mach-types | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | #!/bin/awk | 1 | #!/bin/awk |
| 2 | # | 2 | # |
| 3 | # Awk script to generate include/asm-arm/mach-types.h | 3 | # Awk script to generate include/generated/mach-types.h |
| 4 | # | 4 | # |
| 5 | BEGIN { nr = 0 } | 5 | BEGIN { nr = 0 } |
| 6 | /^#/ { next } | 6 | /^#/ { next } |
diff --git a/arch/avr32/include/asm/asm-offsets.h b/arch/avr32/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/avr32/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/blackfin/include/asm/asm-offsets.h b/arch/blackfin/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/blackfin/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/cris/arch-v32/kernel/head.S b/arch/cris/arch-v32/kernel/head.S index 3db478eb5155..76266f80a5f1 100644 --- a/arch/cris/arch-v32/kernel/head.S +++ b/arch/cris/arch-v32/kernel/head.S | |||
| @@ -10,7 +10,6 @@ | |||
| 10 | * The macros found in mmu_defs_asm.h uses the ## concatenation operator, so | 10 | * The macros found in mmu_defs_asm.h uses the ## concatenation operator, so |
| 11 | * -traditional must not be used when assembling this file. | 11 | * -traditional must not be used when assembling this file. |
| 12 | */ | 12 | */ |
| 13 | #include <linux/autoconf.h> | ||
| 14 | #include <arch/memmap.h> | 13 | #include <arch/memmap.h> |
| 15 | #include <hwregs/reg_rdwr.h> | 14 | #include <hwregs/reg_rdwr.h> |
| 16 | #include <hwregs/intr_vect.h> | 15 | #include <hwregs/intr_vect.h> |
diff --git a/arch/cris/include/asm/asm-offsets.h b/arch/cris/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/cris/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/cris/kernel/asm-offsets.c b/arch/cris/kernel/asm-offsets.c index ddd6fbbe75de..dd7b8e983221 100644 --- a/arch/cris/kernel/asm-offsets.c +++ b/arch/cris/kernel/asm-offsets.c | |||
| @@ -1,6 +1,5 @@ | |||
| 1 | #include <linux/sched.h> | 1 | #include <linux/sched.h> |
| 2 | #include <asm/thread_info.h> | 2 | #include <asm/thread_info.h> |
| 3 | #include <linux/autoconf.h> | ||
| 4 | 3 | ||
| 5 | /* | 4 | /* |
| 6 | * Generate definitions needed by assembly language modules. | 5 | * Generate definitions needed by assembly language modules. |
diff --git a/arch/cris/kernel/vmlinux.lds.S b/arch/cris/kernel/vmlinux.lds.S index bbfda67d2907..d49d17d2a14f 100644 --- a/arch/cris/kernel/vmlinux.lds.S +++ b/arch/cris/kernel/vmlinux.lds.S | |||
| @@ -8,7 +8,6 @@ | |||
| 8 | * the kernel has booted. | 8 | * the kernel has booted. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #include <linux/autoconf.h> | ||
| 12 | #include <asm-generic/vmlinux.lds.h> | 11 | #include <asm-generic/vmlinux.lds.h> |
| 13 | #include <asm/page.h> | 12 | #include <asm/page.h> |
| 14 | 13 | ||
diff --git a/arch/frv/include/asm/asm-offsets.h b/arch/frv/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/frv/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/frv/kernel/setup.c b/arch/frv/kernel/setup.c index 55e4fab7c0bc..75cf7f4b2fa8 100644 --- a/arch/frv/kernel/setup.c +++ b/arch/frv/kernel/setup.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * 2 of the License, or (at your option) any later version. | 10 | * 2 of the License, or (at your option) any later version. |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #include <linux/utsrelease.h> | 13 | #include <generated/utsrelease.h> |
| 14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
| 15 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
| 16 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
diff --git a/arch/h8300/include/asm/asm-offsets.h b/arch/h8300/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/h8300/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile index e7cbaa02cd0b..475e2725fbde 100644 --- a/arch/ia64/Makefile +++ b/arch/ia64/Makefile | |||
| @@ -103,4 +103,4 @@ archprepare: make_nr_irqs_h FORCE | |||
| 103 | PHONY += make_nr_irqs_h FORCE | 103 | PHONY += make_nr_irqs_h FORCE |
| 104 | 104 | ||
| 105 | make_nr_irqs_h: FORCE | 105 | make_nr_irqs_h: FORCE |
| 106 | $(Q)$(MAKE) $(build)=arch/ia64/kernel include/asm-ia64/nr-irqs.h | 106 | $(Q)$(MAKE) $(build)=arch/ia64/kernel include/generated/nr-irqs.h |
diff --git a/arch/ia64/include/asm/asm-offsets.h b/arch/ia64/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/ia64/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/ia64/include/asm/irq.h b/arch/ia64/include/asm/irq.h index 5282546cdf82..91b920fd7d53 100644 --- a/arch/ia64/include/asm/irq.h +++ b/arch/ia64/include/asm/irq.h | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
| 15 | #include <linux/cpumask.h> | 15 | #include <linux/cpumask.h> |
| 16 | #include <asm-ia64/nr-irqs.h> | 16 | #include <generated/nr-irqs.h> |
| 17 | 17 | ||
| 18 | static __inline__ int | 18 | static __inline__ int |
| 19 | irq_canonicalize (int irq) | 19 | irq_canonicalize (int irq) |
diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile index 6b7edcab0cb5..2a75e937ae8d 100644 --- a/arch/ia64/kernel/Makefile +++ b/arch/ia64/kernel/Makefile | |||
| @@ -81,17 +81,14 @@ define cmd_nr_irqs | |||
| 81 | endef | 81 | endef |
| 82 | 82 | ||
| 83 | # We use internal kbuild rules to avoid the "is up to date" message from make | 83 | # We use internal kbuild rules to avoid the "is up to date" message from make |
| 84 | arch/$(SRCARCH)/kernel/nr-irqs.s: $(srctree)/arch/$(SRCARCH)/kernel/nr-irqs.c \ | 84 | arch/$(SRCARCH)/kernel/nr-irqs.s: arch/$(SRCARCH)/kernel/nr-irqs.c |
| 85 | $(wildcard $(srctree)/include/asm-ia64/*/irq.h) | ||
| 86 | $(Q)mkdir -p $(dir $@) | 85 | $(Q)mkdir -p $(dir $@) |
| 87 | $(call if_changed_dep,cc_s_c) | 86 | $(call if_changed_dep,cc_s_c) |
| 88 | 87 | ||
| 89 | include/asm-ia64/nr-irqs.h: arch/$(SRCARCH)/kernel/nr-irqs.s | 88 | include/generated/nr-irqs.h: arch/$(SRCARCH)/kernel/nr-irqs.s |
| 90 | $(Q)mkdir -p $(dir $@) | 89 | $(Q)mkdir -p $(dir $@) |
| 91 | $(call cmd,nr_irqs) | 90 | $(call cmd,nr_irqs) |
| 92 | 91 | ||
| 93 | clean-files += $(objtree)/include/asm-ia64/nr-irqs.h | ||
| 94 | |||
| 95 | # | 92 | # |
| 96 | # native ivt.S, entry.S and fsys.S | 93 | # native ivt.S, entry.S and fsys.S |
| 97 | # | 94 | # |
diff --git a/arch/ia64/kvm/asm-offsets.c b/arch/ia64/kvm/asm-offsets.c index 0c3564a7a033..9324c875caf5 100644 --- a/arch/ia64/kvm/asm-offsets.c +++ b/arch/ia64/kvm/asm-offsets.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | * | 22 | * |
| 23 | */ | 23 | */ |
| 24 | 24 | ||
| 25 | #include <linux/autoconf.h> | ||
| 26 | #include <linux/kvm_host.h> | 25 | #include <linux/kvm_host.h> |
| 27 | #include <linux/kbuild.h> | 26 | #include <linux/kbuild.h> |
| 28 | 27 | ||
diff --git a/arch/m68k/include/asm/asm-offsets.h b/arch/m68k/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/m68k/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S index 86edb5fbcfc3..ef54128baa0b 100644 --- a/arch/m68k/kernel/head.S +++ b/arch/m68k/kernel/head.S | |||
| @@ -196,7 +196,7 @@ | |||
| 196 | * for them and trying to understand what they mean. | 196 | * for them and trying to understand what they mean. |
| 197 | * | 197 | * |
| 198 | * CONFIG_xxx: These are the obvious machine configuration defines created | 198 | * CONFIG_xxx: These are the obvious machine configuration defines created |
| 199 | * during configuration. These are defined in include/linux/autoconf.h. | 199 | * during configuration. These are defined in autoconf.h. |
| 200 | * | 200 | * |
| 201 | * CONSOLE: There is support for head.S console in this file. This | 201 | * CONSOLE: There is support for head.S console in this file. This |
| 202 | * console can talk to a Mac frame buffer, but could easily be extrapolated | 202 | * console can talk to a Mac frame buffer, but could easily be extrapolated |
diff --git a/arch/microblaze/include/asm/asm-offsets.h b/arch/microblaze/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/microblaze/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/mips/include/asm/asm-offsets.h b/arch/mips/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/mips/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/mn10300/include/asm/asm-offsets.h b/arch/mn10300/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/mn10300/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/parisc/include/asm/asm-offsets.h b/arch/parisc/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/parisc/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/powerpc/include/asm/asm-offsets.h b/arch/powerpc/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/powerpc/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/powerpc/platforms/52xx/efika.c b/arch/powerpc/platforms/52xx/efika.c index bcc69e1f77c1..45c0cb9b67e6 100644 --- a/arch/powerpc/platforms/52xx/efika.c +++ b/arch/powerpc/platforms/52xx/efika.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/utsrelease.h> | 13 | #include <generated/utsrelease.h> |
| 14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
| 15 | #include <linux/of.h> | 15 | #include <linux/of.h> |
| 16 | #include <asm/prom.h> | 16 | #include <asm/prom.h> |
diff --git a/arch/powerpc/platforms/amigaone/setup.c b/arch/powerpc/platforms/amigaone/setup.c index 9290a7a442d0..fb4eb0df054c 100644 --- a/arch/powerpc/platforms/amigaone/setup.c +++ b/arch/powerpc/platforms/amigaone/setup.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | 14 | ||
| 15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| 16 | #include <linux/seq_file.h> | 16 | #include <linux/seq_file.h> |
| 17 | #include <linux/utsrelease.h> | 17 | #include <generated/utsrelease.h> |
| 18 | 18 | ||
| 19 | #include <asm/machdep.h> | 19 | #include <asm/machdep.h> |
| 20 | #include <asm/cputable.h> | 20 | #include <asm/cputable.h> |
diff --git a/arch/powerpc/platforms/cell/spufs/Makefile b/arch/powerpc/platforms/cell/spufs/Makefile index b93f877ba504..b9d5d678aa44 100644 --- a/arch/powerpc/platforms/cell/spufs/Makefile +++ b/arch/powerpc/platforms/cell/spufs/Makefile | |||
| @@ -13,10 +13,8 @@ SPU_CC := $(SPU_CROSS)gcc | |||
| 13 | SPU_AS := $(SPU_CROSS)gcc | 13 | SPU_AS := $(SPU_CROSS)gcc |
| 14 | SPU_LD := $(SPU_CROSS)ld | 14 | SPU_LD := $(SPU_CROSS)ld |
| 15 | SPU_OBJCOPY := $(SPU_CROSS)objcopy | 15 | SPU_OBJCOPY := $(SPU_CROSS)objcopy |
| 16 | SPU_CFLAGS := -O2 -Wall -I$(srctree)/include \ | 16 | SPU_CFLAGS := -O2 -Wall -I$(srctree)/include -D__KERNEL__ |
| 17 | -I$(objtree)/include2 -D__KERNEL__ | 17 | SPU_AFLAGS := -c -D__ASSEMBLY__ -I$(srctree)/include -D__KERNEL__ |
| 18 | SPU_AFLAGS := -c -D__ASSEMBLY__ -I$(srctree)/include \ | ||
| 19 | -I$(objtree)/include2 -D__KERNEL__ | ||
| 20 | SPU_LDFLAGS := -N -Ttext=0x0 | 18 | SPU_LDFLAGS := -N -Ttext=0x0 |
| 21 | 19 | ||
| 22 | $(obj)/switch.o: $(obj)/spu_save_dump.h $(obj)/spu_restore_dump.h | 20 | $(obj)/switch.o: $(obj)/spu_save_dump.h $(obj)/spu_restore_dump.h |
diff --git a/arch/powerpc/platforms/chrp/setup.c b/arch/powerpc/platforms/chrp/setup.c index 52f3df3b4ca0..8f41685d8f42 100644 --- a/arch/powerpc/platforms/chrp/setup.c +++ b/arch/powerpc/platforms/chrp/setup.c | |||
| @@ -23,7 +23,7 @@ | |||
| 23 | #include <linux/reboot.h> | 23 | #include <linux/reboot.h> |
| 24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
| 25 | #include <linux/pci.h> | 25 | #include <linux/pci.h> |
| 26 | #include <linux/utsrelease.h> | 26 | #include <generated/utsrelease.h> |
| 27 | #include <linux/adb.h> | 27 | #include <linux/adb.h> |
| 28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
| 29 | #include <linux/delay.h> | 29 | #include <linux/delay.h> |
diff --git a/arch/powerpc/platforms/powermac/bootx_init.c b/arch/powerpc/platforms/powermac/bootx_init.c index cf660916ae0b..9dd789a7370d 100644 --- a/arch/powerpc/platforms/powermac/bootx_init.c +++ b/arch/powerpc/platforms/powermac/bootx_init.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
| 13 | #include <linux/string.h> | 13 | #include <linux/string.h> |
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/utsrelease.h> | 15 | #include <generated/utsrelease.h> |
| 16 | #include <asm/sections.h> | 16 | #include <asm/sections.h> |
| 17 | #include <asm/prom.h> | 17 | #include <asm/prom.h> |
| 18 | #include <asm/page.h> | 18 | #include <asm/page.h> |
diff --git a/arch/s390/include/asm/asm-offsets.h b/arch/s390/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/s390/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/score/include/asm/asm-offsets.h b/arch/score/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/score/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/score/include/asm/cacheflush.h b/arch/score/include/asm/cacheflush.h index caaba24036e3..1d545d0ce206 100644 --- a/arch/score/include/asm/cacheflush.h +++ b/arch/score/include/asm/cacheflush.h | |||
| @@ -14,10 +14,12 @@ extern void flush_cache_sigtramp(unsigned long addr); | |||
| 14 | extern void flush_icache_all(void); | 14 | extern void flush_icache_all(void); |
| 15 | extern void flush_icache_range(unsigned long start, unsigned long end); | 15 | extern void flush_icache_range(unsigned long start, unsigned long end); |
| 16 | extern void flush_dcache_range(unsigned long start, unsigned long end); | 16 | extern void flush_dcache_range(unsigned long start, unsigned long end); |
| 17 | extern void flush_dcache_page(struct page *page); | ||
| 18 | |||
| 19 | #define PG_dcache_dirty PG_arch_1 | ||
| 17 | 20 | ||
| 18 | #define flush_cache_dup_mm(mm) do {} while (0) | 21 | #define flush_cache_dup_mm(mm) do {} while (0) |
| 19 | #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0 | 22 | #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0 |
| 20 | #define flush_dcache_page(page) do {} while (0) | ||
| 21 | #define flush_dcache_mmap_lock(mapping) do {} while (0) | 23 | #define flush_dcache_mmap_lock(mapping) do {} while (0) |
| 22 | #define flush_dcache_mmap_unlock(mapping) do {} while (0) | 24 | #define flush_dcache_mmap_unlock(mapping) do {} while (0) |
| 23 | #define flush_cache_vmap(start, end) do {} while (0) | 25 | #define flush_cache_vmap(start, end) do {} while (0) |
diff --git a/arch/score/include/asm/delay.h b/arch/score/include/asm/delay.h index 6726ec199dc0..529e494712a5 100644 --- a/arch/score/include/asm/delay.h +++ b/arch/score/include/asm/delay.h | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #ifndef _ASM_SCORE_DELAY_H | 1 | #ifndef _ASM_SCORE_DELAY_H |
| 2 | #define _ASM_SCORE_DELAY_H | 2 | #define _ASM_SCORE_DELAY_H |
| 3 | 3 | ||
| 4 | #include <asm-generic/param.h> | ||
| 5 | |||
| 4 | static inline void __delay(unsigned long loops) | 6 | static inline void __delay(unsigned long loops) |
| 5 | { | 7 | { |
| 6 | /* 3 cycles per loop. */ | 8 | /* 3 cycles per loop. */ |
diff --git a/arch/score/include/asm/page.h b/arch/score/include/asm/page.h index d92a5a2d36d4..1e9ade8e77e6 100644 --- a/arch/score/include/asm/page.h +++ b/arch/score/include/asm/page.h | |||
| @@ -74,7 +74,7 @@ extern unsigned long max_pfn; | |||
| 74 | #define page_to_bus(page) (page_to_phys(page)) | 74 | #define page_to_bus(page) (page_to_phys(page)) |
| 75 | #define phys_to_page(paddr) (pfn_to_page(phys_to_pfn(paddr))) | 75 | #define phys_to_page(paddr) (pfn_to_page(phys_to_pfn(paddr))) |
| 76 | 76 | ||
| 77 | #define pfn_valid(pfn) ((pfn) >= min_low_pfn && (pfn) < max_mapnr) | 77 | #define pfn_valid(pfn) (((pfn) >= min_low_pfn) && ((pfn) < max_low_pfn)) |
| 78 | 78 | ||
| 79 | #define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) | 79 | #define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) |
| 80 | 80 | ||
diff --git a/arch/score/kernel/setup.c b/arch/score/kernel/setup.c index 6a2503c75c4e..6f898c057878 100644 --- a/arch/score/kernel/setup.c +++ b/arch/score/kernel/setup.c | |||
| @@ -49,6 +49,7 @@ static void __init bootmem_init(void) | |||
| 49 | 49 | ||
| 50 | min_low_pfn = PFN_UP(MEMORY_START); | 50 | min_low_pfn = PFN_UP(MEMORY_START); |
| 51 | max_low_pfn = PFN_UP(MEMORY_START + MEMORY_SIZE); | 51 | max_low_pfn = PFN_UP(MEMORY_START + MEMORY_SIZE); |
| 52 | max_mapnr = max_low_pfn - min_low_pfn; | ||
| 52 | 53 | ||
| 53 | /* Initialize the boot-time allocator with low memory only. */ | 54 | /* Initialize the boot-time allocator with low memory only. */ |
| 54 | bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn, | 55 | bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn, |
diff --git a/arch/score/mm/cache.c b/arch/score/mm/cache.c index dbac9d9dfddd..b25e95743600 100644 --- a/arch/score/mm/cache.c +++ b/arch/score/mm/cache.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <linux/mm.h> | 29 | #include <linux/mm.h> |
| 30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
| 31 | #include <linux/sched.h> | 31 | #include <linux/sched.h> |
| 32 | #include <linux/fs.h> | ||
| 32 | 33 | ||
| 33 | #include <asm/mmu_context.h> | 34 | #include <asm/mmu_context.h> |
| 34 | 35 | ||
| @@ -51,6 +52,27 @@ static void flush_data_cache_page(unsigned long addr) | |||
| 51 | } | 52 | } |
| 52 | } | 53 | } |
| 53 | 54 | ||
| 55 | void flush_dcache_page(struct page *page) | ||
| 56 | { | ||
| 57 | struct address_space *mapping = page_mapping(page); | ||
| 58 | unsigned long addr; | ||
| 59 | |||
| 60 | if (PageHighMem(page)) | ||
| 61 | return; | ||
| 62 | if (mapping && !mapping_mapped(mapping)) { | ||
| 63 | set_bit(PG_dcache_dirty, &(page)->flags); | ||
| 64 | return; | ||
| 65 | } | ||
| 66 | |||
| 67 | /* | ||
| 68 | * We could delay the flush for the !page_mapping case too. But that | ||
| 69 | * case is for exec env/arg pages and those are %99 certainly going to | ||
| 70 | * get faulted into the tlb (and thus flushed) anyways. | ||
| 71 | */ | ||
| 72 | addr = (unsigned long) page_address(page); | ||
| 73 | flush_data_cache_page(addr); | ||
| 74 | } | ||
| 75 | |||
| 54 | /* called by update_mmu_cache. */ | 76 | /* called by update_mmu_cache. */ |
| 55 | void __update_cache(struct vm_area_struct *vma, unsigned long address, | 77 | void __update_cache(struct vm_area_struct *vma, unsigned long address, |
| 56 | pte_t pte) | 78 | pte_t pte) |
| @@ -63,11 +85,11 @@ void __update_cache(struct vm_area_struct *vma, unsigned long address, | |||
| 63 | if (unlikely(!pfn_valid(pfn))) | 85 | if (unlikely(!pfn_valid(pfn))) |
| 64 | return; | 86 | return; |
| 65 | page = pfn_to_page(pfn); | 87 | page = pfn_to_page(pfn); |
| 66 | if (page_mapping(page) && test_bit(PG_arch_1, &page->flags)) { | 88 | if (page_mapping(page) && test_bit(PG_dcache_dirty, &(page)->flags)) { |
| 67 | addr = (unsigned long) page_address(page); | 89 | addr = (unsigned long) page_address(page); |
| 68 | if (exec) | 90 | if (exec) |
| 69 | flush_data_cache_page(addr); | 91 | flush_data_cache_page(addr); |
| 70 | clear_bit(PG_arch_1, &page->flags); | 92 | clear_bit(PG_dcache_dirty, &(page)->flags); |
| 71 | } | 93 | } |
| 72 | } | 94 | } |
| 73 | 95 | ||
diff --git a/arch/score/mm/init.c b/arch/score/mm/init.c index 4e3dcd0c4716..8c15b2c85d5a 100644 --- a/arch/score/mm/init.c +++ b/arch/score/mm/init.c | |||
| @@ -83,7 +83,6 @@ void __init mem_init(void) | |||
| 83 | unsigned long codesize, reservedpages, datasize, initsize; | 83 | unsigned long codesize, reservedpages, datasize, initsize; |
| 84 | unsigned long tmp, ram = 0; | 84 | unsigned long tmp, ram = 0; |
| 85 | 85 | ||
| 86 | max_mapnr = max_low_pfn; | ||
| 87 | high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT); | 86 | high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT); |
| 88 | totalram_pages += free_all_bootmem(); | 87 | totalram_pages += free_all_bootmem(); |
| 89 | totalram_pages -= setup_zero_page(); /* Setup zeroed pages. */ | 88 | totalram_pages -= setup_zero_page(); /* Setup zeroed pages. */ |
| @@ -101,10 +100,6 @@ void __init mem_init(void) | |||
| 101 | datasize = (unsigned long) &_edata - (unsigned long) &_etext; | 100 | datasize = (unsigned long) &_edata - (unsigned long) &_etext; |
| 102 | initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; | 101 | initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; |
| 103 | 102 | ||
| 104 | kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT); | ||
| 105 | kclist_add(&kcore_vmalloc, (void *) VMALLOC_START, | ||
| 106 | VMALLOC_END - VMALLOC_START); | ||
| 107 | |||
| 108 | printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, " | 103 | printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, " |
| 109 | "%ldk reserved, %ldk data, %ldk init, %ldk highmem)\n", | 104 | "%ldk reserved, %ldk data, %ldk init, %ldk highmem)\n", |
| 110 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), | 105 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), |
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index ac17c5ac550e..db91925c79d1 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
| @@ -205,10 +205,7 @@ libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y) | |||
| 205 | 205 | ||
| 206 | BOOT_TARGETS = uImage uImage.bz2 uImage.gz uImage.lzma uImage.srec uImage.bin \ | 206 | BOOT_TARGETS = uImage uImage.bz2 uImage.gz uImage.lzma uImage.srec uImage.bin \ |
| 207 | zImage vmlinux.srec romImage | 207 | zImage vmlinux.srec romImage |
| 208 | PHONY += maketools $(BOOT_TARGETS) FORCE | 208 | PHONY += $(BOOT_TARGETS) |
| 209 | |||
| 210 | maketools: include/linux/version.h FORCE | ||
| 211 | $(Q)$(MAKE) $(build)=arch/sh/tools include/asm-sh/machtypes.h | ||
| 212 | 209 | ||
| 213 | all: $(KBUILD_IMAGE) | 210 | all: $(KBUILD_IMAGE) |
| 214 | 211 | ||
| @@ -217,7 +214,8 @@ $(BOOT_TARGETS): vmlinux | |||
| 217 | 214 | ||
| 218 | compressed: zImage | 215 | compressed: zImage |
| 219 | 216 | ||
| 220 | archprepare: maketools | 217 | archprepare: |
| 218 | $(Q)$(MAKE) $(build)=arch/sh/tools include/generated/machtypes.h | ||
| 221 | 219 | ||
| 222 | archclean: | 220 | archclean: |
| 223 | $(Q)$(MAKE) $(clean)=$(boot) | 221 | $(Q)$(MAKE) $(clean)=$(boot) |
| @@ -234,5 +232,3 @@ define archhelp | |||
| 234 | @echo ' uImage.bz2 - Kernel-only image for U-Boot (bzip2)' | 232 | @echo ' uImage.bz2 - Kernel-only image for U-Boot (bzip2)' |
| 235 | @echo ' uImage.lzma - Kernel-only image for U-Boot (lzma)' | 233 | @echo ' uImage.lzma - Kernel-only image for U-Boot (lzma)' |
| 236 | endef | 234 | endef |
| 237 | |||
| 238 | CLEAN_FILES += include/asm-sh/machtypes.h | ||
diff --git a/arch/sh/drivers/pci/fixups-rts7751r2d.c b/arch/sh/drivers/pci/fixups-rts7751r2d.c index 052b354236dc..7898f14d6641 100644 --- a/arch/sh/drivers/pci/fixups-rts7751r2d.c +++ b/arch/sh/drivers/pci/fixups-rts7751r2d.c | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | #include <mach/lboxre2.h> | 15 | #include <mach/lboxre2.h> |
| 16 | #include <mach/r2d.h> | 16 | #include <mach/r2d.h> |
| 17 | #include "pci-sh4.h" | 17 | #include "pci-sh4.h" |
| 18 | #include <asm/machtypes.h> | 18 | #include <generated/machtypes.h> |
| 19 | 19 | ||
| 20 | #define PCIMCR_MRSET_OFF 0xBFFFFFFF | 20 | #define PCIMCR_MRSET_OFF 0xBFFFFFFF |
| 21 | #define PCIMCR_RFSH_OFF 0xFFFFFFFB | 21 | #define PCIMCR_RFSH_OFF 0xFFFFFFFB |
diff --git a/arch/sh/include/asm/.gitignore b/arch/sh/include/asm/.gitignore deleted file mode 100644 index 378db779fb6c..000000000000 --- a/arch/sh/include/asm/.gitignore +++ /dev/null | |||
| @@ -1 +0,0 @@ | |||
| 1 | machtypes.h | ||
diff --git a/arch/sh/include/asm/asm-offsets.h b/arch/sh/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/sh/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/sh/include/asm/machvec.h b/arch/sh/include/asm/machvec.h index 84dd37761f56..9c30955630ff 100644 --- a/arch/sh/include/asm/machvec.h +++ b/arch/sh/include/asm/machvec.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | #include <linux/types.h> | 13 | #include <linux/types.h> |
| 14 | #include <linux/time.h> | 14 | #include <linux/time.h> |
| 15 | #include <asm/machtypes.h> | 15 | #include <generated/machtypes.h> |
| 16 | 16 | ||
| 17 | struct sh_machine_vector { | 17 | struct sh_machine_vector { |
| 18 | void (*mv_setup)(char **cmdline_p); | 18 | void (*mv_setup)(char **cmdline_p); |
diff --git a/arch/sh/tools/Makefile b/arch/sh/tools/Makefile index 567516b58acc..558a56bcc7cf 100644 --- a/arch/sh/tools/Makefile +++ b/arch/sh/tools/Makefile | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | # Shamelessly cloned from ARM. | 10 | # Shamelessly cloned from ARM. |
| 11 | # | 11 | # |
| 12 | 12 | ||
| 13 | include/asm-sh/machtypes.h: $(src)/gen-mach-types $(src)/mach-types | 13 | include/generated/machtypes.h: $(src)/gen-mach-types $(src)/mach-types |
| 14 | @echo ' Generating $@' | 14 | @echo ' Generating $@' |
| 15 | $(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi | 15 | $(Q)mkdir -p $(dir $@) |
| 16 | $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; } | 16 | $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; } |
diff --git a/arch/sh/tools/gen-mach-types b/arch/sh/tools/gen-mach-types index 65161e368353..f5ff7c5d8913 100644 --- a/arch/sh/tools/gen-mach-types +++ b/arch/sh/tools/gen-mach-types | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | #!/bin/awk | 1 | #!/bin/awk |
| 2 | # | 2 | # |
| 3 | # Awk script to generate include/asm-sh/machtypes.h | 3 | # Awk script to generate include/generated/machtypes.h |
| 4 | # Heavily based on arch/arm/tools/gen-mach-types | 4 | # Heavily based on arch/arm/tools/gen-mach-types |
| 5 | # | 5 | # |
| 6 | BEGIN { nr = 0 } | 6 | BEGIN { nr = 0 } |
diff --git a/arch/sparc/include/asm/asm-offsets.h b/arch/sparc/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/sparc/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/um/Makefile b/arch/um/Makefile index fc633dbacf84..fab8121d2b32 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile | |||
| @@ -149,6 +149,6 @@ $(SHARED_HEADERS)/user_constants.h: $(ARCH_DIR)/sys-$(SUBARCH)/user-offsets.s | |||
| 149 | 149 | ||
| 150 | $(SHARED_HEADERS)/kern_constants.h: | 150 | $(SHARED_HEADERS)/kern_constants.h: |
| 151 | $(Q)mkdir -p $(dir $@) | 151 | $(Q)mkdir -p $(dir $@) |
| 152 | $(Q)echo '#include "../../../../include/asm/asm-offsets.h"' >$@ | 152 | $(Q)echo '#include "../../../../include/generated/asm-offsets.h"' >$@ |
| 153 | 153 | ||
| 154 | export SUBARCH USER_CFLAGS CFLAGS_NO_HARDENING OS HEADER_ARCH DEV_NULL_PATH | 154 | export SUBARCH USER_CFLAGS CFLAGS_NO_HARDENING OS HEADER_ARCH DEV_NULL_PATH |
diff --git a/arch/um/include/asm/asm-offsets.h b/arch/um/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/um/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S index b31cc54b4641..93e689f4bd86 100644 --- a/arch/x86/boot/header.S +++ b/arch/x86/boot/header.S | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | */ | 16 | */ |
| 17 | 17 | ||
| 18 | #include <asm/segment.h> | 18 | #include <asm/segment.h> |
| 19 | #include <linux/utsrelease.h> | 19 | #include <generated/utsrelease.h> |
| 20 | #include <asm/boot.h> | 20 | #include <asm/boot.h> |
| 21 | #include <asm/e820.h> | 21 | #include <asm/e820.h> |
| 22 | #include <asm/page_types.h> | 22 | #include <asm/page_types.h> |
diff --git a/arch/x86/boot/version.c b/arch/x86/boot/version.c index 2723d9b5ce43..2b15aa488ffb 100644 --- a/arch/x86/boot/version.c +++ b/arch/x86/boot/version.c | |||
| @@ -13,8 +13,8 @@ | |||
| 13 | */ | 13 | */ |
| 14 | 14 | ||
| 15 | #include "boot.h" | 15 | #include "boot.h" |
| 16 | #include <linux/utsrelease.h> | 16 | #include <generated/utsrelease.h> |
| 17 | #include <linux/compile.h> | 17 | #include <generated/compile.h> |
| 18 | 18 | ||
| 19 | const char kernel_version[] = | 19 | const char kernel_version[] = |
| 20 | UTS_RELEASE " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ") " | 20 | UTS_RELEASE " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ") " |
diff --git a/arch/x86/include/asm/asm-offsets.h b/arch/x86/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/x86/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 2779321046bd..017d937639fe 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
| @@ -509,14 +509,14 @@ static int genregs_get(struct task_struct *target, | |||
| 509 | { | 509 | { |
| 510 | if (kbuf) { | 510 | if (kbuf) { |
| 511 | unsigned long *k = kbuf; | 511 | unsigned long *k = kbuf; |
| 512 | while (count > 0) { | 512 | while (count >= sizeof(*k)) { |
| 513 | *k++ = getreg(target, pos); | 513 | *k++ = getreg(target, pos); |
| 514 | count -= sizeof(*k); | 514 | count -= sizeof(*k); |
| 515 | pos += sizeof(*k); | 515 | pos += sizeof(*k); |
| 516 | } | 516 | } |
| 517 | } else { | 517 | } else { |
| 518 | unsigned long __user *u = ubuf; | 518 | unsigned long __user *u = ubuf; |
| 519 | while (count > 0) { | 519 | while (count >= sizeof(*u)) { |
| 520 | if (__put_user(getreg(target, pos), u++)) | 520 | if (__put_user(getreg(target, pos), u++)) |
| 521 | return -EFAULT; | 521 | return -EFAULT; |
| 522 | count -= sizeof(*u); | 522 | count -= sizeof(*u); |
| @@ -535,14 +535,14 @@ static int genregs_set(struct task_struct *target, | |||
| 535 | int ret = 0; | 535 | int ret = 0; |
| 536 | if (kbuf) { | 536 | if (kbuf) { |
| 537 | const unsigned long *k = kbuf; | 537 | const unsigned long *k = kbuf; |
| 538 | while (count > 0 && !ret) { | 538 | while (count >= sizeof(*k) && !ret) { |
| 539 | ret = putreg(target, pos, *k++); | 539 | ret = putreg(target, pos, *k++); |
| 540 | count -= sizeof(*k); | 540 | count -= sizeof(*k); |
| 541 | pos += sizeof(*k); | 541 | pos += sizeof(*k); |
| 542 | } | 542 | } |
| 543 | } else { | 543 | } else { |
| 544 | const unsigned long __user *u = ubuf; | 544 | const unsigned long __user *u = ubuf; |
| 545 | while (count > 0 && !ret) { | 545 | while (count >= sizeof(*u) && !ret) { |
| 546 | unsigned long word; | 546 | unsigned long word; |
| 547 | ret = __get_user(word, u++); | 547 | ret = __get_user(word, u++); |
| 548 | if (ret) | 548 | if (ret) |
| @@ -1458,14 +1458,14 @@ static int genregs32_get(struct task_struct *target, | |||
| 1458 | { | 1458 | { |
| 1459 | if (kbuf) { | 1459 | if (kbuf) { |
| 1460 | compat_ulong_t *k = kbuf; | 1460 | compat_ulong_t *k = kbuf; |
| 1461 | while (count > 0) { | 1461 | while (count >= sizeof(*k)) { |
| 1462 | getreg32(target, pos, k++); | 1462 | getreg32(target, pos, k++); |
| 1463 | count -= sizeof(*k); | 1463 | count -= sizeof(*k); |
| 1464 | pos += sizeof(*k); | 1464 | pos += sizeof(*k); |
| 1465 | } | 1465 | } |
| 1466 | } else { | 1466 | } else { |
| 1467 | compat_ulong_t __user *u = ubuf; | 1467 | compat_ulong_t __user *u = ubuf; |
| 1468 | while (count > 0) { | 1468 | while (count >= sizeof(*u)) { |
| 1469 | compat_ulong_t word; | 1469 | compat_ulong_t word; |
| 1470 | getreg32(target, pos, &word); | 1470 | getreg32(target, pos, &word); |
| 1471 | if (__put_user(word, u++)) | 1471 | if (__put_user(word, u++)) |
| @@ -1486,14 +1486,14 @@ static int genregs32_set(struct task_struct *target, | |||
| 1486 | int ret = 0; | 1486 | int ret = 0; |
| 1487 | if (kbuf) { | 1487 | if (kbuf) { |
| 1488 | const compat_ulong_t *k = kbuf; | 1488 | const compat_ulong_t *k = kbuf; |
| 1489 | while (count > 0 && !ret) { | 1489 | while (count >= sizeof(*k) && !ret) { |
| 1490 | ret = putreg32(target, pos, *k++); | 1490 | ret = putreg32(target, pos, *k++); |
| 1491 | count -= sizeof(*k); | 1491 | count -= sizeof(*k); |
| 1492 | pos += sizeof(*k); | 1492 | pos += sizeof(*k); |
| 1493 | } | 1493 | } |
| 1494 | } else { | 1494 | } else { |
| 1495 | const compat_ulong_t __user *u = ubuf; | 1495 | const compat_ulong_t __user *u = ubuf; |
| 1496 | while (count > 0 && !ret) { | 1496 | while (count >= sizeof(*u) && !ret) { |
| 1497 | compat_ulong_t word; | 1497 | compat_ulong_t word; |
| 1498 | ret = __get_user(word, u++); | 1498 | ret = __get_user(word, u++); |
| 1499 | if (ret) | 1499 | if (ret) |
diff --git a/arch/xtensa/include/asm/asm-offsets.h b/arch/xtensa/include/asm/asm-offsets.h new file mode 100644 index 000000000000..d370ee36a182 --- /dev/null +++ b/arch/xtensa/include/asm/asm-offsets.h | |||
| @@ -0,0 +1 @@ | |||
| #include <generated/asm-offsets.h> | |||
diff --git a/drivers/accessibility/braille/braille_console.c b/drivers/accessibility/braille/braille_console.c index d672cfe7ca59..cb423f5aef24 100644 --- a/drivers/accessibility/braille/braille_console.c +++ b/drivers/accessibility/braille/braille_console.c | |||
| @@ -21,7 +21,6 @@ | |||
| 21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| 22 | */ | 22 | */ |
| 23 | 23 | ||
| 24 | #include <linux/autoconf.h> | ||
| 25 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
| 26 | #include <linux/module.h> | 25 | #include <linux/module.h> |
| 27 | #include <linux/moduleparam.h> | 26 | #include <linux/moduleparam.h> |
diff --git a/drivers/hid/hid-lg.h b/drivers/hid/hid-lg.h index 27ae750ca878..bf31592eaf79 100644 --- a/drivers/hid/hid-lg.h +++ b/drivers/hid/hid-lg.h | |||
| @@ -1,8 +1,6 @@ | |||
| 1 | #ifndef __HID_LG_H | 1 | #ifndef __HID_LG_H |
| 2 | #define __HID_LG_H | 2 | #define __HID_LG_H |
| 3 | 3 | ||
| 4 | #include <linux/autoconf.h> | ||
| 5 | |||
| 6 | #ifdef CONFIG_LOGITECH_FF | 4 | #ifdef CONFIG_LOGITECH_FF |
| 7 | int lgff_init(struct hid_device *hdev); | 5 | int lgff_init(struct hid_device *hdev); |
| 8 | #else | 6 | #else |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index 675b7df632fc..27ca859e7453 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
| @@ -63,7 +63,7 @@ | |||
| 63 | #ifndef __iwl_core_h__ | 63 | #ifndef __iwl_core_h__ |
| 64 | #define __iwl_core_h__ | 64 | #define __iwl_core_h__ |
| 65 | 65 | ||
| 66 | #include <linux/utsrelease.h> | 66 | #include <generated/utsrelease.h> |
| 67 | 67 | ||
| 68 | /************************ | 68 | /************************ |
| 69 | * forward declarations * | 69 | * forward declarations * |
diff --git a/drivers/platform/x86/compal-laptop.c b/drivers/platform/x86/compal-laptop.c index 11003bba10d3..1a387e79f719 100644 --- a/drivers/platform/x86/compal-laptop.c +++ b/drivers/platform/x86/compal-laptop.c | |||
| @@ -51,7 +51,6 @@ | |||
| 51 | #include <linux/dmi.h> | 51 | #include <linux/dmi.h> |
| 52 | #include <linux/backlight.h> | 52 | #include <linux/backlight.h> |
| 53 | #include <linux/platform_device.h> | 53 | #include <linux/platform_device.h> |
| 54 | #include <linux/autoconf.h> | ||
| 55 | 54 | ||
| 56 | #define COMPAL_DRIVER_VERSION "0.2.6" | 55 | #define COMPAL_DRIVER_VERSION "0.2.6" |
| 57 | 56 | ||
diff --git a/drivers/regulator/88pm8607.c b/drivers/regulator/88pm8607.c new file mode 100644 index 000000000000..04719551381b --- /dev/null +++ b/drivers/regulator/88pm8607.c | |||
| @@ -0,0 +1,685 @@ | |||
| 1 | /* | ||
| 2 | * Regulators driver for Marvell 88PM8607 | ||
| 3 | * | ||
| 4 | * Copyright (C) 2009 Marvell International Ltd. | ||
| 5 | * Haojian Zhuang <haojian.zhuang@marvell.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/init.h> | ||
| 13 | #include <linux/err.h> | ||
| 14 | #include <linux/platform_device.h> | ||
| 15 | #include <linux/regulator/driver.h> | ||
| 16 | #include <linux/regulator/machine.h> | ||
| 17 | #include <linux/mfd/88pm8607.h> | ||
| 18 | |||
| 19 | struct pm8607_regulator_info { | ||
| 20 | struct regulator_desc desc; | ||
| 21 | struct pm8607_chip *chip; | ||
| 22 | struct regulator_dev *regulator; | ||
| 23 | |||
| 24 | int min_uV; | ||
| 25 | int max_uV; | ||
| 26 | int step_uV; | ||
| 27 | int vol_reg; | ||
| 28 | int vol_shift; | ||
| 29 | int vol_nbits; | ||
| 30 | int update_reg; | ||
| 31 | int update_bit; | ||
| 32 | int enable_reg; | ||
| 33 | int enable_bit; | ||
| 34 | int slope_double; | ||
| 35 | }; | ||
| 36 | |||
| 37 | static inline int check_range(struct pm8607_regulator_info *info, | ||
| 38 | int min_uV, int max_uV) | ||
| 39 | { | ||
| 40 | if (max_uV < info->min_uV || min_uV > info->max_uV || min_uV > max_uV) | ||
| 41 | return -EINVAL; | ||
| 42 | |||
| 43 | return 0; | ||
| 44 | } | ||
| 45 | |||
| 46 | static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index) | ||
| 47 | { | ||
| 48 | struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); | ||
| 49 | uint8_t chip_id = info->chip->chip_id; | ||
| 50 | int ret = -EINVAL; | ||
| 51 | |||
| 52 | switch (info->desc.id) { | ||
| 53 | case PM8607_ID_BUCK1: | ||
| 54 | ret = (index < 0x1d) ? (index * 25000 + 800000) : | ||
| 55 | ((index < 0x20) ? 1500000 : | ||
| 56 | ((index < 0x40) ? ((index - 0x20) * 25000) : | ||
| 57 | -EINVAL)); | ||
| 58 | break; | ||
| 59 | case PM8607_ID_BUCK3: | ||
| 60 | ret = (index < 0x3d) ? (index * 25000) : | ||
| 61 | ((index < 0x40) ? 1500000 : -EINVAL); | ||
| 62 | if (ret < 0) | ||
| 63 | break; | ||
| 64 | if (info->slope_double) | ||
| 65 | ret <<= 1; | ||
| 66 | break; | ||
| 67 | case PM8607_ID_LDO1: | ||
| 68 | ret = (index == 0) ? 1800000 : | ||
| 69 | ((index == 1) ? 1200000 : | ||
| 70 | ((index == 2) ? 2800000 : -EINVAL)); | ||
| 71 | break; | ||
| 72 | case PM8607_ID_LDO5: | ||
| 73 | ret = (index == 0) ? 2900000 : | ||
| 74 | ((index == 1) ? 3000000 : | ||
| 75 | ((index == 2) ? 3100000 : 3300000)); | ||
| 76 | break; | ||
| 77 | case PM8607_ID_LDO7: | ||
| 78 | case PM8607_ID_LDO8: | ||
| 79 | ret = (index < 3) ? (index * 50000 + 1800000) : | ||
| 80 | ((index < 8) ? (index * 50000 + 2550000) : | ||
| 81 | -EINVAL); | ||
| 82 | break; | ||
| 83 | case PM8607_ID_LDO12: | ||
| 84 | ret = (index < 2) ? (index * 100000 + 1800000) : | ||
| 85 | ((index < 7) ? (index * 100000 + 2500000) : | ||
| 86 | ((index == 7) ? 3300000 : 1200000)); | ||
| 87 | break; | ||
| 88 | case PM8607_ID_LDO2: | ||
| 89 | case PM8607_ID_LDO3: | ||
| 90 | case PM8607_ID_LDO9: | ||
| 91 | switch (chip_id) { | ||
| 92 | case PM8607_CHIP_A0: | ||
| 93 | case PM8607_CHIP_A1: | ||
| 94 | ret = (index < 3) ? (index * 50000 + 1800000) : | ||
| 95 | ((index < 8) ? (index * 50000 + 2550000) : | ||
| 96 | -EINVAL); | ||
| 97 | break; | ||
| 98 | case PM8607_CHIP_B0: | ||
| 99 | ret = (index < 3) ? (index * 50000 + 1800000) : | ||
| 100 | ((index < 7) ? (index * 50000 + 2550000) : | ||
| 101 | 3300000); | ||
| 102 | break; | ||
| 103 | } | ||
| 104 | break; | ||
| 105 | case PM8607_ID_LDO4: | ||
| 106 | switch (chip_id) { | ||
| 107 | case PM8607_CHIP_A0: | ||
| 108 | case PM8607_CHIP_A1: | ||
| 109 | ret = (index < 3) ? (index * 50000 + 1800000) : | ||
| 110 | ((index < 8) ? (index * 50000 + 2550000) : | ||
| 111 | -EINVAL); | ||
| 112 | break; | ||
| 113 | case PM8607_CHIP_B0: | ||
| 114 | ret = (index < 3) ? (index * 50000 + 1800000) : | ||
| 115 | ((index < 6) ? (index * 50000 + 2550000) : | ||
| 116 | ((index == 6) ? 2900000 : 3300000)); | ||
| 117 | break; | ||
| 118 | } | ||
| 119 | break; | ||
| 120 | case PM8607_ID_LDO6: | ||
| 121 | switch (chip_id) { | ||
| 122 | case PM8607_CHIP_A0: | ||
| 123 | case PM8607_CHIP_A1: | ||
| 124 | ret = (index < 3) ? (index * 50000 + 1800000) : | ||
| 125 | ((index < 8) ? (index * 50000 + 2450000) : | ||
| 126 | -EINVAL); | ||
| 127 | break; | ||
| 128 | case PM8607_CHIP_B0: | ||
| 129 | ret = (index < 2) ? (index * 50000 + 1800000) : | ||
| 130 | ((index < 7) ? (index * 50000 + 2500000) : | ||
| 131 | 3300000); | ||
| 132 | break; | ||
| 133 | } | ||
| 134 | break; | ||
| 135 | case PM8607_ID_LDO10: | ||
| 136 | switch (chip_id) { | ||
| 137 | case PM8607_CHIP_A0: | ||
| 138 | case PM8607_CHIP_A1: | ||
| 139 | ret = (index < 3) ? (index * 50000 + 1800000) : | ||
| 140 | ((index < 8) ? (index * 50000 + 2550000) : | ||
| 141 | 1200000); | ||
| 142 | break; | ||
| 143 | case PM8607_CHIP_B0: | ||
| 144 | ret = (index < 3) ? (index * 50000 + 1800000) : | ||
| 145 | ((index < 7) ? (index * 50000 + 2550000) : | ||
| 146 | ((index == 7) ? 3300000 : 1200000)); | ||
| 147 | break; | ||
| 148 | } | ||
| 149 | break; | ||
| 150 | case PM8607_ID_LDO14: | ||
| 151 | switch (chip_id) { | ||
| 152 | case PM8607_CHIP_A0: | ||
| 153 | case PM8607_CHIP_A1: | ||
| 154 | ret = (index < 3) ? (index * 50000 + 1800000) : | ||
| 155 | ((index < 8) ? (index * 50000 + 2550000) : | ||
| 156 | -EINVAL); | ||
| 157 | break; | ||
| 158 | case PM8607_CHIP_B0: | ||
| 159 | ret = (index < 2) ? (index * 50000 + 1800000) : | ||
| 160 | ((index < 7) ? (index * 50000 + 2600000) : | ||
| 161 | 3300000); | ||
| 162 | break; | ||
| 163 | } | ||
| 164 | break; | ||
| 165 | } | ||
| 166 | return ret; | ||
| 167 | } | ||
| 168 | |||
| 169 | static int choose_voltage(struct regulator_dev *rdev, int min_uV, int max_uV) | ||
| 170 | { | ||
| 171 | struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); | ||
| 172 | uint8_t chip_id = info->chip->chip_id; | ||
| 173 | int val = -ENOENT; | ||
| 174 | int ret; | ||
| 175 | |||
| 176 | switch (info->desc.id) { | ||
| 177 | case PM8607_ID_BUCK1: | ||
| 178 | if (min_uV >= 800000) /* 800mV ~ 1500mV / 25mV */ | ||
| 179 | val = (min_uV - 775001) / 25000; | ||
| 180 | else { /* 25mV ~ 775mV / 25mV */ | ||
| 181 | val = (min_uV + 249999) / 25000; | ||
| 182 | val += 32; | ||
| 183 | } | ||
| 184 | break; | ||
| 185 | case PM8607_ID_BUCK3: | ||
| 186 | if (info->slope_double) | ||
| 187 | min_uV = min_uV >> 1; | ||
| 188 | val = (min_uV + 249999) / 25000; /* 0mV ~ 1500mV / 25mV */ | ||
| 189 | |||
| 190 | break; | ||
| 191 | case PM8607_ID_LDO1: | ||
| 192 | if (min_uV > 1800000) | ||
| 193 | val = 2; | ||
| 194 | else if (min_uV > 1200000) | ||
| 195 | val = 0; | ||
| 196 | else | ||
| 197 | val = 1; | ||
| 198 | break; | ||
| 199 | case PM8607_ID_LDO5: | ||
| 200 | if (min_uV > 3100000) | ||
| 201 | val = 3; | ||
| 202 | else /* 2900mV ~ 3100mV / 100mV */ | ||
| 203 | val = (min_uV - 2800001) / 100000; | ||
| 204 | break; | ||
| 205 | case PM8607_ID_LDO7: | ||
| 206 | case PM8607_ID_LDO8: | ||
| 207 | if (min_uV < 2700000) { /* 1800mV ~ 1900mV / 50mV */ | ||
| 208 | if (min_uV <= 1800000) | ||
| 209 | val = 0; /* 1800mv */ | ||
| 210 | else if (min_uV <= 1900000) | ||
| 211 | val = (min_uV - 1750001) / 50000; | ||
| 212 | else | ||
| 213 | val = 3; /* 2700mV */ | ||
| 214 | } else { /* 2700mV ~ 2900mV / 50mV */ | ||
| 215 | if (min_uV <= 2900000) { | ||
| 216 | val = (min_uV - 2650001) / 50000; | ||
| 217 | val += 3; | ||
| 218 | } else | ||
| 219 | val = -EINVAL; | ||
| 220 | } | ||
| 221 | break; | ||
| 222 | case PM8607_ID_LDO10: | ||
| 223 | if (min_uV > 2850000) | ||
| 224 | val = 7; | ||
| 225 | else if (min_uV <= 1200000) | ||
| 226 | val = 8; | ||
| 227 | else if (min_uV < 2700000) /* 1800mV ~ 1900mV / 50mV */ | ||
| 228 | val = (min_uV - 1750001) / 50000; | ||
| 229 | else { /* 2700mV ~ 2850mV / 50mV */ | ||
| 230 | val = (min_uV - 2650001) / 50000; | ||
| 231 | val += 3; | ||
| 232 | } | ||
| 233 | break; | ||
| 234 | case PM8607_ID_LDO12: | ||
| 235 | if (min_uV < 2700000) { /* 1800mV ~ 1900mV / 100mV */ | ||
| 236 | if (min_uV <= 1200000) | ||
| 237 | val = 8; /* 1200mV */ | ||
| 238 | else if (min_uV <= 1800000) | ||
| 239 | val = 0; /* 1800mV */ | ||
| 240 | else if (min_uV <= 1900000) | ||
| 241 | val = (min_uV - 1700001) / 100000; | ||
| 242 | else | ||
| 243 | val = 2; /* 2700mV */ | ||
| 244 | } else { /* 2700mV ~ 3100mV / 100mV */ | ||
| 245 | if (min_uV <= 3100000) { | ||
| 246 | val = (min_uV - 2600001) / 100000; | ||
| 247 | val += 2; | ||
| 248 | } else if (min_uV <= 3300000) | ||
| 249 | val = 7; | ||
| 250 | else | ||
| 251 | val = -EINVAL; | ||
| 252 | } | ||
| 253 | break; | ||
| 254 | case PM8607_ID_LDO2: | ||
| 255 | case PM8607_ID_LDO3: | ||
| 256 | case PM8607_ID_LDO9: | ||
| 257 | switch (chip_id) { | ||
| 258 | case PM8607_CHIP_A0: | ||
| 259 | case PM8607_CHIP_A1: | ||
| 260 | if (min_uV < 2700000) /* 1800mV ~ 1900mV / 50mV */ | ||
| 261 | if (min_uV <= 1800000) | ||
| 262 | val = 0; | ||
| 263 | else if (min_uV <= 1900000) | ||
| 264 | val = (min_uV - 1750001) / 50000; | ||
| 265 | else | ||
| 266 | val = 3; /* 2700mV */ | ||
| 267 | else { /* 2700mV ~ 2900mV / 50mV */ | ||
| 268 | if (min_uV <= 2900000) { | ||
| 269 | val = (min_uV - 2650001) / 50000; | ||
| 270 | val += 3; | ||
| 271 | } else | ||
| 272 | val = -EINVAL; | ||
| 273 | } | ||
| 274 | break; | ||
| 275 | case PM8607_CHIP_B0: | ||
| 276 | if (min_uV < 2700000) { /* 1800mV ~ 1900mV / 50mV */ | ||
| 277 | if (min_uV <= 1800000) | ||
| 278 | val = 0; | ||
| 279 | else if (min_uV <= 1900000) | ||
| 280 | val = (min_uV - 1750001) / 50000; | ||
| 281 | else | ||
| 282 | val = 3; /* 2700mV */ | ||
| 283 | } else { /* 2700mV ~ 2850mV / 50mV */ | ||
| 284 | if (min_uV <= 2850000) { | ||
| 285 | val = (min_uV - 2650001) / 50000; | ||
| 286 | val += 3; | ||
| 287 | } else if (min_uV <= 3300000) | ||
| 288 | val = 7; | ||
| 289 | else | ||
| 290 | val = -EINVAL; | ||
| 291 | } | ||
| 292 | break; | ||
| 293 | } | ||
| 294 | break; | ||
| 295 | case PM8607_ID_LDO4: | ||
| 296 | switch (chip_id) { | ||
| 297 | case PM8607_CHIP_A0: | ||
| 298 | case PM8607_CHIP_A1: | ||
| 299 | if (min_uV < 2700000) /* 1800mV ~ 1900mV / 50mV */ | ||
| 300 | if (min_uV <= 1800000) | ||
| 301 | val = 0; | ||
| 302 | else if (min_uV <= 1900000) | ||
| 303 | val = (min_uV - 1750001) / 50000; | ||
| 304 | else | ||
| 305 | val = 3; /* 2700mV */ | ||
| 306 | else { /* 2700mV ~ 2900mV / 50mV */ | ||
| 307 | if (min_uV <= 2900000) { | ||
| 308 | val = (min_uV - 2650001) / 50000; | ||
| 309 | val += 3; | ||
| 310 | } else | ||
| 311 | val = -EINVAL; | ||
| 312 | } | ||
| 313 | break; | ||
| 314 | case PM8607_CHIP_B0: | ||
| 315 | if (min_uV < 2700000) { /* 1800mV ~ 1900mV / 50mV */ | ||
| 316 | if (min_uV <= 1800000) | ||
| 317 | val = 0; | ||
| 318 | else if (min_uV <= 1900000) | ||
| 319 | val = (min_uV - 1750001) / 50000; | ||
| 320 | else | ||
| 321 | val = 3; /* 2700mV */ | ||
| 322 | } else { /* 2700mV ~ 2800mV / 50mV */ | ||
| 323 | if (min_uV <= 2850000) { | ||
| 324 | val = (min_uV - 2650001) / 50000; | ||
| 325 | val += 3; | ||
| 326 | } else if (min_uV <= 2900000) | ||
| 327 | val = 6; | ||
| 328 | else if (min_uV <= 3300000) | ||
| 329 | val = 7; | ||
| 330 | else | ||
| 331 | val = -EINVAL; | ||
| 332 | } | ||
| 333 | break; | ||
| 334 | } | ||
| 335 | break; | ||
| 336 | case PM8607_ID_LDO6: | ||
| 337 | switch (chip_id) { | ||
| 338 | case PM8607_CHIP_A0: | ||
| 339 | case PM8607_CHIP_A1: | ||
| 340 | if (min_uV < 2600000) { /* 1800mV ~ 1900mV / 50mV */ | ||
| 341 | if (min_uV <= 1800000) | ||
| 342 | val = 0; | ||
| 343 | else if (min_uV <= 1900000) | ||
| 344 | val = (min_uV - 1750001) / 50000; | ||
| 345 | else | ||
| 346 | val = 3; /* 2600mV */ | ||
| 347 | } else { /* 2600mV ~ 2800mV / 50mV */ | ||
| 348 | if (min_uV <= 2800000) { | ||
| 349 | val = (min_uV - 2550001) / 50000; | ||
| 350 | val += 3; | ||
| 351 | } else | ||
| 352 | val = -EINVAL; | ||
| 353 | } | ||
| 354 | break; | ||
| 355 | case PM8607_CHIP_B0: | ||
| 356 | if (min_uV < 2600000) { /* 1800mV ~ 1850mV / 50mV */ | ||
| 357 | if (min_uV <= 1800000) | ||
| 358 | val = 0; | ||
| 359 | else if (min_uV <= 1850000) | ||
| 360 | val = (min_uV - 1750001) / 50000; | ||
| 361 | else | ||
| 362 | val = 2; /* 2600mV */ | ||
| 363 | } else { /* 2600mV ~ 2800mV / 50mV */ | ||
| 364 | if (min_uV <= 2800000) { | ||
| 365 | val = (min_uV - 2550001) / 50000; | ||
| 366 | val += 2; | ||
| 367 | } else if (min_uV <= 3300000) | ||
| 368 | val = 7; | ||
| 369 | else | ||
| 370 | val = -EINVAL; | ||
| 371 | } | ||
| 372 | break; | ||
| 373 | } | ||
| 374 | break; | ||
| 375 | case PM8607_ID_LDO14: | ||
| 376 | switch (chip_id) { | ||
| 377 | case PM8607_CHIP_A0: | ||
| 378 | case PM8607_CHIP_A1: | ||
| 379 | if (min_uV < 2700000) { /* 1800mV ~ 1900mV / 50mV */ | ||
| 380 | if (min_uV <= 1800000) | ||
| 381 | val = 0; | ||
| 382 | else if (min_uV <= 1900000) | ||
| 383 | val = (min_uV - 1750001) / 50000; | ||
| 384 | else | ||
| 385 | val = 3; /* 2700mV */ | ||
| 386 | } else { /* 2700mV ~ 2900mV / 50mV */ | ||
| 387 | if (min_uV <= 2900000) { | ||
| 388 | val = (min_uV - 2650001) / 50000; | ||
| 389 | val += 3; | ||
| 390 | } else | ||
| 391 | val = -EINVAL; | ||
| 392 | } | ||
| 393 | break; | ||
| 394 | case PM8607_CHIP_B0: | ||
| 395 | if (min_uV < 2700000) { /* 1800mV ~ 1850mV / 50mV */ | ||
| 396 | if (min_uV <= 1800000) | ||
| 397 | val = 0; | ||
| 398 | else if (min_uV <= 1850000) | ||
| 399 | val = (min_uV - 1750001) / 50000; | ||
| 400 | else | ||
| 401 | val = 2; /* 2700mV */ | ||
| 402 | } else { /* 2700mV ~ 2900mV / 50mV */ | ||
| 403 | if (min_uV <= 2900000) { | ||
| 404 | val = (min_uV - 2650001) / 50000; | ||
| 405 | val += 2; | ||
| 406 | } else if (min_uV <= 3300000) | ||
| 407 | val = 7; | ||
| 408 | else | ||
| 409 | val = -EINVAL; | ||
| 410 | } | ||
| 411 | break; | ||
| 412 | } | ||
| 413 | break; | ||
| 414 | } | ||
| 415 | if (val >= 0) { | ||
| 416 | ret = pm8607_list_voltage(rdev, val); | ||
| 417 | if (ret > max_uV) { | ||
| 418 | pr_err("exceed voltage range (%d %d) uV", | ||
| 419 | min_uV, max_uV); | ||
| 420 | return -EINVAL; | ||
| 421 | } | ||
| 422 | } else | ||
| 423 | pr_err("invalid voltage range (%d %d) uV", min_uV, max_uV); | ||
| 424 | return val; | ||
| 425 | } | ||
| 426 | |||
| 427 | static int pm8607_set_voltage(struct regulator_dev *rdev, | ||
| 428 | int min_uV, int max_uV) | ||
| 429 | { | ||
| 430 | struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); | ||
| 431 | struct pm8607_chip *chip = info->chip; | ||
| 432 | uint8_t val, mask; | ||
| 433 | int ret; | ||
| 434 | |||
| 435 | if (check_range(info, min_uV, max_uV)) { | ||
| 436 | pr_err("invalid voltage range (%d, %d) uV\n", min_uV, max_uV); | ||
| 437 | return -EINVAL; | ||
| 438 | } | ||
| 439 | |||
| 440 | ret = choose_voltage(rdev, min_uV, max_uV); | ||
| 441 | if (ret < 0) | ||
| 442 | return -EINVAL; | ||
| 443 | val = (uint8_t)(ret << info->vol_shift); | ||
| 444 | mask = ((1 << info->vol_nbits) - 1) << info->vol_shift; | ||
| 445 | |||
| 446 | ret = pm8607_set_bits(chip, info->vol_reg, mask, val); | ||
| 447 | if (ret) | ||
| 448 | return ret; | ||
| 449 | switch (info->desc.id) { | ||
| 450 | case PM8607_ID_BUCK1: | ||
| 451 | case PM8607_ID_BUCK3: | ||
| 452 | ret = pm8607_set_bits(chip, info->update_reg, | ||
| 453 | 1 << info->update_bit, | ||
| 454 | 1 << info->update_bit); | ||
| 455 | break; | ||
| 456 | } | ||
| 457 | return ret; | ||
| 458 | } | ||
| 459 | |||
| 460 | static int pm8607_get_voltage(struct regulator_dev *rdev) | ||
| 461 | { | ||
| 462 | struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); | ||
| 463 | struct pm8607_chip *chip = info->chip; | ||
| 464 | uint8_t val, mask; | ||
| 465 | int ret; | ||
| 466 | |||
| 467 | ret = pm8607_reg_read(chip, info->vol_reg); | ||
| 468 | if (ret < 0) | ||
| 469 | return ret; | ||
| 470 | |||
| 471 | mask = ((1 << info->vol_nbits) - 1) << info->vol_shift; | ||
| 472 | val = ((unsigned char)ret & mask) >> info->vol_shift; | ||
| 473 | |||
| 474 | return pm8607_list_voltage(rdev, val); | ||
| 475 | } | ||
| 476 | |||
| 477 | static int pm8607_enable(struct regulator_dev *rdev) | ||
| 478 | { | ||
| 479 | struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); | ||
| 480 | struct pm8607_chip *chip = info->chip; | ||
| 481 | |||
| 482 | return pm8607_set_bits(chip, info->enable_reg, | ||
| 483 | 1 << info->enable_bit, | ||
| 484 | 1 << info->enable_bit); | ||
| 485 | } | ||
| 486 | |||
| 487 | static int pm8607_disable(struct regulator_dev *rdev) | ||
| 488 | { | ||
| 489 | struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); | ||
| 490 | struct pm8607_chip *chip = info->chip; | ||
| 491 | |||
| 492 | return pm8607_set_bits(chip, info->enable_reg, | ||
| 493 | 1 << info->enable_bit, 0); | ||
| 494 | } | ||
| 495 | |||
| 496 | static int pm8607_is_enabled(struct regulator_dev *rdev) | ||
| 497 | { | ||
| 498 | struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); | ||
| 499 | struct pm8607_chip *chip = info->chip; | ||
| 500 | int ret; | ||
| 501 | |||
| 502 | ret = pm8607_reg_read(chip, info->enable_reg); | ||
| 503 | if (ret < 0) | ||
| 504 | return ret; | ||
| 505 | |||
| 506 | return !!((unsigned char)ret & (1 << info->enable_bit)); | ||
| 507 | } | ||
| 508 | |||
| 509 | static struct regulator_ops pm8607_regulator_ops = { | ||
| 510 | .set_voltage = pm8607_set_voltage, | ||
| 511 | .get_voltage = pm8607_get_voltage, | ||
| 512 | .enable = pm8607_enable, | ||
| 513 | .disable = pm8607_disable, | ||
| 514 | .is_enabled = pm8607_is_enabled, | ||
| 515 | }; | ||
| 516 | |||
| 517 | #define PM8607_DVC(_id, min, max, step, vreg, nbits, ureg, ubit, ereg, ebit) \ | ||
| 518 | { \ | ||
| 519 | .desc = { \ | ||
| 520 | .name = "BUCK" #_id, \ | ||
| 521 | .ops = &pm8607_regulator_ops, \ | ||
| 522 | .type = REGULATOR_VOLTAGE, \ | ||
| 523 | .id = PM8607_ID_BUCK##_id, \ | ||
| 524 | .owner = THIS_MODULE, \ | ||
| 525 | }, \ | ||
| 526 | .min_uV = (min) * 1000, \ | ||
| 527 | .max_uV = (max) * 1000, \ | ||
| 528 | .step_uV = (step) * 1000, \ | ||
| 529 | .vol_reg = PM8607_##vreg, \ | ||
| 530 | .vol_shift = (0), \ | ||
| 531 | .vol_nbits = (nbits), \ | ||
| 532 | .update_reg = PM8607_##ureg, \ | ||
| 533 | .update_bit = (ubit), \ | ||
| 534 | .enable_reg = PM8607_##ereg, \ | ||
| 535 | .enable_bit = (ebit), \ | ||
| 536 | .slope_double = (0), \ | ||
| 537 | } | ||
| 538 | |||
| 539 | #define PM8607_LDO(_id, min, max, step, vreg, shift, nbits, ereg, ebit) \ | ||
| 540 | { \ | ||
| 541 | .desc = { \ | ||
| 542 | .name = "LDO" #_id, \ | ||
| 543 | .ops = &pm8607_regulator_ops, \ | ||
| 544 | .type = REGULATOR_VOLTAGE, \ | ||
| 545 | .id = PM8607_ID_LDO##_id, \ | ||
| 546 | .owner = THIS_MODULE, \ | ||
| 547 | }, \ | ||
| 548 | .min_uV = (min) * 1000, \ | ||
| 549 | .max_uV = (max) * 1000, \ | ||
| 550 | .step_uV = (step) * 1000, \ | ||
| 551 | .vol_reg = PM8607_##vreg, \ | ||
| 552 | .vol_shift = (shift), \ | ||
| 553 | .vol_nbits = (nbits), \ | ||
| 554 | .enable_reg = PM8607_##ereg, \ | ||
| 555 | .enable_bit = (ebit), \ | ||
| 556 | .slope_double = (0), \ | ||
| 557 | } | ||
| 558 | |||
| 559 | static struct pm8607_regulator_info pm8607_regulator_info[] = { | ||
| 560 | PM8607_DVC(1, 0, 1500, 25, BUCK1, 6, GO, 0, SUPPLIES_EN11, 0), | ||
| 561 | PM8607_DVC(3, 0, 1500, 25, BUCK3, 6, GO, 2, SUPPLIES_EN11, 2), | ||
| 562 | |||
| 563 | PM8607_LDO(1 , 1200, 2800, 0, LDO1 , 0, 2, SUPPLIES_EN11, 3), | ||
| 564 | PM8607_LDO(2 , 1800, 3300, 0, LDO2 , 0, 3, SUPPLIES_EN11, 4), | ||
| 565 | PM8607_LDO(3 , 1800, 3300, 0, LDO3 , 0, 3, SUPPLIES_EN11, 5), | ||
| 566 | PM8607_LDO(4 , 1800, 3300, 0, LDO4 , 0, 3, SUPPLIES_EN11, 6), | ||
| 567 | PM8607_LDO(5 , 2900, 3300, 0, LDO5 , 0, 2, SUPPLIES_EN11, 7), | ||
| 568 | PM8607_LDO(6 , 1800, 3300, 0, LDO6 , 0, 3, SUPPLIES_EN12, 0), | ||
| 569 | PM8607_LDO(7 , 1800, 2900, 0, LDO7 , 0, 3, SUPPLIES_EN12, 1), | ||
| 570 | PM8607_LDO(8 , 1800, 2900, 0, LDO8 , 0, 3, SUPPLIES_EN12, 2), | ||
| 571 | PM8607_LDO(9 , 1800, 3300, 0, LDO9 , 0, 3, SUPPLIES_EN12, 3), | ||
| 572 | PM8607_LDO(10, 1200, 3300, 0, LDO10, 0, 4, SUPPLIES_EN11, 4), | ||
| 573 | PM8607_LDO(12, 1200, 3300, 0, LDO12, 0, 4, SUPPLIES_EN11, 5), | ||
| 574 | PM8607_LDO(14, 1800, 3300, 0, LDO14, 0, 3, SUPPLIES_EN11, 6), | ||
| 575 | }; | ||
| 576 | |||
| 577 | static inline struct pm8607_regulator_info *find_regulator_info(int id) | ||
| 578 | { | ||
| 579 | struct pm8607_regulator_info *info; | ||
| 580 | int i; | ||
| 581 | |||
| 582 | for (i = 0; i < ARRAY_SIZE(pm8607_regulator_info); i++) { | ||
| 583 | info = &pm8607_regulator_info[i]; | ||
| 584 | if (info->desc.id == id) | ||
| 585 | return info; | ||
| 586 | } | ||
| 587 | return NULL; | ||
| 588 | } | ||
| 589 | |||
| 590 | static int __devinit pm8607_regulator_probe(struct platform_device *pdev) | ||
| 591 | { | ||
| 592 | struct pm8607_chip *chip = dev_get_drvdata(pdev->dev.parent); | ||
| 593 | struct pm8607_platform_data *pdata = chip->dev->platform_data; | ||
| 594 | struct pm8607_regulator_info *info = NULL; | ||
| 595 | |||
| 596 | info = find_regulator_info(pdev->id); | ||
| 597 | if (info == NULL) { | ||
| 598 | dev_err(&pdev->dev, "invalid regulator ID specified\n"); | ||
| 599 | return -EINVAL; | ||
| 600 | } | ||
| 601 | |||
| 602 | info->chip = chip; | ||
| 603 | |||
| 604 | info->regulator = regulator_register(&info->desc, &pdev->dev, | ||
| 605 | pdata->regulator[pdev->id], info); | ||
| 606 | if (IS_ERR(info->regulator)) { | ||
| 607 | dev_err(&pdev->dev, "failed to register regulator %s\n", | ||
| 608 | info->desc.name); | ||
| 609 | return PTR_ERR(info->regulator); | ||
| 610 | } | ||
| 611 | |||
| 612 | /* check DVC ramp slope double */ | ||
| 613 | if (info->desc.id == PM8607_ID_BUCK3) | ||
| 614 | if (info->chip->buck3_double) | ||
| 615 | info->slope_double = 1; | ||
| 616 | |||
| 617 | platform_set_drvdata(pdev, info); | ||
| 618 | return 0; | ||
| 619 | } | ||
| 620 | |||
| 621 | static int __devexit pm8607_regulator_remove(struct platform_device *pdev) | ||
| 622 | { | ||
| 623 | struct pm8607_regulator_info *info = platform_get_drvdata(pdev); | ||
| 624 | |||
| 625 | regulator_unregister(info->regulator); | ||
| 626 | return 0; | ||
| 627 | } | ||
| 628 | |||
| 629 | #define PM8607_REGULATOR_DRIVER(_name) \ | ||
| 630 | { \ | ||
| 631 | .driver = { \ | ||
| 632 | .name = "88pm8607-" #_name, \ | ||
| 633 | .owner = THIS_MODULE, \ | ||
| 634 | }, \ | ||
| 635 | .probe = pm8607_regulator_probe, \ | ||
| 636 | .remove = __devexit_p(pm8607_regulator_remove), \ | ||
| 637 | } | ||
| 638 | |||
| 639 | static struct platform_driver pm8607_regulator_driver[] = { | ||
| 640 | PM8607_REGULATOR_DRIVER(buck1), | ||
| 641 | PM8607_REGULATOR_DRIVER(buck2), | ||
| 642 | PM8607_REGULATOR_DRIVER(buck3), | ||
| 643 | PM8607_REGULATOR_DRIVER(ldo1), | ||
| 644 | PM8607_REGULATOR_DRIVER(ldo2), | ||
| 645 | PM8607_REGULATOR_DRIVER(ldo3), | ||
| 646 | PM8607_REGULATOR_DRIVER(ldo4), | ||
| 647 | PM8607_REGULATOR_DRIVER(ldo5), | ||
| 648 | PM8607_REGULATOR_DRIVER(ldo6), | ||
| 649 | PM8607_REGULATOR_DRIVER(ldo7), | ||
| 650 | PM8607_REGULATOR_DRIVER(ldo8), | ||
| 651 | PM8607_REGULATOR_DRIVER(ldo9), | ||
| 652 | PM8607_REGULATOR_DRIVER(ldo10), | ||
| 653 | PM8607_REGULATOR_DRIVER(ldo12), | ||
| 654 | PM8607_REGULATOR_DRIVER(ldo14), | ||
| 655 | }; | ||
| 656 | |||
| 657 | static int __init pm8607_regulator_init(void) | ||
| 658 | { | ||
| 659 | int i, count, ret; | ||
| 660 | |||
| 661 | count = ARRAY_SIZE(pm8607_regulator_driver); | ||
| 662 | for (i = 0; i < count; i++) { | ||
| 663 | ret = platform_driver_register(&pm8607_regulator_driver[i]); | ||
| 664 | if (ret != 0) | ||
| 665 | pr_err("Failed to register regulator driver: %d\n", | ||
| 666 | ret); | ||
| 667 | } | ||
| 668 | return 0; | ||
| 669 | } | ||
| 670 | subsys_initcall(pm8607_regulator_init); | ||
| 671 | |||
| 672 | static void __exit pm8607_regulator_exit(void) | ||
| 673 | { | ||
| 674 | int i, count; | ||
| 675 | |||
| 676 | count = ARRAY_SIZE(pm8607_regulator_driver); | ||
| 677 | for (i = 0; i < count; i++) | ||
| 678 | platform_driver_unregister(&pm8607_regulator_driver[i]); | ||
| 679 | } | ||
| 680 | module_exit(pm8607_regulator_exit); | ||
| 681 | |||
| 682 | MODULE_LICENSE("GPL"); | ||
| 683 | MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com>"); | ||
| 684 | MODULE_DESCRIPTION("Regulator Driver for Marvell 88PM8607 PMIC"); | ||
| 685 | MODULE_ALIAS("platform:88pm8607-regulator"); | ||
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index 7cfdd65bebb4..262f62eec837 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig | |||
| @@ -69,6 +69,13 @@ config REGULATOR_MAX1586 | |||
| 69 | regulator via I2C bus. The provided regulator is suitable | 69 | regulator via I2C bus. The provided regulator is suitable |
| 70 | for PXA27x chips to control VCC_CORE and VCC_USIM voltages. | 70 | for PXA27x chips to control VCC_CORE and VCC_USIM voltages. |
| 71 | 71 | ||
| 72 | config REGULATOR_MAX8660 | ||
| 73 | tristate "Maxim 8660/8661 voltage regulator" | ||
| 74 | depends on I2C | ||
| 75 | help | ||
| 76 | This driver controls a Maxim 8660/8661 voltage output | ||
| 77 | regulator via I2C bus. | ||
| 78 | |||
| 72 | config REGULATOR_TWL4030 | 79 | config REGULATOR_TWL4030 |
| 73 | bool "TI TWL4030/TWL5030/TWL6030/TPS695x0 PMIC" | 80 | bool "TI TWL4030/TWL5030/TWL6030/TPS695x0 PMIC" |
| 74 | depends on TWL4030_CORE | 81 | depends on TWL4030_CORE |
| @@ -157,5 +164,11 @@ config REGULATOR_TPS6507X | |||
| 157 | three step-down converters and two general-purpose LDO voltage regulators. | 164 | three step-down converters and two general-purpose LDO voltage regulators. |
| 158 | It supports TI's software based Class-2 SmartReflex implementation. | 165 | It supports TI's software based Class-2 SmartReflex implementation. |
| 159 | 166 | ||
| 167 | config REGULATOR_88PM8607 | ||
| 168 | bool "Marvell 88PM8607 Power regulators" | ||
| 169 | depends on MFD_88PM8607=y | ||
| 170 | help | ||
| 171 | This driver supports 88PM8607 voltage regulator chips. | ||
| 172 | |||
| 160 | endif | 173 | endif |
| 161 | 174 | ||
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile index 9ae3cc44e668..b3c806c79415 100644 --- a/drivers/regulator/Makefile +++ b/drivers/regulator/Makefile | |||
| @@ -12,6 +12,7 @@ obj-$(CONFIG_REGULATOR_BQ24022) += bq24022.o | |||
| 12 | obj-$(CONFIG_REGULATOR_LP3971) += lp3971.o | 12 | obj-$(CONFIG_REGULATOR_LP3971) += lp3971.o |
| 13 | obj-$(CONFIG_REGULATOR_MAX1586) += max1586.o | 13 | obj-$(CONFIG_REGULATOR_MAX1586) += max1586.o |
| 14 | obj-$(CONFIG_REGULATOR_TWL4030) += twl-regulator.o | 14 | obj-$(CONFIG_REGULATOR_TWL4030) += twl-regulator.o |
| 15 | obj-$(CONFIG_REGULATOR_MAX8660) += max8660.o | ||
| 15 | obj-$(CONFIG_REGULATOR_WM831X) += wm831x-dcdc.o | 16 | obj-$(CONFIG_REGULATOR_WM831X) += wm831x-dcdc.o |
| 16 | obj-$(CONFIG_REGULATOR_WM831X) += wm831x-isink.o | 17 | obj-$(CONFIG_REGULATOR_WM831X) += wm831x-isink.o |
| 17 | obj-$(CONFIG_REGULATOR_WM831X) += wm831x-ldo.o | 18 | obj-$(CONFIG_REGULATOR_WM831X) += wm831x-ldo.o |
| @@ -20,10 +21,11 @@ obj-$(CONFIG_REGULATOR_WM8400) += wm8400-regulator.o | |||
| 20 | obj-$(CONFIG_REGULATOR_DA903X) += da903x.o | 21 | obj-$(CONFIG_REGULATOR_DA903X) += da903x.o |
| 21 | obj-$(CONFIG_REGULATOR_PCF50633) += pcf50633-regulator.o | 22 | obj-$(CONFIG_REGULATOR_PCF50633) += pcf50633-regulator.o |
| 22 | obj-$(CONFIG_REGULATOR_PCAP) += pcap-regulator.o | 23 | obj-$(CONFIG_REGULATOR_PCAP) += pcap-regulator.o |
| 23 | obj-$(CONFIG_REGULATOR_MC13783) += mc13783.o | 24 | obj-$(CONFIG_REGULATOR_MC13783) += mc13783-regulator.o |
| 24 | obj-$(CONFIG_REGULATOR_AB3100) += ab3100.o | 25 | obj-$(CONFIG_REGULATOR_AB3100) += ab3100.o |
| 25 | 26 | ||
| 26 | obj-$(CONFIG_REGULATOR_TPS65023) += tps65023-regulator.o | 27 | obj-$(CONFIG_REGULATOR_TPS65023) += tps65023-regulator.o |
| 27 | obj-$(CONFIG_REGULATOR_TPS6507X) += tps6507x-regulator.o | 28 | obj-$(CONFIG_REGULATOR_TPS6507X) += tps6507x-regulator.o |
| 29 | obj-$(CONFIG_REGULATOR_88PM8607) += 88pm8607.o | ||
| 28 | 30 | ||
| 29 | ccflags-$(CONFIG_REGULATOR_DEBUG) += -DDEBUG | 31 | ccflags-$(CONFIG_REGULATOR_DEBUG) += -DDEBUG |
diff --git a/drivers/regulator/ab3100.c b/drivers/regulator/ab3100.c index 49aeee823a25..b349db4504b7 100644 --- a/drivers/regulator/ab3100.c +++ b/drivers/regulator/ab3100.c | |||
| @@ -81,7 +81,7 @@ static const u8 ab3100_reg_init_order[AB3100_NUM_REGULATORS+2] = { | |||
| 81 | #define LDO_C_VOLTAGE 2650000 | 81 | #define LDO_C_VOLTAGE 2650000 |
| 82 | #define LDO_D_VOLTAGE 2650000 | 82 | #define LDO_D_VOLTAGE 2650000 |
| 83 | 83 | ||
| 84 | static const int const ldo_e_buck_typ_voltages[] = { | 84 | static const int ldo_e_buck_typ_voltages[] = { |
| 85 | 1800000, | 85 | 1800000, |
| 86 | 1400000, | 86 | 1400000, |
| 87 | 1300000, | 87 | 1300000, |
| @@ -91,7 +91,7 @@ static const int const ldo_e_buck_typ_voltages[] = { | |||
| 91 | 900000, | 91 | 900000, |
| 92 | }; | 92 | }; |
| 93 | 93 | ||
| 94 | static const int const ldo_f_typ_voltages[] = { | 94 | static const int ldo_f_typ_voltages[] = { |
| 95 | 1800000, | 95 | 1800000, |
| 96 | 1400000, | 96 | 1400000, |
| 97 | 1300000, | 97 | 1300000, |
| @@ -102,21 +102,21 @@ static const int const ldo_f_typ_voltages[] = { | |||
| 102 | 2650000, | 102 | 2650000, |
| 103 | }; | 103 | }; |
| 104 | 104 | ||
| 105 | static const int const ldo_g_typ_voltages[] = { | 105 | static const int ldo_g_typ_voltages[] = { |
| 106 | 2850000, | 106 | 2850000, |
| 107 | 2750000, | 107 | 2750000, |
| 108 | 1800000, | 108 | 1800000, |
| 109 | 1500000, | 109 | 1500000, |
| 110 | }; | 110 | }; |
| 111 | 111 | ||
| 112 | static const int const ldo_h_typ_voltages[] = { | 112 | static const int ldo_h_typ_voltages[] = { |
| 113 | 2750000, | 113 | 2750000, |
| 114 | 1800000, | 114 | 1800000, |
| 115 | 1500000, | 115 | 1500000, |
| 116 | 1200000, | 116 | 1200000, |
| 117 | }; | 117 | }; |
| 118 | 118 | ||
| 119 | static const int const ldo_k_typ_voltages[] = { | 119 | static const int ldo_k_typ_voltages[] = { |
| 120 | 2750000, | 120 | 2750000, |
| 121 | 1800000, | 121 | 1800000, |
| 122 | }; | 122 | }; |
| @@ -241,24 +241,12 @@ static int ab3100_disable_regulator(struct regulator_dev *reg) | |||
| 241 | * LDO D is a special regulator. When it is disabled, the entire | 241 | * LDO D is a special regulator. When it is disabled, the entire |
| 242 | * system is shut down. So this is handled specially. | 242 | * system is shut down. So this is handled specially. |
| 243 | */ | 243 | */ |
| 244 | pr_info("Called ab3100_disable_regulator\n"); | ||
| 244 | if (abreg->regreg == AB3100_LDO_D) { | 245 | if (abreg->regreg == AB3100_LDO_D) { |
| 245 | int i; | ||
| 246 | |||
| 247 | dev_info(®->dev, "disabling LDO D - shut down system\n"); | 246 | dev_info(®->dev, "disabling LDO D - shut down system\n"); |
| 248 | /* | ||
| 249 | * Set regulators to default values, ignore any errors, | ||
| 250 | * we're going DOWN | ||
| 251 | */ | ||
| 252 | for (i = 0; i < ARRAY_SIZE(ab3100_reg_init_order); i++) { | ||
| 253 | (void) ab3100_set_register_interruptible(abreg->ab3100, | ||
| 254 | ab3100_reg_init_order[i], | ||
| 255 | abreg->plfdata->reg_initvals[i]); | ||
| 256 | } | ||
| 257 | |||
| 258 | /* Setting LDO D to 0x00 cuts the power to the SoC */ | 247 | /* Setting LDO D to 0x00 cuts the power to the SoC */ |
| 259 | return ab3100_set_register_interruptible(abreg->ab3100, | 248 | return ab3100_set_register_interruptible(abreg->ab3100, |
| 260 | AB3100_LDO_D, 0x00U); | 249 | AB3100_LDO_D, 0x00U); |
| 261 | |||
| 262 | } | 250 | } |
| 263 | 251 | ||
| 264 | /* | 252 | /* |
| @@ -607,13 +595,6 @@ static int __init ab3100_regulators_probe(struct platform_device *pdev) | |||
| 607 | } | 595 | } |
| 608 | } | 596 | } |
| 609 | 597 | ||
| 610 | if (err) { | ||
| 611 | dev_err(&pdev->dev, | ||
| 612 | "LDO D regulator initialization failed with error %d\n", | ||
| 613 | err); | ||
| 614 | return err; | ||
| 615 | } | ||
| 616 | |||
| 617 | /* Register the regulators */ | 598 | /* Register the regulators */ |
| 618 | for (i = 0; i < AB3100_NUM_REGULATORS; i++) { | 599 | for (i = 0; i < AB3100_NUM_REGULATORS; i++) { |
| 619 | struct ab3100_regulator *reg = &ab3100_regulators[i]; | 600 | struct ab3100_regulator *reg = &ab3100_regulators[i]; |
| @@ -688,7 +669,7 @@ static __init int ab3100_regulators_init(void) | |||
| 688 | 669 | ||
| 689 | static __exit void ab3100_regulators_exit(void) | 670 | static __exit void ab3100_regulators_exit(void) |
| 690 | { | 671 | { |
| 691 | platform_driver_register(&ab3100_regulators_driver); | 672 | platform_driver_unregister(&ab3100_regulators_driver); |
| 692 | } | 673 | } |
| 693 | 674 | ||
| 694 | subsys_initcall(ab3100_regulators_init); | 675 | subsys_initcall(ab3100_regulators_init); |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index efe568deda12..686ef270ecf7 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
| @@ -66,6 +66,16 @@ static unsigned int _regulator_get_mode(struct regulator_dev *rdev); | |||
| 66 | static void _notifier_call_chain(struct regulator_dev *rdev, | 66 | static void _notifier_call_chain(struct regulator_dev *rdev, |
| 67 | unsigned long event, void *data); | 67 | unsigned long event, void *data); |
| 68 | 68 | ||
| 69 | static const char *rdev_get_name(struct regulator_dev *rdev) | ||
| 70 | { | ||
| 71 | if (rdev->constraints && rdev->constraints->name) | ||
| 72 | return rdev->constraints->name; | ||
| 73 | else if (rdev->desc->name) | ||
| 74 | return rdev->desc->name; | ||
| 75 | else | ||
| 76 | return ""; | ||
| 77 | } | ||
| 78 | |||
| 69 | /* gets the regulator for a given consumer device */ | 79 | /* gets the regulator for a given consumer device */ |
| 70 | static struct regulator *get_device_regulator(struct device *dev) | 80 | static struct regulator *get_device_regulator(struct device *dev) |
| 71 | { | 81 | { |
| @@ -96,12 +106,12 @@ static int regulator_check_voltage(struct regulator_dev *rdev, | |||
| 96 | 106 | ||
| 97 | if (!rdev->constraints) { | 107 | if (!rdev->constraints) { |
| 98 | printk(KERN_ERR "%s: no constraints for %s\n", __func__, | 108 | printk(KERN_ERR "%s: no constraints for %s\n", __func__, |
| 99 | rdev->desc->name); | 109 | rdev_get_name(rdev)); |
| 100 | return -ENODEV; | 110 | return -ENODEV; |
| 101 | } | 111 | } |
| 102 | if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) { | 112 | if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) { |
| 103 | printk(KERN_ERR "%s: operation not allowed for %s\n", | 113 | printk(KERN_ERR "%s: operation not allowed for %s\n", |
| 104 | __func__, rdev->desc->name); | 114 | __func__, rdev_get_name(rdev)); |
| 105 | return -EPERM; | 115 | return -EPERM; |
| 106 | } | 116 | } |
| 107 | 117 | ||
| @@ -124,12 +134,12 @@ static int regulator_check_current_limit(struct regulator_dev *rdev, | |||
| 124 | 134 | ||
| 125 | if (!rdev->constraints) { | 135 | if (!rdev->constraints) { |
| 126 | printk(KERN_ERR "%s: no constraints for %s\n", __func__, | 136 | printk(KERN_ERR "%s: no constraints for %s\n", __func__, |
| 127 | rdev->desc->name); | 137 | rdev_get_name(rdev)); |
| 128 | return -ENODEV; | 138 | return -ENODEV; |
| 129 | } | 139 | } |
| 130 | if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_CURRENT)) { | 140 | if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_CURRENT)) { |
| 131 | printk(KERN_ERR "%s: operation not allowed for %s\n", | 141 | printk(KERN_ERR "%s: operation not allowed for %s\n", |
| 132 | __func__, rdev->desc->name); | 142 | __func__, rdev_get_name(rdev)); |
| 133 | return -EPERM; | 143 | return -EPERM; |
| 134 | } | 144 | } |
| 135 | 145 | ||
| @@ -159,17 +169,17 @@ static int regulator_check_mode(struct regulator_dev *rdev, int mode) | |||
| 159 | 169 | ||
| 160 | if (!rdev->constraints) { | 170 | if (!rdev->constraints) { |
| 161 | printk(KERN_ERR "%s: no constraints for %s\n", __func__, | 171 | printk(KERN_ERR "%s: no constraints for %s\n", __func__, |
| 162 | rdev->desc->name); | 172 | rdev_get_name(rdev)); |
| 163 | return -ENODEV; | 173 | return -ENODEV; |
| 164 | } | 174 | } |
| 165 | if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_MODE)) { | 175 | if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_MODE)) { |
| 166 | printk(KERN_ERR "%s: operation not allowed for %s\n", | 176 | printk(KERN_ERR "%s: operation not allowed for %s\n", |
| 167 | __func__, rdev->desc->name); | 177 | __func__, rdev_get_name(rdev)); |
| 168 | return -EPERM; | 178 | return -EPERM; |
| 169 | } | 179 | } |
| 170 | if (!(rdev->constraints->valid_modes_mask & mode)) { | 180 | if (!(rdev->constraints->valid_modes_mask & mode)) { |
| 171 | printk(KERN_ERR "%s: invalid mode %x for %s\n", | 181 | printk(KERN_ERR "%s: invalid mode %x for %s\n", |
| 172 | __func__, mode, rdev->desc->name); | 182 | __func__, mode, rdev_get_name(rdev)); |
| 173 | return -EINVAL; | 183 | return -EINVAL; |
| 174 | } | 184 | } |
| 175 | return 0; | 185 | return 0; |
| @@ -180,12 +190,12 @@ static int regulator_check_drms(struct regulator_dev *rdev) | |||
| 180 | { | 190 | { |
| 181 | if (!rdev->constraints) { | 191 | if (!rdev->constraints) { |
| 182 | printk(KERN_ERR "%s: no constraints for %s\n", __func__, | 192 | printk(KERN_ERR "%s: no constraints for %s\n", __func__, |
| 183 | rdev->desc->name); | 193 | rdev_get_name(rdev)); |
| 184 | return -ENODEV; | 194 | return -ENODEV; |
| 185 | } | 195 | } |
| 186 | if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_DRMS)) { | 196 | if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_DRMS)) { |
| 187 | printk(KERN_ERR "%s: operation not allowed for %s\n", | 197 | printk(KERN_ERR "%s: operation not allowed for %s\n", |
| 188 | __func__, rdev->desc->name); | 198 | __func__, rdev_get_name(rdev)); |
| 189 | return -EPERM; | 199 | return -EPERM; |
| 190 | } | 200 | } |
| 191 | return 0; | 201 | return 0; |
| @@ -230,16 +240,8 @@ static ssize_t regulator_name_show(struct device *dev, | |||
| 230 | struct device_attribute *attr, char *buf) | 240 | struct device_attribute *attr, char *buf) |
| 231 | { | 241 | { |
| 232 | struct regulator_dev *rdev = dev_get_drvdata(dev); | 242 | struct regulator_dev *rdev = dev_get_drvdata(dev); |
| 233 | const char *name; | ||
| 234 | 243 | ||
| 235 | if (rdev->constraints && rdev->constraints->name) | 244 | return sprintf(buf, "%s\n", rdev_get_name(rdev)); |
| 236 | name = rdev->constraints->name; | ||
| 237 | else if (rdev->desc->name) | ||
| 238 | name = rdev->desc->name; | ||
| 239 | else | ||
| 240 | name = ""; | ||
| 241 | |||
| 242 | return sprintf(buf, "%s\n", name); | ||
| 243 | } | 245 | } |
| 244 | 246 | ||
| 245 | static ssize_t regulator_print_opmode(char *buf, int mode) | 247 | static ssize_t regulator_print_opmode(char *buf, int mode) |
| @@ -388,7 +390,7 @@ static ssize_t regulator_total_uA_show(struct device *dev, | |||
| 388 | 390 | ||
| 389 | mutex_lock(&rdev->mutex); | 391 | mutex_lock(&rdev->mutex); |
| 390 | list_for_each_entry(regulator, &rdev->consumer_list, list) | 392 | list_for_each_entry(regulator, &rdev->consumer_list, list) |
| 391 | uA += regulator->uA_load; | 393 | uA += regulator->uA_load; |
| 392 | mutex_unlock(&rdev->mutex); | 394 | mutex_unlock(&rdev->mutex); |
| 393 | return sprintf(buf, "%d\n", uA); | 395 | return sprintf(buf, "%d\n", uA); |
| 394 | } | 396 | } |
| @@ -563,7 +565,7 @@ static void drms_uA_update(struct regulator_dev *rdev) | |||
| 563 | 565 | ||
| 564 | /* calc total requested load */ | 566 | /* calc total requested load */ |
| 565 | list_for_each_entry(sibling, &rdev->consumer_list, list) | 567 | list_for_each_entry(sibling, &rdev->consumer_list, list) |
| 566 | current_uA += sibling->uA_load; | 568 | current_uA += sibling->uA_load; |
| 567 | 569 | ||
| 568 | /* now get the optimum mode for our new total regulator load */ | 570 | /* now get the optimum mode for our new total regulator load */ |
| 569 | mode = rdev->desc->ops->get_optimum_mode(rdev, input_uV, | 571 | mode = rdev->desc->ops->get_optimum_mode(rdev, input_uV, |
| @@ -579,10 +581,29 @@ static int suspend_set_state(struct regulator_dev *rdev, | |||
| 579 | struct regulator_state *rstate) | 581 | struct regulator_state *rstate) |
| 580 | { | 582 | { |
| 581 | int ret = 0; | 583 | int ret = 0; |
| 584 | bool can_set_state; | ||
| 582 | 585 | ||
| 583 | /* enable & disable are mandatory for suspend control */ | 586 | can_set_state = rdev->desc->ops->set_suspend_enable && |
| 584 | if (!rdev->desc->ops->set_suspend_enable || | 587 | rdev->desc->ops->set_suspend_disable; |
| 585 | !rdev->desc->ops->set_suspend_disable) { | 588 | |
| 589 | /* If we have no suspend mode configration don't set anything; | ||
| 590 | * only warn if the driver actually makes the suspend mode | ||
| 591 | * configurable. | ||
| 592 | */ | ||
| 593 | if (!rstate->enabled && !rstate->disabled) { | ||
| 594 | if (can_set_state) | ||
| 595 | printk(KERN_WARNING "%s: No configuration for %s\n", | ||
| 596 | __func__, rdev_get_name(rdev)); | ||
| 597 | return 0; | ||
| 598 | } | ||
| 599 | |||
| 600 | if (rstate->enabled && rstate->disabled) { | ||
| 601 | printk(KERN_ERR "%s: invalid configuration for %s\n", | ||
| 602 | __func__, rdev_get_name(rdev)); | ||
| 603 | return -EINVAL; | ||
| 604 | } | ||
| 605 | |||
| 606 | if (!can_set_state) { | ||
| 586 | printk(KERN_ERR "%s: no way to set suspend state\n", | 607 | printk(KERN_ERR "%s: no way to set suspend state\n", |
| 587 | __func__); | 608 | __func__); |
| 588 | return -EINVAL; | 609 | return -EINVAL; |
| @@ -641,25 +662,43 @@ static void print_constraints(struct regulator_dev *rdev) | |||
| 641 | { | 662 | { |
| 642 | struct regulation_constraints *constraints = rdev->constraints; | 663 | struct regulation_constraints *constraints = rdev->constraints; |
| 643 | char buf[80]; | 664 | char buf[80]; |
| 644 | int count; | 665 | int count = 0; |
| 666 | int ret; | ||
| 645 | 667 | ||
| 646 | if (rdev->desc->type == REGULATOR_VOLTAGE) { | 668 | if (constraints->min_uV && constraints->max_uV) { |
| 647 | if (constraints->min_uV == constraints->max_uV) | 669 | if (constraints->min_uV == constraints->max_uV) |
| 648 | count = sprintf(buf, "%d mV ", | 670 | count += sprintf(buf + count, "%d mV ", |
| 649 | constraints->min_uV / 1000); | 671 | constraints->min_uV / 1000); |
| 650 | else | 672 | else |
| 651 | count = sprintf(buf, "%d <--> %d mV ", | 673 | count += sprintf(buf + count, "%d <--> %d mV ", |
| 652 | constraints->min_uV / 1000, | 674 | constraints->min_uV / 1000, |
| 653 | constraints->max_uV / 1000); | 675 | constraints->max_uV / 1000); |
| 654 | } else { | 676 | } |
| 677 | |||
| 678 | if (!constraints->min_uV || | ||
| 679 | constraints->min_uV != constraints->max_uV) { | ||
| 680 | ret = _regulator_get_voltage(rdev); | ||
| 681 | if (ret > 0) | ||
| 682 | count += sprintf(buf + count, "at %d mV ", ret / 1000); | ||
| 683 | } | ||
| 684 | |||
| 685 | if (constraints->min_uA && constraints->max_uA) { | ||
| 655 | if (constraints->min_uA == constraints->max_uA) | 686 | if (constraints->min_uA == constraints->max_uA) |
| 656 | count = sprintf(buf, "%d mA ", | 687 | count += sprintf(buf + count, "%d mA ", |
| 657 | constraints->min_uA / 1000); | 688 | constraints->min_uA / 1000); |
| 658 | else | 689 | else |
| 659 | count = sprintf(buf, "%d <--> %d mA ", | 690 | count += sprintf(buf + count, "%d <--> %d mA ", |
| 660 | constraints->min_uA / 1000, | 691 | constraints->min_uA / 1000, |
| 661 | constraints->max_uA / 1000); | 692 | constraints->max_uA / 1000); |
| 662 | } | 693 | } |
| 694 | |||
| 695 | if (!constraints->min_uA || | ||
| 696 | constraints->min_uA != constraints->max_uA) { | ||
| 697 | ret = _regulator_get_current_limit(rdev); | ||
| 698 | if (ret > 0) | ||
| 699 | count += sprintf(buf + count, "at %d uA ", ret / 1000); | ||
| 700 | } | ||
| 701 | |||
| 663 | if (constraints->valid_modes_mask & REGULATOR_MODE_FAST) | 702 | if (constraints->valid_modes_mask & REGULATOR_MODE_FAST) |
| 664 | count += sprintf(buf + count, "fast "); | 703 | count += sprintf(buf + count, "fast "); |
| 665 | if (constraints->valid_modes_mask & REGULATOR_MODE_NORMAL) | 704 | if (constraints->valid_modes_mask & REGULATOR_MODE_NORMAL) |
| @@ -669,33 +708,30 @@ static void print_constraints(struct regulator_dev *rdev) | |||
| 669 | if (constraints->valid_modes_mask & REGULATOR_MODE_STANDBY) | 708 | if (constraints->valid_modes_mask & REGULATOR_MODE_STANDBY) |
| 670 | count += sprintf(buf + count, "standby"); | 709 | count += sprintf(buf + count, "standby"); |
| 671 | 710 | ||
| 672 | printk(KERN_INFO "regulator: %s: %s\n", rdev->desc->name, buf); | 711 | printk(KERN_INFO "regulator: %s: %s\n", rdev_get_name(rdev), buf); |
| 673 | } | 712 | } |
| 674 | 713 | ||
| 675 | /** | 714 | static int machine_constraints_voltage(struct regulator_dev *rdev, |
| 676 | * set_machine_constraints - sets regulator constraints | ||
| 677 | * @rdev: regulator source | ||
| 678 | * @constraints: constraints to apply | ||
| 679 | * | ||
| 680 | * Allows platform initialisation code to define and constrain | ||
| 681 | * regulator circuits e.g. valid voltage/current ranges, etc. NOTE: | ||
| 682 | * Constraints *must* be set by platform code in order for some | ||
| 683 | * regulator operations to proceed i.e. set_voltage, set_current_limit, | ||
| 684 | * set_mode. | ||
| 685 | */ | ||
| 686 | static int set_machine_constraints(struct regulator_dev *rdev, | ||
| 687 | struct regulation_constraints *constraints) | 715 | struct regulation_constraints *constraints) |
| 688 | { | 716 | { |
| 689 | int ret = 0; | ||
| 690 | const char *name; | ||
| 691 | struct regulator_ops *ops = rdev->desc->ops; | 717 | struct regulator_ops *ops = rdev->desc->ops; |
| 718 | const char *name = rdev_get_name(rdev); | ||
| 719 | int ret; | ||
| 692 | 720 | ||
| 693 | if (constraints->name) | 721 | /* do we need to apply the constraint voltage */ |
| 694 | name = constraints->name; | 722 | if (rdev->constraints->apply_uV && |
| 695 | else if (rdev->desc->name) | 723 | rdev->constraints->min_uV == rdev->constraints->max_uV && |
| 696 | name = rdev->desc->name; | 724 | ops->set_voltage) { |
| 697 | else | 725 | ret = ops->set_voltage(rdev, |
| 698 | name = "regulator"; | 726 | rdev->constraints->min_uV, rdev->constraints->max_uV); |
| 727 | if (ret < 0) { | ||
| 728 | printk(KERN_ERR "%s: failed to apply %duV constraint to %s\n", | ||
| 729 | __func__, | ||
| 730 | rdev->constraints->min_uV, name); | ||
| 731 | rdev->constraints = NULL; | ||
| 732 | return ret; | ||
| 733 | } | ||
| 734 | } | ||
| 699 | 735 | ||
| 700 | /* constrain machine-level voltage specs to fit | 736 | /* constrain machine-level voltage specs to fit |
| 701 | * the actual range supported by this regulator. | 737 | * the actual range supported by this regulator. |
| @@ -719,14 +755,13 @@ static int set_machine_constraints(struct regulator_dev *rdev, | |||
| 719 | 755 | ||
| 720 | /* voltage constraints are optional */ | 756 | /* voltage constraints are optional */ |
| 721 | if ((cmin == 0) && (cmax == 0)) | 757 | if ((cmin == 0) && (cmax == 0)) |
| 722 | goto out; | 758 | return 0; |
| 723 | 759 | ||
| 724 | /* else require explicit machine-level constraints */ | 760 | /* else require explicit machine-level constraints */ |
| 725 | if (cmin <= 0 || cmax <= 0 || cmax < cmin) { | 761 | if (cmin <= 0 || cmax <= 0 || cmax < cmin) { |
| 726 | pr_err("%s: %s '%s' voltage constraints\n", | 762 | pr_err("%s: %s '%s' voltage constraints\n", |
| 727 | __func__, "invalid", name); | 763 | __func__, "invalid", name); |
| 728 | ret = -EINVAL; | 764 | return -EINVAL; |
| 729 | goto out; | ||
| 730 | } | 765 | } |
| 731 | 766 | ||
| 732 | /* initial: [cmin..cmax] valid, [min_uV..max_uV] not */ | 767 | /* initial: [cmin..cmax] valid, [min_uV..max_uV] not */ |
| @@ -748,8 +783,7 @@ static int set_machine_constraints(struct regulator_dev *rdev, | |||
| 748 | if (max_uV < min_uV) { | 783 | if (max_uV < min_uV) { |
| 749 | pr_err("%s: %s '%s' voltage constraints\n", | 784 | pr_err("%s: %s '%s' voltage constraints\n", |
| 750 | __func__, "unsupportable", name); | 785 | __func__, "unsupportable", name); |
| 751 | ret = -EINVAL; | 786 | return -EINVAL; |
| 752 | goto out; | ||
| 753 | } | 787 | } |
| 754 | 788 | ||
| 755 | /* use regulator's subset of machine constraints */ | 789 | /* use regulator's subset of machine constraints */ |
| @@ -767,22 +801,34 @@ static int set_machine_constraints(struct regulator_dev *rdev, | |||
| 767 | } | 801 | } |
| 768 | } | 802 | } |
| 769 | 803 | ||
| 804 | return 0; | ||
| 805 | } | ||
| 806 | |||
| 807 | /** | ||
| 808 | * set_machine_constraints - sets regulator constraints | ||
| 809 | * @rdev: regulator source | ||
| 810 | * @constraints: constraints to apply | ||
| 811 | * | ||
| 812 | * Allows platform initialisation code to define and constrain | ||
| 813 | * regulator circuits e.g. valid voltage/current ranges, etc. NOTE: | ||
| 814 | * Constraints *must* be set by platform code in order for some | ||
| 815 | * regulator operations to proceed i.e. set_voltage, set_current_limit, | ||
| 816 | * set_mode. | ||
| 817 | */ | ||
| 818 | static int set_machine_constraints(struct regulator_dev *rdev, | ||
| 819 | struct regulation_constraints *constraints) | ||
| 820 | { | ||
| 821 | int ret = 0; | ||
| 822 | const char *name; | ||
| 823 | struct regulator_ops *ops = rdev->desc->ops; | ||
| 824 | |||
| 770 | rdev->constraints = constraints; | 825 | rdev->constraints = constraints; |
| 771 | 826 | ||
| 772 | /* do we need to apply the constraint voltage */ | 827 | name = rdev_get_name(rdev); |
| 773 | if (rdev->constraints->apply_uV && | 828 | |
| 774 | rdev->constraints->min_uV == rdev->constraints->max_uV && | 829 | ret = machine_constraints_voltage(rdev, constraints); |
| 775 | ops->set_voltage) { | 830 | if (ret != 0) |
| 776 | ret = ops->set_voltage(rdev, | 831 | goto out; |
| 777 | rdev->constraints->min_uV, rdev->constraints->max_uV); | ||
| 778 | if (ret < 0) { | ||
| 779 | printk(KERN_ERR "%s: failed to apply %duV constraint to %s\n", | ||
| 780 | __func__, | ||
| 781 | rdev->constraints->min_uV, name); | ||
| 782 | rdev->constraints = NULL; | ||
| 783 | goto out; | ||
| 784 | } | ||
| 785 | } | ||
| 786 | 832 | ||
| 787 | /* do we need to setup our suspend state */ | 833 | /* do we need to setup our suspend state */ |
| 788 | if (constraints->initial_state) { | 834 | if (constraints->initial_state) { |
| @@ -903,7 +949,7 @@ static int set_consumer_device_supply(struct regulator_dev *rdev, | |||
| 903 | dev_name(&node->regulator->dev), | 949 | dev_name(&node->regulator->dev), |
| 904 | node->regulator->desc->name, | 950 | node->regulator->desc->name, |
| 905 | supply, | 951 | supply, |
| 906 | dev_name(&rdev->dev), rdev->desc->name); | 952 | dev_name(&rdev->dev), rdev_get_name(rdev)); |
| 907 | return -EBUSY; | 953 | return -EBUSY; |
| 908 | } | 954 | } |
| 909 | 955 | ||
| @@ -1212,7 +1258,7 @@ static int _regulator_enable(struct regulator_dev *rdev) | |||
| 1212 | ret = _regulator_enable(rdev->supply); | 1258 | ret = _regulator_enable(rdev->supply); |
| 1213 | if (ret < 0) { | 1259 | if (ret < 0) { |
| 1214 | printk(KERN_ERR "%s: failed to enable %s: %d\n", | 1260 | printk(KERN_ERR "%s: failed to enable %s: %d\n", |
| 1215 | __func__, rdev->desc->name, ret); | 1261 | __func__, rdev_get_name(rdev), ret); |
| 1216 | return ret; | 1262 | return ret; |
| 1217 | } | 1263 | } |
| 1218 | } | 1264 | } |
| @@ -1238,7 +1284,7 @@ static int _regulator_enable(struct regulator_dev *rdev) | |||
| 1238 | } | 1284 | } |
| 1239 | } else if (ret < 0) { | 1285 | } else if (ret < 0) { |
| 1240 | printk(KERN_ERR "%s: is_enabled() failed for %s: %d\n", | 1286 | printk(KERN_ERR "%s: is_enabled() failed for %s: %d\n", |
| 1241 | __func__, rdev->desc->name, ret); | 1287 | __func__, rdev_get_name(rdev), ret); |
| 1242 | return ret; | 1288 | return ret; |
| 1243 | } | 1289 | } |
| 1244 | /* Fallthrough on positive return values - already enabled */ | 1290 | /* Fallthrough on positive return values - already enabled */ |
| @@ -1279,7 +1325,7 @@ static int _regulator_disable(struct regulator_dev *rdev) | |||
| 1279 | 1325 | ||
| 1280 | if (WARN(rdev->use_count <= 0, | 1326 | if (WARN(rdev->use_count <= 0, |
| 1281 | "unbalanced disables for %s\n", | 1327 | "unbalanced disables for %s\n", |
| 1282 | rdev->desc->name)) | 1328 | rdev_get_name(rdev))) |
| 1283 | return -EIO; | 1329 | return -EIO; |
| 1284 | 1330 | ||
| 1285 | /* are we the last user and permitted to disable ? */ | 1331 | /* are we the last user and permitted to disable ? */ |
| @@ -1292,7 +1338,7 @@ static int _regulator_disable(struct regulator_dev *rdev) | |||
| 1292 | ret = rdev->desc->ops->disable(rdev); | 1338 | ret = rdev->desc->ops->disable(rdev); |
| 1293 | if (ret < 0) { | 1339 | if (ret < 0) { |
| 1294 | printk(KERN_ERR "%s: failed to disable %s\n", | 1340 | printk(KERN_ERR "%s: failed to disable %s\n", |
| 1295 | __func__, rdev->desc->name); | 1341 | __func__, rdev_get_name(rdev)); |
| 1296 | return ret; | 1342 | return ret; |
| 1297 | } | 1343 | } |
| 1298 | } | 1344 | } |
| @@ -1349,7 +1395,7 @@ static int _regulator_force_disable(struct regulator_dev *rdev) | |||
| 1349 | ret = rdev->desc->ops->disable(rdev); | 1395 | ret = rdev->desc->ops->disable(rdev); |
| 1350 | if (ret < 0) { | 1396 | if (ret < 0) { |
| 1351 | printk(KERN_ERR "%s: failed to force disable %s\n", | 1397 | printk(KERN_ERR "%s: failed to force disable %s\n", |
| 1352 | __func__, rdev->desc->name); | 1398 | __func__, rdev_get_name(rdev)); |
| 1353 | return ret; | 1399 | return ret; |
| 1354 | } | 1400 | } |
| 1355 | /* notify other consumers that power has been forced off */ | 1401 | /* notify other consumers that power has been forced off */ |
| @@ -1766,7 +1812,7 @@ int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) | |||
| 1766 | output_uV = rdev->desc->ops->get_voltage(rdev); | 1812 | output_uV = rdev->desc->ops->get_voltage(rdev); |
| 1767 | if (output_uV <= 0) { | 1813 | if (output_uV <= 0) { |
| 1768 | printk(KERN_ERR "%s: invalid output voltage found for %s\n", | 1814 | printk(KERN_ERR "%s: invalid output voltage found for %s\n", |
| 1769 | __func__, rdev->desc->name); | 1815 | __func__, rdev_get_name(rdev)); |
| 1770 | goto out; | 1816 | goto out; |
| 1771 | } | 1817 | } |
| 1772 | 1818 | ||
| @@ -1777,13 +1823,13 @@ int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) | |||
| 1777 | input_uV = rdev->constraints->input_uV; | 1823 | input_uV = rdev->constraints->input_uV; |
| 1778 | if (input_uV <= 0) { | 1824 | if (input_uV <= 0) { |
| 1779 | printk(KERN_ERR "%s: invalid input voltage found for %s\n", | 1825 | printk(KERN_ERR "%s: invalid input voltage found for %s\n", |
| 1780 | __func__, rdev->desc->name); | 1826 | __func__, rdev_get_name(rdev)); |
| 1781 | goto out; | 1827 | goto out; |
| 1782 | } | 1828 | } |
| 1783 | 1829 | ||
| 1784 | /* calc total requested load for this regulator */ | 1830 | /* calc total requested load for this regulator */ |
| 1785 | list_for_each_entry(consumer, &rdev->consumer_list, list) | 1831 | list_for_each_entry(consumer, &rdev->consumer_list, list) |
| 1786 | total_uA_load += consumer->uA_load; | 1832 | total_uA_load += consumer->uA_load; |
| 1787 | 1833 | ||
| 1788 | mode = rdev->desc->ops->get_optimum_mode(rdev, | 1834 | mode = rdev->desc->ops->get_optimum_mode(rdev, |
| 1789 | input_uV, output_uV, | 1835 | input_uV, output_uV, |
| @@ -1791,7 +1837,7 @@ int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) | |||
| 1791 | ret = regulator_check_mode(rdev, mode); | 1837 | ret = regulator_check_mode(rdev, mode); |
| 1792 | if (ret < 0) { | 1838 | if (ret < 0) { |
| 1793 | printk(KERN_ERR "%s: failed to get optimum mode for %s @" | 1839 | printk(KERN_ERR "%s: failed to get optimum mode for %s @" |
| 1794 | " %d uA %d -> %d uV\n", __func__, rdev->desc->name, | 1840 | " %d uA %d -> %d uV\n", __func__, rdev_get_name(rdev), |
| 1795 | total_uA_load, input_uV, output_uV); | 1841 | total_uA_load, input_uV, output_uV); |
| 1796 | goto out; | 1842 | goto out; |
| 1797 | } | 1843 | } |
| @@ -1799,7 +1845,7 @@ int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) | |||
| 1799 | ret = rdev->desc->ops->set_mode(rdev, mode); | 1845 | ret = rdev->desc->ops->set_mode(rdev, mode); |
| 1800 | if (ret < 0) { | 1846 | if (ret < 0) { |
| 1801 | printk(KERN_ERR "%s: failed to set optimum mode %x for %s\n", | 1847 | printk(KERN_ERR "%s: failed to set optimum mode %x for %s\n", |
| 1802 | __func__, mode, rdev->desc->name); | 1848 | __func__, mode, rdev_get_name(rdev)); |
| 1803 | goto out; | 1849 | goto out; |
| 1804 | } | 1850 | } |
| 1805 | ret = mode; | 1851 | ret = mode; |
| @@ -1852,9 +1898,9 @@ static void _notifier_call_chain(struct regulator_dev *rdev, | |||
| 1852 | 1898 | ||
| 1853 | /* now notify regulator we supply */ | 1899 | /* now notify regulator we supply */ |
| 1854 | list_for_each_entry(_rdev, &rdev->supply_list, slist) { | 1900 | list_for_each_entry(_rdev, &rdev->supply_list, slist) { |
| 1855 | mutex_lock(&_rdev->mutex); | 1901 | mutex_lock(&_rdev->mutex); |
| 1856 | _notifier_call_chain(_rdev, event, data); | 1902 | _notifier_call_chain(_rdev, event, data); |
| 1857 | mutex_unlock(&_rdev->mutex); | 1903 | mutex_unlock(&_rdev->mutex); |
| 1858 | } | 1904 | } |
| 1859 | } | 1905 | } |
| 1860 | 1906 | ||
| @@ -1885,9 +1931,9 @@ int regulator_bulk_get(struct device *dev, int num_consumers, | |||
| 1885 | consumers[i].consumer = regulator_get(dev, | 1931 | consumers[i].consumer = regulator_get(dev, |
| 1886 | consumers[i].supply); | 1932 | consumers[i].supply); |
| 1887 | if (IS_ERR(consumers[i].consumer)) { | 1933 | if (IS_ERR(consumers[i].consumer)) { |
| 1888 | dev_err(dev, "Failed to get supply '%s'\n", | ||
| 1889 | consumers[i].supply); | ||
| 1890 | ret = PTR_ERR(consumers[i].consumer); | 1934 | ret = PTR_ERR(consumers[i].consumer); |
| 1935 | dev_err(dev, "Failed to get supply '%s': %d\n", | ||
| 1936 | consumers[i].supply, ret); | ||
| 1891 | consumers[i].consumer = NULL; | 1937 | consumers[i].consumer = NULL; |
| 1892 | goto err; | 1938 | goto err; |
| 1893 | } | 1939 | } |
| @@ -1930,8 +1976,8 @@ int regulator_bulk_enable(int num_consumers, | |||
| 1930 | return 0; | 1976 | return 0; |
| 1931 | 1977 | ||
| 1932 | err: | 1978 | err: |
| 1933 | printk(KERN_ERR "Failed to enable %s\n", consumers[i].supply); | 1979 | printk(KERN_ERR "Failed to enable %s: %d\n", consumers[i].supply, ret); |
| 1934 | for (i = 0; i < num_consumers; i++) | 1980 | for (--i; i >= 0; --i) |
| 1935 | regulator_disable(consumers[i].consumer); | 1981 | regulator_disable(consumers[i].consumer); |
| 1936 | 1982 | ||
| 1937 | return ret; | 1983 | return ret; |
| @@ -1965,8 +2011,9 @@ int regulator_bulk_disable(int num_consumers, | |||
| 1965 | return 0; | 2011 | return 0; |
| 1966 | 2012 | ||
| 1967 | err: | 2013 | err: |
| 1968 | printk(KERN_ERR "Failed to disable %s\n", consumers[i].supply); | 2014 | printk(KERN_ERR "Failed to disable %s: %d\n", consumers[i].supply, |
| 1969 | for (i = 0; i < num_consumers; i++) | 2015 | ret); |
| 2016 | for (--i; i >= 0; --i) | ||
| 1970 | regulator_enable(consumers[i].consumer); | 2017 | regulator_enable(consumers[i].consumer); |
| 1971 | 2018 | ||
| 1972 | return ret; | 2019 | return ret; |
| @@ -2316,7 +2363,7 @@ int regulator_suspend_prepare(suspend_state_t state) | |||
| 2316 | 2363 | ||
| 2317 | if (ret < 0) { | 2364 | if (ret < 0) { |
| 2318 | printk(KERN_ERR "%s: failed to prepare %s\n", | 2365 | printk(KERN_ERR "%s: failed to prepare %s\n", |
| 2319 | __func__, rdev->desc->name); | 2366 | __func__, rdev_get_name(rdev)); |
| 2320 | goto out; | 2367 | goto out; |
| 2321 | } | 2368 | } |
| 2322 | } | 2369 | } |
| @@ -2429,12 +2476,7 @@ static int __init regulator_init_complete(void) | |||
| 2429 | ops = rdev->desc->ops; | 2476 | ops = rdev->desc->ops; |
| 2430 | c = rdev->constraints; | 2477 | c = rdev->constraints; |
| 2431 | 2478 | ||
| 2432 | if (c && c->name) | 2479 | name = rdev_get_name(rdev); |
| 2433 | name = c->name; | ||
| 2434 | else if (rdev->desc->name) | ||
| 2435 | name = rdev->desc->name; | ||
| 2436 | else | ||
| 2437 | name = "regulator"; | ||
| 2438 | 2480 | ||
| 2439 | if (!ops->disable || (c && c->always_on)) | 2481 | if (!ops->disable || (c && c->always_on)) |
| 2440 | continue; | 2482 | continue; |
diff --git a/drivers/regulator/da903x.c b/drivers/regulator/da903x.c index aa224d936e0d..f8c4661a7a81 100644 --- a/drivers/regulator/da903x.c +++ b/drivers/regulator/da903x.c | |||
| @@ -331,7 +331,7 @@ static int da9034_get_ldo12_voltage(struct regulator_dev *rdev) | |||
| 331 | static int da9034_list_ldo12_voltage(struct regulator_dev *rdev, | 331 | static int da9034_list_ldo12_voltage(struct regulator_dev *rdev, |
| 332 | unsigned selector) | 332 | unsigned selector) |
| 333 | { | 333 | { |
| 334 | if (selector > ARRAY_SIZE(da9034_ldo12_data)) | 334 | if (selector >= ARRAY_SIZE(da9034_ldo12_data)) |
| 335 | return -EINVAL; | 335 | return -EINVAL; |
| 336 | return da9034_ldo12_data[selector] * 1000; | 336 | return da9034_ldo12_data[selector] * 1000; |
| 337 | } | 337 | } |
diff --git a/drivers/regulator/lp3971.c b/drivers/regulator/lp3971.c index 7803a320543b..76d08c282f9c 100644 --- a/drivers/regulator/lp3971.c +++ b/drivers/regulator/lp3971.c | |||
| @@ -446,8 +446,8 @@ static int setup_regulators(struct lp3971 *lp3971, | |||
| 446 | lp3971->rdev[i] = regulator_register(®ulators[id], | 446 | lp3971->rdev[i] = regulator_register(®ulators[id], |
| 447 | lp3971->dev, pdata->regulators[i].initdata, lp3971); | 447 | lp3971->dev, pdata->regulators[i].initdata, lp3971); |
| 448 | 448 | ||
| 449 | err = IS_ERR(lp3971->rdev[i]); | 449 | if (IS_ERR(lp3971->rdev[i])) { |
| 450 | if (err) { | 450 | err = PTR_ERR(lp3971->rdev[i]); |
| 451 | dev_err(lp3971->dev, "regulator init failed: %d\n", | 451 | dev_err(lp3971->dev, "regulator init failed: %d\n", |
| 452 | err); | 452 | err); |
| 453 | goto error; | 453 | goto error; |
diff --git a/drivers/regulator/max8660.c b/drivers/regulator/max8660.c new file mode 100644 index 000000000000..acc2fb7b6087 --- /dev/null +++ b/drivers/regulator/max8660.c | |||
| @@ -0,0 +1,510 @@ | |||
| 1 | /* | ||
| 2 | * max8660.c -- Voltage regulation for the Maxim 8660/8661 | ||
| 3 | * | ||
| 4 | * based on max1586.c and wm8400-regulator.c | ||
| 5 | * | ||
| 6 | * Copyright (C) 2009 Wolfram Sang, Pengutronix e.K. | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify it | ||
| 9 | * under the terms of the GNU General Public License as published by the Free | ||
| 10 | * Software Foundation; version 2 of the License. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
| 13 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 14 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 15 | * more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License along with | ||
| 18 | * this program; if not, write to the Free Software Foundation, Inc., 59 Temple | ||
| 19 | * Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 20 | * | ||
| 21 | * Some info: | ||
| 22 | * | ||
| 23 | * Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX8660-MAX8661.pdf | ||
| 24 | * | ||
| 25 | * This chip is a bit nasty because it is a write-only device. Thus, the driver | ||
| 26 | * uses shadow registers to keep track of its values. The main problem appears | ||
| 27 | * to be the initialization: When Linux boots up, we cannot know if the chip is | ||
| 28 | * in the default state or not, so we would have to pass such information in | ||
| 29 | * platform_data. As this adds a bit of complexity to the driver, this is left | ||
| 30 | * out for now until it is really needed. | ||
| 31 | * | ||
| 32 | * [A|S|M]DTV1 registers are currently not used, but [A|S|M]DTV2. | ||
| 33 | * | ||
| 34 | * If the driver is feature complete, it might be worth to check if one set of | ||
| 35 | * functions for V3-V7 is sufficient. For maximum flexibility during | ||
| 36 | * development, they are separated for now. | ||
| 37 | * | ||
| 38 | */ | ||
| 39 | |||
| 40 | #include <linux/module.h> | ||
| 41 | #include <linux/err.h> | ||
| 42 | #include <linux/i2c.h> | ||
| 43 | #include <linux/platform_device.h> | ||
| 44 | #include <linux/regulator/driver.h> | ||
| 45 | #include <linux/regulator/max8660.h> | ||
| 46 | |||
| 47 | #define MAX8660_DCDC_MIN_UV 725000 | ||
| 48 | #define MAX8660_DCDC_MAX_UV 1800000 | ||
| 49 | #define MAX8660_DCDC_STEP 25000 | ||
| 50 | #define MAX8660_DCDC_MAX_SEL 0x2b | ||
| 51 | |||
| 52 | #define MAX8660_LDO5_MIN_UV 1700000 | ||
| 53 | #define MAX8660_LDO5_MAX_UV 2000000 | ||
| 54 | #define MAX8660_LDO5_STEP 25000 | ||
| 55 | #define MAX8660_LDO5_MAX_SEL 0x0c | ||
| 56 | |||
| 57 | #define MAX8660_LDO67_MIN_UV 1800000 | ||
| 58 | #define MAX8660_LDO67_MAX_UV 3300000 | ||
| 59 | #define MAX8660_LDO67_STEP 100000 | ||
| 60 | #define MAX8660_LDO67_MAX_SEL 0x0f | ||
| 61 | |||
| 62 | enum { | ||
| 63 | MAX8660_OVER1, | ||
| 64 | MAX8660_OVER2, | ||
| 65 | MAX8660_VCC1, | ||
| 66 | MAX8660_ADTV1, | ||
| 67 | MAX8660_ADTV2, | ||
| 68 | MAX8660_SDTV1, | ||
| 69 | MAX8660_SDTV2, | ||
| 70 | MAX8660_MDTV1, | ||
| 71 | MAX8660_MDTV2, | ||
| 72 | MAX8660_L12VCR, | ||
| 73 | MAX8660_FPWM, | ||
| 74 | MAX8660_N_REGS, /* not a real register */ | ||
| 75 | }; | ||
| 76 | |||
| 77 | struct max8660 { | ||
| 78 | struct i2c_client *client; | ||
| 79 | u8 shadow_regs[MAX8660_N_REGS]; /* as chip is write only */ | ||
| 80 | struct regulator_dev *rdev[]; | ||
| 81 | }; | ||
| 82 | |||
| 83 | static int max8660_write(struct max8660 *max8660, u8 reg, u8 mask, u8 val) | ||
| 84 | { | ||
| 85 | static const u8 max8660_addresses[MAX8660_N_REGS] = | ||
| 86 | { 0x10, 0x12, 0x20, 0x23, 0x24, 0x29, 0x2a, 0x32, 0x33, 0x39, 0x80 }; | ||
| 87 | |||
| 88 | int ret; | ||
| 89 | u8 reg_val = (max8660->shadow_regs[reg] & mask) | val; | ||
| 90 | dev_vdbg(&max8660->client->dev, "Writing reg %02x with %02x\n", | ||
| 91 | max8660_addresses[reg], reg_val); | ||
| 92 | |||
| 93 | ret = i2c_smbus_write_byte_data(max8660->client, | ||
| 94 | max8660_addresses[reg], reg_val); | ||
| 95 | if (ret == 0) | ||
| 96 | max8660->shadow_regs[reg] = reg_val; | ||
| 97 | |||
| 98 | return ret; | ||
| 99 | } | ||
| 100 | |||
| 101 | |||
| 102 | /* | ||
| 103 | * DCDC functions | ||
| 104 | */ | ||
| 105 | |||
| 106 | static int max8660_dcdc_is_enabled(struct regulator_dev *rdev) | ||
| 107 | { | ||
| 108 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 109 | u8 val = max8660->shadow_regs[MAX8660_OVER1]; | ||
| 110 | u8 mask = (rdev_get_id(rdev) == MAX8660_V3) ? 1 : 4; | ||
| 111 | return !!(val & mask); | ||
| 112 | } | ||
| 113 | |||
| 114 | static int max8660_dcdc_enable(struct regulator_dev *rdev) | ||
| 115 | { | ||
| 116 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 117 | u8 bit = (rdev_get_id(rdev) == MAX8660_V3) ? 1 : 4; | ||
| 118 | return max8660_write(max8660, MAX8660_OVER1, 0xff, bit); | ||
| 119 | } | ||
| 120 | |||
| 121 | static int max8660_dcdc_disable(struct regulator_dev *rdev) | ||
| 122 | { | ||
| 123 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 124 | u8 mask = (rdev_get_id(rdev) == MAX8660_V3) ? ~1 : ~4; | ||
| 125 | return max8660_write(max8660, MAX8660_OVER1, mask, 0); | ||
| 126 | } | ||
| 127 | |||
| 128 | static int max8660_dcdc_list(struct regulator_dev *rdev, unsigned selector) | ||
| 129 | { | ||
| 130 | if (selector > MAX8660_DCDC_MAX_SEL) | ||
| 131 | return -EINVAL; | ||
| 132 | return MAX8660_DCDC_MIN_UV + selector * MAX8660_DCDC_STEP; | ||
| 133 | } | ||
| 134 | |||
| 135 | static int max8660_dcdc_get(struct regulator_dev *rdev) | ||
| 136 | { | ||
| 137 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 138 | u8 reg = (rdev_get_id(rdev) == MAX8660_V3) ? MAX8660_ADTV2 : MAX8660_SDTV2; | ||
| 139 | u8 selector = max8660->shadow_regs[reg]; | ||
| 140 | return MAX8660_DCDC_MIN_UV + selector * MAX8660_DCDC_STEP; | ||
| 141 | } | ||
| 142 | |||
| 143 | static int max8660_dcdc_set(struct regulator_dev *rdev, int min_uV, int max_uV) | ||
| 144 | { | ||
| 145 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 146 | u8 reg, selector, bits; | ||
| 147 | int ret; | ||
| 148 | |||
| 149 | if (min_uV < MAX8660_DCDC_MIN_UV || min_uV > MAX8660_DCDC_MAX_UV) | ||
| 150 | return -EINVAL; | ||
| 151 | if (max_uV < MAX8660_DCDC_MIN_UV || max_uV > MAX8660_DCDC_MAX_UV) | ||
| 152 | return -EINVAL; | ||
| 153 | |||
| 154 | selector = (min_uV - (MAX8660_DCDC_MIN_UV - MAX8660_DCDC_STEP + 1)) | ||
| 155 | / MAX8660_DCDC_STEP; | ||
| 156 | |||
| 157 | ret = max8660_dcdc_list(rdev, selector); | ||
| 158 | if (ret < 0 || ret > max_uV) | ||
| 159 | return -EINVAL; | ||
| 160 | |||
| 161 | reg = (rdev_get_id(rdev) == MAX8660_V3) ? MAX8660_ADTV2 : MAX8660_SDTV2; | ||
| 162 | ret = max8660_write(max8660, reg, 0, selector); | ||
| 163 | if (ret) | ||
| 164 | return ret; | ||
| 165 | |||
| 166 | /* Select target voltage register and activate regulation */ | ||
| 167 | bits = (rdev_get_id(rdev) == MAX8660_V3) ? 0x03 : 0x30; | ||
| 168 | return max8660_write(max8660, MAX8660_VCC1, 0xff, bits); | ||
| 169 | } | ||
| 170 | |||
| 171 | static struct regulator_ops max8660_dcdc_ops = { | ||
| 172 | .is_enabled = max8660_dcdc_is_enabled, | ||
| 173 | .list_voltage = max8660_dcdc_list, | ||
| 174 | .set_voltage = max8660_dcdc_set, | ||
| 175 | .get_voltage = max8660_dcdc_get, | ||
| 176 | }; | ||
| 177 | |||
| 178 | |||
| 179 | /* | ||
| 180 | * LDO5 functions | ||
| 181 | */ | ||
| 182 | |||
| 183 | static int max8660_ldo5_list(struct regulator_dev *rdev, unsigned selector) | ||
| 184 | { | ||
| 185 | if (selector > MAX8660_LDO5_MAX_SEL) | ||
| 186 | return -EINVAL; | ||
| 187 | return MAX8660_LDO5_MIN_UV + selector * MAX8660_LDO5_STEP; | ||
| 188 | } | ||
| 189 | |||
| 190 | static int max8660_ldo5_get(struct regulator_dev *rdev) | ||
| 191 | { | ||
| 192 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 193 | u8 selector = max8660->shadow_regs[MAX8660_MDTV2]; | ||
| 194 | |||
| 195 | return MAX8660_LDO5_MIN_UV + selector * MAX8660_LDO5_STEP; | ||
| 196 | } | ||
| 197 | |||
| 198 | static int max8660_ldo5_set(struct regulator_dev *rdev, int min_uV, int max_uV) | ||
| 199 | { | ||
| 200 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 201 | u8 selector; | ||
| 202 | int ret; | ||
| 203 | |||
| 204 | if (min_uV < MAX8660_LDO5_MIN_UV || min_uV > MAX8660_LDO5_MAX_UV) | ||
| 205 | return -EINVAL; | ||
| 206 | if (max_uV < MAX8660_LDO5_MIN_UV || max_uV > MAX8660_LDO5_MAX_UV) | ||
| 207 | return -EINVAL; | ||
| 208 | |||
| 209 | selector = (min_uV - (MAX8660_LDO5_MIN_UV - MAX8660_LDO5_STEP + 1)) | ||
| 210 | / MAX8660_LDO5_STEP; | ||
| 211 | ret = max8660_ldo5_list(rdev, selector); | ||
| 212 | if (ret < 0 || ret > max_uV) | ||
| 213 | return -EINVAL; | ||
| 214 | |||
| 215 | ret = max8660_write(max8660, MAX8660_MDTV2, 0, selector); | ||
| 216 | if (ret) | ||
| 217 | return ret; | ||
| 218 | |||
| 219 | /* Select target voltage register and activate regulation */ | ||
| 220 | return max8660_write(max8660, MAX8660_VCC1, 0xff, 0xc0); | ||
| 221 | } | ||
| 222 | |||
| 223 | static struct regulator_ops max8660_ldo5_ops = { | ||
| 224 | .list_voltage = max8660_ldo5_list, | ||
| 225 | .set_voltage = max8660_ldo5_set, | ||
| 226 | .get_voltage = max8660_ldo5_get, | ||
| 227 | }; | ||
| 228 | |||
| 229 | |||
| 230 | /* | ||
| 231 | * LDO67 functions | ||
| 232 | */ | ||
| 233 | |||
| 234 | static int max8660_ldo67_is_enabled(struct regulator_dev *rdev) | ||
| 235 | { | ||
| 236 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 237 | u8 val = max8660->shadow_regs[MAX8660_OVER2]; | ||
| 238 | u8 mask = (rdev_get_id(rdev) == MAX8660_V6) ? 2 : 4; | ||
| 239 | return !!(val & mask); | ||
| 240 | } | ||
| 241 | |||
| 242 | static int max8660_ldo67_enable(struct regulator_dev *rdev) | ||
| 243 | { | ||
| 244 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 245 | u8 bit = (rdev_get_id(rdev) == MAX8660_V6) ? 2 : 4; | ||
| 246 | return max8660_write(max8660, MAX8660_OVER2, 0xff, bit); | ||
| 247 | } | ||
| 248 | |||
| 249 | static int max8660_ldo67_disable(struct regulator_dev *rdev) | ||
| 250 | { | ||
| 251 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 252 | u8 mask = (rdev_get_id(rdev) == MAX8660_V6) ? ~2 : ~4; | ||
| 253 | return max8660_write(max8660, MAX8660_OVER2, mask, 0); | ||
| 254 | } | ||
| 255 | |||
| 256 | static int max8660_ldo67_list(struct regulator_dev *rdev, unsigned selector) | ||
| 257 | { | ||
| 258 | if (selector > MAX8660_LDO67_MAX_SEL) | ||
| 259 | return -EINVAL; | ||
| 260 | return MAX8660_LDO67_MIN_UV + selector * MAX8660_LDO67_STEP; | ||
| 261 | } | ||
| 262 | |||
| 263 | static int max8660_ldo67_get(struct regulator_dev *rdev) | ||
| 264 | { | ||
| 265 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 266 | u8 shift = (rdev_get_id(rdev) == MAX8660_V6) ? 0 : 4; | ||
| 267 | u8 selector = (max8660->shadow_regs[MAX8660_L12VCR] >> shift) & 0xf; | ||
| 268 | |||
| 269 | return MAX8660_LDO67_MIN_UV + selector * MAX8660_LDO67_STEP; | ||
| 270 | } | ||
| 271 | |||
| 272 | static int max8660_ldo67_set(struct regulator_dev *rdev, int min_uV, int max_uV) | ||
| 273 | { | ||
| 274 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | ||
| 275 | u8 selector; | ||
| 276 | int ret; | ||
| 277 | |||
| 278 | if (min_uV < MAX8660_LDO67_MIN_UV || min_uV > MAX8660_LDO67_MAX_UV) | ||
| 279 | return -EINVAL; | ||
| 280 | if (max_uV < MAX8660_LDO67_MIN_UV || max_uV > MAX8660_LDO67_MAX_UV) | ||
| 281 | return -EINVAL; | ||
| 282 | |||
| 283 | selector = (min_uV - (MAX8660_LDO67_MIN_UV - MAX8660_LDO67_STEP + 1)) | ||
| 284 | / MAX8660_LDO67_STEP; | ||
| 285 | |||
| 286 | ret = max8660_ldo67_list(rdev, selector); | ||
| 287 | if (ret < 0 || ret > max_uV) | ||
| 288 | return -EINVAL; | ||
| 289 | |||
| 290 | if (rdev_get_id(rdev) == MAX8660_V6) | ||
| 291 | return max8660_write(max8660, MAX8660_L12VCR, 0xf0, selector); | ||
| 292 | else | ||
| 293 | return max8660_write(max8660, MAX8660_L12VCR, 0x0f, selector << 4); | ||
| 294 | } | ||
| 295 | |||
| 296 | static struct regulator_ops max8660_ldo67_ops = { | ||
| 297 | .is_enabled = max8660_ldo67_is_enabled, | ||
| 298 | .enable = max8660_ldo67_enable, | ||
| 299 | .disable = max8660_ldo67_disable, | ||
| 300 | .list_voltage = max8660_ldo67_list, | ||
| 301 | .get_voltage = max8660_ldo67_get, | ||
| 302 | .set_voltage = max8660_ldo67_set, | ||
| 303 | }; | ||
| 304 | |||
| 305 | static struct regulator_desc max8660_reg[] = { | ||
| 306 | { | ||
| 307 | .name = "V3(DCDC)", | ||
| 308 | .id = MAX8660_V3, | ||
| 309 | .ops = &max8660_dcdc_ops, | ||
| 310 | .type = REGULATOR_VOLTAGE, | ||
| 311 | .n_voltages = MAX8660_DCDC_MAX_SEL + 1, | ||
| 312 | .owner = THIS_MODULE, | ||
| 313 | }, | ||
| 314 | { | ||
| 315 | .name = "V4(DCDC)", | ||
| 316 | .id = MAX8660_V4, | ||
| 317 | .ops = &max8660_dcdc_ops, | ||
| 318 | .type = REGULATOR_VOLTAGE, | ||
| 319 | .n_voltages = MAX8660_DCDC_MAX_SEL + 1, | ||
| 320 | .owner = THIS_MODULE, | ||
| 321 | }, | ||
| 322 | { | ||
| 323 | .name = "V5(LDO)", | ||
| 324 | .id = MAX8660_V5, | ||
| 325 | .ops = &max8660_ldo5_ops, | ||
| 326 | .type = REGULATOR_VOLTAGE, | ||
| 327 | .n_voltages = MAX8660_LDO5_MAX_SEL + 1, | ||
| 328 | .owner = THIS_MODULE, | ||
| 329 | }, | ||
| 330 | { | ||
| 331 | .name = "V6(LDO)", | ||
| 332 | .id = MAX8660_V6, | ||
| 333 | .ops = &max8660_ldo67_ops, | ||
| 334 | .type = REGULATOR_VOLTAGE, | ||
| 335 | .n_voltages = MAX8660_LDO67_MAX_SEL + 1, | ||
| 336 | .owner = THIS_MODULE, | ||
| 337 | }, | ||
| 338 | { | ||
| 339 | .name = "V7(LDO)", | ||
| 340 | .id = MAX8660_V7, | ||
| 341 | .ops = &max8660_ldo67_ops, | ||
| 342 | .type = REGULATOR_VOLTAGE, | ||
| 343 | .n_voltages = MAX8660_LDO67_MAX_SEL + 1, | ||
| 344 | .owner = THIS_MODULE, | ||
| 345 | }, | ||
| 346 | }; | ||
| 347 | |||
| 348 | static int max8660_probe(struct i2c_client *client, | ||
| 349 | const struct i2c_device_id *i2c_id) | ||
| 350 | { | ||
| 351 | struct regulator_dev **rdev; | ||
| 352 | struct max8660_platform_data *pdata = client->dev.platform_data; | ||
| 353 | struct max8660 *max8660; | ||
| 354 | int boot_on, i, id, ret = -EINVAL; | ||
| 355 | |||
| 356 | if (pdata->num_subdevs > MAX8660_V_END) { | ||
| 357 | dev_err(&client->dev, "Too much regulators found!\n"); | ||
| 358 | goto out; | ||
| 359 | } | ||
| 360 | |||
| 361 | max8660 = kzalloc(sizeof(struct max8660) + | ||
| 362 | sizeof(struct regulator_dev *) * MAX8660_V_END, | ||
| 363 | GFP_KERNEL); | ||
| 364 | if (!max8660) { | ||
| 365 | ret = -ENOMEM; | ||
| 366 | goto out; | ||
| 367 | } | ||
| 368 | |||
| 369 | max8660->client = client; | ||
| 370 | rdev = max8660->rdev; | ||
| 371 | |||
| 372 | if (pdata->en34_is_high) { | ||
| 373 | /* Simulate always on */ | ||
| 374 | max8660->shadow_regs[MAX8660_OVER1] = 5; | ||
| 375 | } else { | ||
| 376 | /* Otherwise devices can be toggled via software */ | ||
| 377 | max8660_dcdc_ops.enable = max8660_dcdc_enable; | ||
| 378 | max8660_dcdc_ops.disable = max8660_dcdc_disable; | ||
| 379 | } | ||
| 380 | |||
| 381 | /* | ||
| 382 | * First, set up shadow registers to prevent glitches. As some | ||
| 383 | * registers are shared between regulators, everything must be properly | ||
| 384 | * set up for all regulators in advance. | ||
| 385 | */ | ||
| 386 | max8660->shadow_regs[MAX8660_ADTV1] = | ||
| 387 | max8660->shadow_regs[MAX8660_ADTV2] = | ||
| 388 | max8660->shadow_regs[MAX8660_SDTV1] = | ||
| 389 | max8660->shadow_regs[MAX8660_SDTV2] = 0x1b; | ||
| 390 | max8660->shadow_regs[MAX8660_MDTV1] = | ||
| 391 | max8660->shadow_regs[MAX8660_MDTV2] = 0x04; | ||
| 392 | |||
| 393 | for (i = 0; i < pdata->num_subdevs; i++) { | ||
| 394 | |||
| 395 | if (!pdata->subdevs[i].platform_data) | ||
| 396 | goto err_free; | ||
| 397 | |||
| 398 | boot_on = pdata->subdevs[i].platform_data->constraints.boot_on; | ||
| 399 | |||
| 400 | switch (pdata->subdevs[i].id) { | ||
| 401 | case MAX8660_V3: | ||
| 402 | if (boot_on) | ||
| 403 | max8660->shadow_regs[MAX8660_OVER1] |= 1; | ||
| 404 | break; | ||
| 405 | |||
| 406 | case MAX8660_V4: | ||
| 407 | if (boot_on) | ||
| 408 | max8660->shadow_regs[MAX8660_OVER1] |= 4; | ||
| 409 | break; | ||
| 410 | |||
| 411 | case MAX8660_V5: | ||
| 412 | break; | ||
| 413 | |||
| 414 | case MAX8660_V6: | ||
| 415 | if (boot_on) | ||
| 416 | max8660->shadow_regs[MAX8660_OVER2] |= 2; | ||
| 417 | break; | ||
| 418 | |||
| 419 | case MAX8660_V7: | ||
| 420 | if (!strcmp(i2c_id->name, "max8661")) { | ||
| 421 | dev_err(&client->dev, "Regulator not on this chip!\n"); | ||
| 422 | goto err_free; | ||
| 423 | } | ||
| 424 | |||
| 425 | if (boot_on) | ||
| 426 | max8660->shadow_regs[MAX8660_OVER2] |= 4; | ||
| 427 | break; | ||
| 428 | |||
| 429 | default: | ||
| 430 | dev_err(&client->dev, "invalid regulator %s\n", | ||
| 431 | pdata->subdevs[i].name); | ||
| 432 | goto err_free; | ||
| 433 | } | ||
| 434 | } | ||
| 435 | |||
| 436 | /* Finally register devices */ | ||
| 437 | for (i = 0; i < pdata->num_subdevs; i++) { | ||
| 438 | |||
| 439 | id = pdata->subdevs[i].id; | ||
| 440 | |||
| 441 | rdev[i] = regulator_register(&max8660_reg[id], &client->dev, | ||
| 442 | pdata->subdevs[i].platform_data, | ||
| 443 | max8660); | ||
| 444 | if (IS_ERR(rdev[i])) { | ||
| 445 | ret = PTR_ERR(rdev[i]); | ||
| 446 | dev_err(&client->dev, "failed to register %s\n", | ||
| 447 | max8660_reg[id].name); | ||
| 448 | goto err_unregister; | ||
| 449 | } | ||
| 450 | } | ||
| 451 | |||
| 452 | i2c_set_clientdata(client, rdev); | ||
| 453 | dev_info(&client->dev, "Maxim 8660/8661 regulator driver loaded\n"); | ||
| 454 | return 0; | ||
| 455 | |||
| 456 | err_unregister: | ||
| 457 | while (--i >= 0) | ||
| 458 | regulator_unregister(rdev[i]); | ||
| 459 | err_free: | ||
| 460 | kfree(max8660); | ||
| 461 | out: | ||
| 462 | return ret; | ||
| 463 | } | ||
| 464 | |||
| 465 | static int max8660_remove(struct i2c_client *client) | ||
| 466 | { | ||
| 467 | struct regulator_dev **rdev = i2c_get_clientdata(client); | ||
| 468 | int i; | ||
| 469 | |||
| 470 | for (i = 0; i < MAX8660_V_END; i++) | ||
| 471 | if (rdev[i]) | ||
| 472 | regulator_unregister(rdev[i]); | ||
| 473 | kfree(rdev); | ||
| 474 | i2c_set_clientdata(client, NULL); | ||
| 475 | |||
| 476 | return 0; | ||
| 477 | } | ||
| 478 | |||
| 479 | static const struct i2c_device_id max8660_id[] = { | ||
| 480 | { "max8660", 0 }, | ||
| 481 | { "max8661", 0 }, | ||
| 482 | { } | ||
| 483 | }; | ||
| 484 | MODULE_DEVICE_TABLE(i2c, max8660_id); | ||
| 485 | |||
| 486 | static struct i2c_driver max8660_driver = { | ||
| 487 | .probe = max8660_probe, | ||
| 488 | .remove = max8660_remove, | ||
| 489 | .driver = { | ||
| 490 | .name = "max8660", | ||
| 491 | }, | ||
| 492 | .id_table = max8660_id, | ||
| 493 | }; | ||
| 494 | |||
| 495 | static int __init max8660_init(void) | ||
| 496 | { | ||
| 497 | return i2c_add_driver(&max8660_driver); | ||
| 498 | } | ||
| 499 | subsys_initcall(max8660_init); | ||
| 500 | |||
| 501 | static void __exit max8660_exit(void) | ||
| 502 | { | ||
| 503 | i2c_del_driver(&max8660_driver); | ||
| 504 | } | ||
| 505 | module_exit(max8660_exit); | ||
| 506 | |||
| 507 | /* Module information */ | ||
| 508 | MODULE_DESCRIPTION("MAXIM 8660/8661 voltage regulator driver"); | ||
| 509 | MODULE_AUTHOR("Wolfram Sang"); | ||
| 510 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/regulator/mc13783-regulator.c b/drivers/regulator/mc13783-regulator.c new file mode 100644 index 000000000000..39c495300045 --- /dev/null +++ b/drivers/regulator/mc13783-regulator.c | |||
| @@ -0,0 +1,245 @@ | |||
| 1 | /* | ||
| 2 | * Regulator Driver for Freescale MC13783 PMIC | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/mfd/mc13783.h> | ||
| 12 | #include <linux/regulator/machine.h> | ||
| 13 | #include <linux/regulator/driver.h> | ||
| 14 | #include <linux/platform_device.h> | ||
| 15 | #include <linux/kernel.h> | ||
| 16 | #include <linux/init.h> | ||
| 17 | #include <linux/err.h> | ||
| 18 | |||
| 19 | #define MC13783_REG_SWITCHERS4 28 | ||
| 20 | #define MC13783_REG_SWITCHERS4_PLLEN (1 << 18) | ||
| 21 | |||
| 22 | #define MC13783_REG_SWITCHERS5 29 | ||
| 23 | #define MC13783_REG_SWITCHERS5_SW3EN (1 << 20) | ||
| 24 | |||
| 25 | #define MC13783_REG_REGULATORMODE0 32 | ||
| 26 | #define MC13783_REG_REGULATORMODE0_VAUDIOEN (1 << 0) | ||
| 27 | #define MC13783_REG_REGULATORMODE0_VIOHIEN (1 << 3) | ||
| 28 | #define MC13783_REG_REGULATORMODE0_VIOLOEN (1 << 6) | ||
| 29 | #define MC13783_REG_REGULATORMODE0_VDIGEN (1 << 9) | ||
| 30 | #define MC13783_REG_REGULATORMODE0_VGENEN (1 << 12) | ||
| 31 | #define MC13783_REG_REGULATORMODE0_VRFDIGEN (1 << 15) | ||
| 32 | #define MC13783_REG_REGULATORMODE0_VRFREFEN (1 << 18) | ||
| 33 | #define MC13783_REG_REGULATORMODE0_VRFCPEN (1 << 21) | ||
| 34 | |||
| 35 | #define MC13783_REG_REGULATORMODE1 33 | ||
| 36 | #define MC13783_REG_REGULATORMODE1_VSIMEN (1 << 0) | ||
| 37 | #define MC13783_REG_REGULATORMODE1_VESIMEN (1 << 3) | ||
| 38 | #define MC13783_REG_REGULATORMODE1_VCAMEN (1 << 6) | ||
| 39 | #define MC13783_REG_REGULATORMODE1_VRFBGEN (1 << 9) | ||
| 40 | #define MC13783_REG_REGULATORMODE1_VVIBEN (1 << 11) | ||
| 41 | #define MC13783_REG_REGULATORMODE1_VRF1EN (1 << 12) | ||
| 42 | #define MC13783_REG_REGULATORMODE1_VRF2EN (1 << 15) | ||
| 43 | #define MC13783_REG_REGULATORMODE1_VMMC1EN (1 << 18) | ||
| 44 | #define MC13783_REG_REGULATORMODE1_VMMC2EN (1 << 21) | ||
| 45 | |||
| 46 | #define MC13783_REG_POWERMISC 34 | ||
| 47 | #define MC13783_REG_POWERMISC_GPO1EN (1 << 6) | ||
| 48 | #define MC13783_REG_POWERMISC_GPO2EN (1 << 8) | ||
| 49 | #define MC13783_REG_POWERMISC_GPO3EN (1 << 10) | ||
| 50 | #define MC13783_REG_POWERMISC_GPO4EN (1 << 12) | ||
| 51 | |||
| 52 | struct mc13783_regulator { | ||
| 53 | struct regulator_desc desc; | ||
| 54 | int reg; | ||
| 55 | int enable_bit; | ||
| 56 | }; | ||
| 57 | |||
| 58 | static struct regulator_ops mc13783_regulator_ops; | ||
| 59 | |||
| 60 | #define MC13783_DEFINE(prefix, _name, _reg) \ | ||
| 61 | [MC13783_ ## prefix ## _ ## _name] = { \ | ||
| 62 | .desc = { \ | ||
| 63 | .name = #prefix "_" #_name, \ | ||
| 64 | .ops = &mc13783_regulator_ops, \ | ||
| 65 | .type = REGULATOR_VOLTAGE, \ | ||
| 66 | .id = MC13783_ ## prefix ## _ ## _name, \ | ||
| 67 | .owner = THIS_MODULE, \ | ||
| 68 | }, \ | ||
| 69 | .reg = MC13783_REG_ ## _reg, \ | ||
| 70 | .enable_bit = MC13783_REG_ ## _reg ## _ ## _name ## EN, \ | ||
| 71 | } | ||
| 72 | |||
| 73 | #define MC13783_DEFINE_SW(_name, _reg) MC13783_DEFINE(SW, _name, _reg) | ||
| 74 | #define MC13783_DEFINE_REGU(_name, _reg) MC13783_DEFINE(REGU, _name, _reg) | ||
| 75 | |||
| 76 | static struct mc13783_regulator mc13783_regulators[] = { | ||
| 77 | MC13783_DEFINE_SW(SW3, SWITCHERS5), | ||
| 78 | MC13783_DEFINE_SW(PLL, SWITCHERS4), | ||
| 79 | |||
| 80 | MC13783_DEFINE_REGU(VAUDIO, REGULATORMODE0), | ||
| 81 | MC13783_DEFINE_REGU(VIOHI, REGULATORMODE0), | ||
| 82 | MC13783_DEFINE_REGU(VIOLO, REGULATORMODE0), | ||
| 83 | MC13783_DEFINE_REGU(VDIG, REGULATORMODE0), | ||
| 84 | MC13783_DEFINE_REGU(VGEN, REGULATORMODE0), | ||
| 85 | MC13783_DEFINE_REGU(VRFDIG, REGULATORMODE0), | ||
| 86 | MC13783_DEFINE_REGU(VRFREF, REGULATORMODE0), | ||
| 87 | MC13783_DEFINE_REGU(VRFCP, REGULATORMODE0), | ||
| 88 | MC13783_DEFINE_REGU(VSIM, REGULATORMODE1), | ||
| 89 | MC13783_DEFINE_REGU(VESIM, REGULATORMODE1), | ||
| 90 | MC13783_DEFINE_REGU(VCAM, REGULATORMODE1), | ||
| 91 | MC13783_DEFINE_REGU(VRFBG, REGULATORMODE1), | ||
| 92 | MC13783_DEFINE_REGU(VVIB, REGULATORMODE1), | ||
| 93 | MC13783_DEFINE_REGU(VRF1, REGULATORMODE1), | ||
| 94 | MC13783_DEFINE_REGU(VRF2, REGULATORMODE1), | ||
| 95 | MC13783_DEFINE_REGU(VMMC1, REGULATORMODE1), | ||
| 96 | MC13783_DEFINE_REGU(VMMC2, REGULATORMODE1), | ||
| 97 | MC13783_DEFINE_REGU(GPO1, POWERMISC), | ||
| 98 | MC13783_DEFINE_REGU(GPO2, POWERMISC), | ||
| 99 | MC13783_DEFINE_REGU(GPO3, POWERMISC), | ||
| 100 | MC13783_DEFINE_REGU(GPO4, POWERMISC), | ||
| 101 | }; | ||
| 102 | |||
| 103 | struct mc13783_regulator_priv { | ||
| 104 | struct mc13783 *mc13783; | ||
| 105 | struct regulator_dev *regulators[]; | ||
| 106 | }; | ||
| 107 | |||
| 108 | static int mc13783_regulator_enable(struct regulator_dev *rdev) | ||
| 109 | { | ||
| 110 | struct mc13783_regulator_priv *priv = rdev_get_drvdata(rdev); | ||
| 111 | int id = rdev_get_id(rdev); | ||
| 112 | int ret; | ||
| 113 | |||
| 114 | dev_dbg(rdev_get_dev(rdev), "%s id: %d\n", __func__, id); | ||
| 115 | |||
| 116 | mc13783_lock(priv->mc13783); | ||
| 117 | ret = mc13783_reg_rmw(priv->mc13783, mc13783_regulators[id].reg, | ||
| 118 | mc13783_regulators[id].enable_bit, | ||
| 119 | mc13783_regulators[id].enable_bit); | ||
| 120 | mc13783_unlock(priv->mc13783); | ||
| 121 | |||
| 122 | return ret; | ||
| 123 | } | ||
| 124 | |||
| 125 | static int mc13783_regulator_disable(struct regulator_dev *rdev) | ||
| 126 | { | ||
| 127 | struct mc13783_regulator_priv *priv = rdev_get_drvdata(rdev); | ||
| 128 | int id = rdev_get_id(rdev); | ||
| 129 | int ret; | ||
| 130 | |||
| 131 | dev_dbg(rdev_get_dev(rdev), "%s id: %d\n", __func__, id); | ||
| 132 | |||
| 133 | mc13783_lock(priv->mc13783); | ||
| 134 | ret = mc13783_reg_rmw(priv->mc13783, mc13783_regulators[id].reg, | ||
| 135 | mc13783_regulators[id].enable_bit, 0); | ||
| 136 | mc13783_unlock(priv->mc13783); | ||
| 137 | |||
| 138 | return ret; | ||
| 139 | } | ||
| 140 | |||
| 141 | static int mc13783_regulator_is_enabled(struct regulator_dev *rdev) | ||
| 142 | { | ||
| 143 | struct mc13783_regulator_priv *priv = rdev_get_drvdata(rdev); | ||
| 144 | int ret, id = rdev_get_id(rdev); | ||
| 145 | unsigned int val; | ||
| 146 | |||
| 147 | mc13783_lock(priv->mc13783); | ||
| 148 | ret = mc13783_reg_read(priv->mc13783, mc13783_regulators[id].reg, &val); | ||
| 149 | mc13783_unlock(priv->mc13783); | ||
| 150 | |||
| 151 | if (ret) | ||
| 152 | return ret; | ||
| 153 | |||
| 154 | return (val & mc13783_regulators[id].enable_bit) != 0; | ||
| 155 | } | ||
| 156 | |||
| 157 | static struct regulator_ops mc13783_regulator_ops = { | ||
| 158 | .enable = mc13783_regulator_enable, | ||
| 159 | .disable = mc13783_regulator_disable, | ||
| 160 | .is_enabled = mc13783_regulator_is_enabled, | ||
| 161 | }; | ||
| 162 | |||
| 163 | static int __devinit mc13783_regulator_probe(struct platform_device *pdev) | ||
| 164 | { | ||
| 165 | struct mc13783_regulator_priv *priv; | ||
| 166 | struct mc13783 *mc13783 = dev_get_drvdata(pdev->dev.parent); | ||
| 167 | struct mc13783_regulator_platform_data *pdata = | ||
| 168 | dev_get_platdata(&pdev->dev); | ||
| 169 | struct mc13783_regulator_init_data *init_data; | ||
| 170 | int i, ret; | ||
| 171 | |||
| 172 | dev_dbg(&pdev->dev, "mc13783_regulator_probe id %d\n", pdev->id); | ||
| 173 | |||
| 174 | priv = kzalloc(sizeof(*priv) + | ||
| 175 | pdata->num_regulators * sizeof(priv->regulators[0]), | ||
| 176 | GFP_KERNEL); | ||
| 177 | if (!priv) | ||
| 178 | return -ENOMEM; | ||
| 179 | |||
| 180 | priv->mc13783 = mc13783; | ||
| 181 | |||
| 182 | for (i = 0; i < pdata->num_regulators; i++) { | ||
| 183 | init_data = &pdata->regulators[i]; | ||
| 184 | priv->regulators[i] = regulator_register( | ||
| 185 | &mc13783_regulators[init_data->id].desc, | ||
| 186 | &pdev->dev, init_data->init_data, priv); | ||
| 187 | |||
| 188 | if (IS_ERR(priv->regulators[i])) { | ||
| 189 | dev_err(&pdev->dev, "failed to register regulator %s\n", | ||
| 190 | mc13783_regulators[i].desc.name); | ||
| 191 | ret = PTR_ERR(priv->regulators[i]); | ||
| 192 | goto err; | ||
| 193 | } | ||
| 194 | } | ||
| 195 | |||
| 196 | platform_set_drvdata(pdev, priv); | ||
| 197 | |||
| 198 | return 0; | ||
| 199 | err: | ||
| 200 | while (--i >= 0) | ||
| 201 | regulator_unregister(priv->regulators[i]); | ||
| 202 | |||
| 203 | kfree(priv); | ||
| 204 | |||
| 205 | return ret; | ||
| 206 | } | ||
| 207 | |||
| 208 | static int __devexit mc13783_regulator_remove(struct platform_device *pdev) | ||
| 209 | { | ||
| 210 | struct mc13783_regulator_priv *priv = platform_get_drvdata(pdev); | ||
| 211 | struct mc13783_regulator_platform_data *pdata = | ||
| 212 | dev_get_platdata(&pdev->dev); | ||
| 213 | int i; | ||
| 214 | |||
| 215 | for (i = 0; i < pdata->num_regulators; i++) | ||
| 216 | regulator_unregister(priv->regulators[i]); | ||
| 217 | |||
| 218 | return 0; | ||
| 219 | } | ||
| 220 | |||
| 221 | static struct platform_driver mc13783_regulator_driver = { | ||
| 222 | .driver = { | ||
| 223 | .name = "mc13783-regulator", | ||
| 224 | .owner = THIS_MODULE, | ||
| 225 | }, | ||
| 226 | .remove = __devexit_p(mc13783_regulator_remove), | ||
| 227 | .probe = mc13783_regulator_probe, | ||
| 228 | }; | ||
| 229 | |||
| 230 | static int __init mc13783_regulator_init(void) | ||
| 231 | { | ||
| 232 | return platform_driver_register(&mc13783_regulator_driver); | ||
| 233 | } | ||
| 234 | subsys_initcall(mc13783_regulator_init); | ||
| 235 | |||
| 236 | static void __exit mc13783_regulator_exit(void) | ||
| 237 | { | ||
| 238 | platform_driver_unregister(&mc13783_regulator_driver); | ||
| 239 | } | ||
| 240 | module_exit(mc13783_regulator_exit); | ||
| 241 | |||
| 242 | MODULE_LICENSE("GPL v2"); | ||
| 243 | MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de"); | ||
| 244 | MODULE_DESCRIPTION("Regulator Driver for Freescale MC13783 PMIC"); | ||
| 245 | MODULE_ALIAS("platform:mc13783-regulator"); | ||
diff --git a/drivers/regulator/mc13783.c b/drivers/regulator/mc13783.c deleted file mode 100644 index 710211f67449..000000000000 --- a/drivers/regulator/mc13783.c +++ /dev/null | |||
| @@ -1,410 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Regulator Driver for Freescale MC13783 PMIC | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/mfd/mc13783-private.h> | ||
| 12 | #include <linux/regulator/machine.h> | ||
| 13 | #include <linux/regulator/driver.h> | ||
| 14 | #include <linux/platform_device.h> | ||
| 15 | #include <linux/mfd/mc13783.h> | ||
| 16 | #include <linux/kernel.h> | ||
| 17 | #include <linux/init.h> | ||
| 18 | #include <linux/err.h> | ||
| 19 | |||
| 20 | struct mc13783_regulator { | ||
| 21 | struct regulator_desc desc; | ||
| 22 | int reg; | ||
| 23 | int enable_bit; | ||
| 24 | }; | ||
| 25 | |||
| 26 | static struct regulator_ops mc13783_regulator_ops; | ||
| 27 | |||
| 28 | static struct mc13783_regulator mc13783_regulators[] = { | ||
| 29 | [MC13783_SW_SW3] = { | ||
| 30 | .desc = { | ||
| 31 | .name = "SW_SW3", | ||
| 32 | .ops = &mc13783_regulator_ops, | ||
| 33 | .type = REGULATOR_VOLTAGE, | ||
| 34 | .id = MC13783_SW_SW3, | ||
| 35 | .owner = THIS_MODULE, | ||
| 36 | }, | ||
| 37 | .reg = MC13783_REG_SWITCHERS_5, | ||
| 38 | .enable_bit = MC13783_SWCTRL_SW3_EN, | ||
| 39 | }, | ||
| 40 | [MC13783_SW_PLL] = { | ||
| 41 | .desc = { | ||
| 42 | .name = "SW_PLL", | ||
| 43 | .ops = &mc13783_regulator_ops, | ||
| 44 | .type = REGULATOR_VOLTAGE, | ||
| 45 | .id = MC13783_SW_PLL, | ||
| 46 | .owner = THIS_MODULE, | ||
| 47 | }, | ||
| 48 | .reg = MC13783_REG_SWITCHERS_4, | ||
| 49 | .enable_bit = MC13783_SWCTRL_PLL_EN, | ||
| 50 | }, | ||
| 51 | [MC13783_REGU_VAUDIO] = { | ||
| 52 | .desc = { | ||
| 53 | .name = "REGU_VAUDIO", | ||
| 54 | .ops = &mc13783_regulator_ops, | ||
| 55 | .type = REGULATOR_VOLTAGE, | ||
| 56 | .id = MC13783_REGU_VAUDIO, | ||
| 57 | .owner = THIS_MODULE, | ||
| 58 | }, | ||
| 59 | .reg = MC13783_REG_REGULATOR_MODE_0, | ||
| 60 | .enable_bit = MC13783_REGCTRL_VAUDIO_EN, | ||
| 61 | }, | ||
| 62 | [MC13783_REGU_VIOHI] = { | ||
| 63 | .desc = { | ||
| 64 | .name = "REGU_VIOHI", | ||
| 65 | .ops = &mc13783_regulator_ops, | ||
| 66 | .type = REGULATOR_VOLTAGE, | ||
| 67 | .id = MC13783_REGU_VIOHI, | ||
| 68 | .owner = THIS_MODULE, | ||
| 69 | }, | ||
| 70 | .reg = MC13783_REG_REGULATOR_MODE_0, | ||
| 71 | .enable_bit = MC13783_REGCTRL_VIOHI_EN, | ||
| 72 | }, | ||
| 73 | [MC13783_REGU_VIOLO] = { | ||
| 74 | .desc = { | ||
| 75 | .name = "REGU_VIOLO", | ||
| 76 | .ops = &mc13783_regulator_ops, | ||
| 77 | .type = REGULATOR_VOLTAGE, | ||
| 78 | .id = MC13783_REGU_VIOLO, | ||
| 79 | .owner = THIS_MODULE, | ||
| 80 | }, | ||
| 81 | .reg = MC13783_REG_REGULATOR_MODE_0, | ||
| 82 | .enable_bit = MC13783_REGCTRL_VIOLO_EN, | ||
| 83 | }, | ||
| 84 | [MC13783_REGU_VDIG] = { | ||
| 85 | .desc = { | ||
| 86 | .name = "REGU_VDIG", | ||
| 87 | .ops = &mc13783_regulator_ops, | ||
| 88 | .type = REGULATOR_VOLTAGE, | ||
| 89 | .id = MC13783_REGU_VDIG, | ||
| 90 | .owner = THIS_MODULE, | ||
| 91 | }, | ||
| 92 | .reg = MC13783_REG_REGULATOR_MODE_0, | ||
| 93 | .enable_bit = MC13783_REGCTRL_VDIG_EN, | ||
| 94 | }, | ||
| 95 | [MC13783_REGU_VGEN] = { | ||
| 96 | .desc = { | ||
| 97 | .name = "REGU_VGEN", | ||
| 98 | .ops = &mc13783_regulator_ops, | ||
| 99 | .type = REGULATOR_VOLTAGE, | ||
| 100 | .id = MC13783_REGU_VGEN, | ||
| 101 | .owner = THIS_MODULE, | ||
| 102 | }, | ||
| 103 | .reg = MC13783_REG_REGULATOR_MODE_0, | ||
| 104 | .enable_bit = MC13783_REGCTRL_VGEN_EN, | ||
| 105 | }, | ||
| 106 | [MC13783_REGU_VRFDIG] = { | ||
| 107 | .desc = { | ||
| 108 | .name = "REGU_VRFDIG", | ||
| 109 | .ops = &mc13783_regulator_ops, | ||
| 110 | .type = REGULATOR_VOLTAGE, | ||
| 111 | .id = MC13783_REGU_VRFDIG, | ||
| 112 | .owner = THIS_MODULE, | ||
| 113 | }, | ||
| 114 | .reg = MC13783_REG_REGULATOR_MODE_0, | ||
| 115 | .enable_bit = MC13783_REGCTRL_VRFDIG_EN, | ||
| 116 | }, | ||
| 117 | [MC13783_REGU_VRFREF] = { | ||
| 118 | .desc = { | ||
| 119 | .name = "REGU_VRFREF", | ||
| 120 | .ops = &mc13783_regulator_ops, | ||
| 121 | .type = REGULATOR_VOLTAGE, | ||
| 122 | .id = MC13783_REGU_VRFREF, | ||
| 123 | .owner = THIS_MODULE, | ||
| 124 | }, | ||
| 125 | .reg = MC13783_REG_REGULATOR_MODE_0, | ||
| 126 | .enable_bit = MC13783_REGCTRL_VRFREF_EN, | ||
| 127 | }, | ||
| 128 | [MC13783_REGU_VRFCP] = { | ||
| 129 | .desc = { | ||
| 130 | .name = "REGU_VRFCP", | ||
| 131 | .ops = &mc13783_regulator_ops, | ||
| 132 | .type = REGULATOR_VOLTAGE, | ||
| 133 | .id = MC13783_REGU_VRFCP, | ||
| 134 | .owner = THIS_MODULE, | ||
| 135 | }, | ||
| 136 | .reg = MC13783_REG_REGULATOR_MODE_0, | ||
| 137 | .enable_bit = MC13783_REGCTRL_VRFCP_EN, | ||
| 138 | }, | ||
| 139 | [MC13783_REGU_VSIM] = { | ||
| 140 | .desc = { | ||
| 141 | .name = "REGU_VSIM", | ||
| 142 | .ops = &mc13783_regulator_ops, | ||
| 143 | .type = REGULATOR_VOLTAGE, | ||
| 144 | .id = MC13783_REGU_VSIM, | ||
| 145 | .owner = THIS_MODULE, | ||
| 146 | }, | ||
| 147 | .reg = MC13783_REG_REGULATOR_MODE_1, | ||
| 148 | .enable_bit = MC13783_REGCTRL_VSIM_EN, | ||
| 149 | }, | ||
| 150 | [MC13783_REGU_VESIM] = { | ||
| 151 | .desc = { | ||
| 152 | .name = "REGU_VESIM", | ||
| 153 | .ops = &mc13783_regulator_ops, | ||
| 154 | .type = REGULATOR_VOLTAGE, | ||
| 155 | .id = MC13783_REGU_VESIM, | ||
| 156 | .owner = THIS_MODULE, | ||
| 157 | }, | ||
| 158 | .reg = MC13783_REG_REGULATOR_MODE_1, | ||
| 159 | .enable_bit = MC13783_REGCTRL_VESIM_EN, | ||
| 160 | }, | ||
| 161 | [MC13783_REGU_VCAM] = { | ||
| 162 | .desc = { | ||
| 163 | .name = "REGU_VCAM", | ||
| 164 | .ops = &mc13783_regulator_ops, | ||
| 165 | .type = REGULATOR_VOLTAGE, | ||
| 166 | .id = MC13783_REGU_VCAM, | ||
| 167 | .owner = THIS_MODULE, | ||
| 168 | }, | ||
| 169 | .reg = MC13783_REG_REGULATOR_MODE_1, | ||
| 170 | .enable_bit = MC13783_REGCTRL_VCAM_EN, | ||
| 171 | }, | ||
| 172 | [MC13783_REGU_VRFBG] = { | ||
| 173 | .desc = { | ||
| 174 | .name = "REGU_VRFBG", | ||
| 175 | .ops = &mc13783_regulator_ops, | ||
| 176 | .type = REGULATOR_VOLTAGE, | ||
| 177 | .id = MC13783_REGU_VRFBG, | ||
| 178 | .owner = THIS_MODULE, | ||
| 179 | }, | ||
| 180 | .reg = MC13783_REG_REGULATOR_MODE_1, | ||
| 181 | .enable_bit = MC13783_REGCTRL_VRFBG_EN, | ||
| 182 | }, | ||
| 183 | [MC13783_REGU_VVIB] = { | ||
| 184 | .desc = { | ||
| 185 | .name = "REGU_VVIB", | ||
| 186 | .ops = &mc13783_regulator_ops, | ||
| 187 | .type = REGULATOR_VOLTAGE, | ||
| 188 | .id = MC13783_REGU_VVIB, | ||
| 189 | .owner = THIS_MODULE, | ||
| 190 | }, | ||
| 191 | .reg = MC13783_REG_REGULATOR_MODE_1, | ||
| 192 | .enable_bit = MC13783_REGCTRL_VVIB_EN, | ||
| 193 | }, | ||
| 194 | [MC13783_REGU_VRF1] = { | ||
| 195 | .desc = { | ||
| 196 | .name = "REGU_VRF1", | ||
| 197 | .ops = &mc13783_regulator_ops, | ||
| 198 | .type = REGULATOR_VOLTAGE, | ||
| 199 | .id = MC13783_REGU_VRF1, | ||
| 200 | .owner = THIS_MODULE, | ||
| 201 | }, | ||
| 202 | .reg = MC13783_REG_REGULATOR_MODE_1, | ||
| 203 | .enable_bit = MC13783_REGCTRL_VRF1_EN, | ||
| 204 | }, | ||
| 205 | [MC13783_REGU_VRF2] = { | ||
| 206 | .desc = { | ||
| 207 | .name = "REGU_VRF2", | ||
| 208 | .ops = &mc13783_regulator_ops, | ||
| 209 | .type = REGULATOR_VOLTAGE, | ||
| 210 | .id = MC13783_REGU_VRF2, | ||
| 211 | .owner = THIS_MODULE, | ||
| 212 | }, | ||
| 213 | .reg = MC13783_REG_REGULATOR_MODE_1, | ||
| 214 | .enable_bit = MC13783_REGCTRL_VRF2_EN, | ||
| 215 | }, | ||
| 216 | [MC13783_REGU_VMMC1] = { | ||
| 217 | .desc = { | ||
| 218 | .name = "REGU_VMMC1", | ||
| 219 | .ops = &mc13783_regulator_ops, | ||
| 220 | .type = REGULATOR_VOLTAGE, | ||
| 221 | .id = MC13783_REGU_VMMC1, | ||
| 222 | .owner = THIS_MODULE, | ||
| 223 | }, | ||
| 224 | .reg = MC13783_REG_REGULATOR_MODE_1, | ||
| 225 | .enable_bit = MC13783_REGCTRL_VMMC1_EN, | ||
| 226 | }, | ||
| 227 | [MC13783_REGU_VMMC2] = { | ||
| 228 | .desc = { | ||
| 229 | .name = "REGU_VMMC2", | ||
| 230 | .ops = &mc13783_regulator_ops, | ||
| 231 | .type = REGULATOR_VOLTAGE, | ||
| 232 | .id = MC13783_REGU_VMMC2, | ||
| 233 | .owner = THIS_MODULE, | ||
| 234 | }, | ||
| 235 | .reg = MC13783_REG_REGULATOR_MODE_1, | ||
| 236 | .enable_bit = MC13783_REGCTRL_VMMC2_EN, | ||
| 237 | }, | ||
| 238 | [MC13783_REGU_GPO1] = { | ||
| 239 | .desc = { | ||
| 240 | .name = "REGU_GPO1", | ||
| 241 | .ops = &mc13783_regulator_ops, | ||
| 242 | .type = REGULATOR_VOLTAGE, | ||
| 243 | .id = MC13783_REGU_GPO1, | ||
| 244 | .owner = THIS_MODULE, | ||
| 245 | }, | ||
| 246 | .reg = MC13783_REG_POWER_MISCELLANEOUS, | ||
| 247 | .enable_bit = MC13783_REGCTRL_GPO1_EN, | ||
| 248 | }, | ||
| 249 | [MC13783_REGU_GPO2] = { | ||
| 250 | .desc = { | ||
| 251 | .name = "REGU_GPO2", | ||
| 252 | .ops = &mc13783_regulator_ops, | ||
| 253 | .type = REGULATOR_VOLTAGE, | ||
| 254 | .id = MC13783_REGU_GPO2, | ||
| 255 | .owner = THIS_MODULE, | ||
| 256 | }, | ||
| 257 | .reg = MC13783_REG_POWER_MISCELLANEOUS, | ||
| 258 | .enable_bit = MC13783_REGCTRL_GPO2_EN, | ||
| 259 | }, | ||
| 260 | [MC13783_REGU_GPO3] = { | ||
| 261 | .desc = { | ||
| 262 | .name = "REGU_GPO3", | ||
| 263 | .ops = &mc13783_regulator_ops, | ||
| 264 | .type = REGULATOR_VOLTAGE, | ||
| 265 | .id = MC13783_REGU_GPO3, | ||
| 266 | .owner = THIS_MODULE, | ||
| 267 | }, | ||
| 268 | .reg = MC13783_REG_POWER_MISCELLANEOUS, | ||
| 269 | .enable_bit = MC13783_REGCTRL_GPO3_EN, | ||
| 270 | }, | ||
| 271 | [MC13783_REGU_GPO4] = { | ||
| 272 | .desc = { | ||
| 273 | .name = "REGU_GPO4", | ||
| 274 | .ops = &mc13783_regulator_ops, | ||
| 275 | .type = REGULATOR_VOLTAGE, | ||
| 276 | .id = MC13783_REGU_GPO4, | ||
| 277 | .owner = THIS_MODULE, | ||
| 278 | }, | ||
| 279 | .reg = MC13783_REG_POWER_MISCELLANEOUS, | ||
| 280 | .enable_bit = MC13783_REGCTRL_GPO4_EN, | ||
| 281 | }, | ||
| 282 | }; | ||
| 283 | |||
| 284 | struct mc13783_priv { | ||
| 285 | struct regulator_desc desc[ARRAY_SIZE(mc13783_regulators)]; | ||
| 286 | struct mc13783 *mc13783; | ||
| 287 | struct regulator_dev *regulators[0]; | ||
| 288 | }; | ||
| 289 | |||
| 290 | static int mc13783_enable(struct regulator_dev *rdev) | ||
| 291 | { | ||
| 292 | struct mc13783_priv *priv = rdev_get_drvdata(rdev); | ||
| 293 | int id = rdev_get_id(rdev); | ||
| 294 | |||
| 295 | dev_dbg(rdev_get_dev(rdev), "%s id: %d\n", __func__, id); | ||
| 296 | |||
| 297 | return mc13783_set_bits(priv->mc13783, mc13783_regulators[id].reg, | ||
| 298 | mc13783_regulators[id].enable_bit, | ||
| 299 | mc13783_regulators[id].enable_bit); | ||
| 300 | } | ||
| 301 | |||
| 302 | static int mc13783_disable(struct regulator_dev *rdev) | ||
| 303 | { | ||
| 304 | struct mc13783_priv *priv = rdev_get_drvdata(rdev); | ||
| 305 | int id = rdev_get_id(rdev); | ||
| 306 | |||
| 307 | dev_dbg(rdev_get_dev(rdev), "%s id: %d\n", __func__, id); | ||
| 308 | |||
| 309 | return mc13783_set_bits(priv->mc13783, mc13783_regulators[id].reg, | ||
| 310 | mc13783_regulators[id].enable_bit, 0); | ||
| 311 | } | ||
| 312 | |||
| 313 | static int mc13783_is_enabled(struct regulator_dev *rdev) | ||
| 314 | { | ||
| 315 | struct mc13783_priv *priv = rdev_get_drvdata(rdev); | ||
| 316 | int ret, id = rdev_get_id(rdev); | ||
| 317 | unsigned int val; | ||
| 318 | |||
| 319 | ret = mc13783_reg_read(priv->mc13783, mc13783_regulators[id].reg, &val); | ||
| 320 | if (ret) | ||
| 321 | return ret; | ||
| 322 | |||
| 323 | return (val & mc13783_regulators[id].enable_bit) != 0; | ||
| 324 | } | ||
| 325 | |||
| 326 | static struct regulator_ops mc13783_regulator_ops = { | ||
| 327 | .enable = mc13783_enable, | ||
| 328 | .disable = mc13783_disable, | ||
| 329 | .is_enabled = mc13783_is_enabled, | ||
| 330 | }; | ||
| 331 | |||
| 332 | static int __devinit mc13783_regulator_probe(struct platform_device *pdev) | ||
| 333 | { | ||
| 334 | struct mc13783_priv *priv; | ||
| 335 | struct mc13783 *mc13783 = dev_get_drvdata(pdev->dev.parent); | ||
| 336 | struct mc13783_regulator_init_data *init_data; | ||
| 337 | int i, ret; | ||
| 338 | |||
| 339 | dev_dbg(&pdev->dev, "mc13783_regulator_probe id %d\n", pdev->id); | ||
| 340 | |||
| 341 | priv = kzalloc(sizeof(*priv) + mc13783->num_regulators * sizeof(void *), | ||
| 342 | GFP_KERNEL); | ||
| 343 | if (!priv) | ||
| 344 | return -ENOMEM; | ||
| 345 | |||
| 346 | priv->mc13783 = mc13783; | ||
| 347 | |||
| 348 | for (i = 0; i < mc13783->num_regulators; i++) { | ||
| 349 | init_data = &mc13783->regulators[i]; | ||
| 350 | priv->regulators[i] = regulator_register( | ||
| 351 | &mc13783_regulators[init_data->id].desc, | ||
| 352 | &pdev->dev, init_data->init_data, priv); | ||
| 353 | |||
| 354 | if (IS_ERR(priv->regulators[i])) { | ||
| 355 | dev_err(&pdev->dev, "failed to register regulator %s\n", | ||
| 356 | mc13783_regulators[i].desc.name); | ||
| 357 | ret = PTR_ERR(priv->regulators[i]); | ||
| 358 | goto err; | ||
| 359 | } | ||
| 360 | } | ||
| 361 | |||
| 362 | platform_set_drvdata(pdev, priv); | ||
| 363 | |||
| 364 | return 0; | ||
| 365 | err: | ||
| 366 | while (--i >= 0) | ||
| 367 | regulator_unregister(priv->regulators[i]); | ||
| 368 | |||
| 369 | kfree(priv); | ||
| 370 | |||
| 371 | return ret; | ||
| 372 | } | ||
| 373 | |||
| 374 | static int __devexit mc13783_regulator_remove(struct platform_device *pdev) | ||
| 375 | { | ||
| 376 | struct mc13783_priv *priv = platform_get_drvdata(pdev); | ||
| 377 | struct mc13783 *mc13783 = priv->mc13783; | ||
| 378 | int i; | ||
| 379 | |||
| 380 | for (i = 0; i < mc13783->num_regulators; i++) | ||
| 381 | regulator_unregister(priv->regulators[i]); | ||
| 382 | |||
| 383 | return 0; | ||
| 384 | } | ||
| 385 | |||
| 386 | static struct platform_driver mc13783_regulator_driver = { | ||
| 387 | .driver = { | ||
| 388 | .name = "mc13783-regulator", | ||
| 389 | .owner = THIS_MODULE, | ||
| 390 | }, | ||
| 391 | .remove = __devexit_p(mc13783_regulator_remove), | ||
| 392 | }; | ||
| 393 | |||
| 394 | static int __init mc13783_regulator_init(void) | ||
| 395 | { | ||
| 396 | return platform_driver_probe(&mc13783_regulator_driver, | ||
| 397 | mc13783_regulator_probe); | ||
| 398 | } | ||
| 399 | subsys_initcall(mc13783_regulator_init); | ||
| 400 | |||
| 401 | static void __exit mc13783_regulator_exit(void) | ||
| 402 | { | ||
| 403 | platform_driver_unregister(&mc13783_regulator_driver); | ||
| 404 | } | ||
| 405 | module_exit(mc13783_regulator_exit); | ||
| 406 | |||
| 407 | MODULE_LICENSE("GPL"); | ||
| 408 | MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de"); | ||
| 409 | MODULE_DESCRIPTION("Regulator Driver for Freescale MC13783 PMIC"); | ||
| 410 | MODULE_ALIAS("platform:mc13783-regulator"); | ||
diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c index 7ea1c3a31081..7e674859bd59 100644 --- a/drivers/regulator/twl-regulator.c +++ b/drivers/regulator/twl-regulator.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
| 13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
| 14 | #include <linux/err.h> | 14 | #include <linux/err.h> |
| 15 | #include <linux/delay.h> | ||
| 15 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
| 16 | #include <linux/regulator/driver.h> | 17 | #include <linux/regulator/driver.h> |
| 17 | #include <linux/regulator/machine.h> | 18 | #include <linux/regulator/machine.h> |
| @@ -40,6 +41,12 @@ struct twlreg_info { | |||
| 40 | u8 table_len; | 41 | u8 table_len; |
| 41 | const u16 *table; | 42 | const u16 *table; |
| 42 | 43 | ||
| 44 | /* regulator specific turn-on delay */ | ||
| 45 | u16 delay; | ||
| 46 | |||
| 47 | /* State REMAP default configuration */ | ||
| 48 | u8 remap; | ||
| 49 | |||
| 43 | /* chip constraints on regulator behavior */ | 50 | /* chip constraints on regulator behavior */ |
| 44 | u16 min_mV; | 51 | u16 min_mV; |
| 45 | 52 | ||
| @@ -128,6 +135,7 @@ static int twlreg_enable(struct regulator_dev *rdev) | |||
| 128 | { | 135 | { |
| 129 | struct twlreg_info *info = rdev_get_drvdata(rdev); | 136 | struct twlreg_info *info = rdev_get_drvdata(rdev); |
| 130 | int grp; | 137 | int grp; |
| 138 | int ret; | ||
| 131 | 139 | ||
| 132 | grp = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_GRP); | 140 | grp = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_GRP); |
| 133 | if (grp < 0) | 141 | if (grp < 0) |
| @@ -138,7 +146,11 @@ static int twlreg_enable(struct regulator_dev *rdev) | |||
| 138 | else | 146 | else |
| 139 | grp |= P1_GRP_6030; | 147 | grp |= P1_GRP_6030; |
| 140 | 148 | ||
| 141 | return twlreg_write(info, TWL_MODULE_PM_RECEIVER, VREG_GRP, grp); | 149 | ret = twlreg_write(info, TWL_MODULE_PM_RECEIVER, VREG_GRP, grp); |
| 150 | |||
| 151 | udelay(info->delay); | ||
| 152 | |||
| 153 | return ret; | ||
| 142 | } | 154 | } |
| 143 | 155 | ||
| 144 | static int twlreg_disable(struct regulator_dev *rdev) | 156 | static int twlreg_disable(struct regulator_dev *rdev) |
| @@ -151,9 +163,9 @@ static int twlreg_disable(struct regulator_dev *rdev) | |||
| 151 | return grp; | 163 | return grp; |
| 152 | 164 | ||
| 153 | if (twl_class_is_4030()) | 165 | if (twl_class_is_4030()) |
| 154 | grp &= ~P1_GRP_4030; | 166 | grp &= ~(P1_GRP_4030 | P2_GRP_4030 | P3_GRP_4030); |
| 155 | else | 167 | else |
| 156 | grp &= ~P1_GRP_6030; | 168 | grp &= ~(P1_GRP_6030 | P2_GRP_6030 | P3_GRP_6030); |
| 157 | 169 | ||
| 158 | return twlreg_write(info, TWL_MODULE_PM_RECEIVER, VREG_GRP, grp); | 170 | return twlreg_write(info, TWL_MODULE_PM_RECEIVER, VREG_GRP, grp); |
| 159 | } | 171 | } |
| @@ -294,6 +306,18 @@ static const u16 VSIM_VSEL_table[] = { | |||
| 294 | static const u16 VDAC_VSEL_table[] = { | 306 | static const u16 VDAC_VSEL_table[] = { |
| 295 | 1200, 1300, 1800, 1800, | 307 | 1200, 1300, 1800, 1800, |
| 296 | }; | 308 | }; |
| 309 | static const u16 VDD1_VSEL_table[] = { | ||
| 310 | 800, 1450, | ||
| 311 | }; | ||
| 312 | static const u16 VDD2_VSEL_table[] = { | ||
| 313 | 800, 1450, 1500, | ||
| 314 | }; | ||
| 315 | static const u16 VIO_VSEL_table[] = { | ||
| 316 | 1800, 1850, | ||
| 317 | }; | ||
| 318 | static const u16 VINTANA2_VSEL_table[] = { | ||
| 319 | 2500, 2750, | ||
| 320 | }; | ||
| 297 | static const u16 VAUX1_6030_VSEL_table[] = { | 321 | static const u16 VAUX1_6030_VSEL_table[] = { |
| 298 | 1000, 1300, 1800, 2500, | 322 | 1000, 1300, 1800, 2500, |
| 299 | 2800, 2900, 3000, 3000, | 323 | 2800, 2900, 3000, 3000, |
| @@ -414,20 +438,30 @@ static struct regulator_ops twlfixed_ops = { | |||
| 414 | 438 | ||
| 415 | /*----------------------------------------------------------------------*/ | 439 | /*----------------------------------------------------------------------*/ |
| 416 | 440 | ||
| 417 | #define TWL4030_ADJUSTABLE_LDO(label, offset, num) \ | 441 | #define TWL4030_ADJUSTABLE_LDO(label, offset, num, turnon_delay, remap_conf) \ |
| 418 | TWL_ADJUSTABLE_LDO(label, offset, num, TWL4030) | 442 | TWL_ADJUSTABLE_LDO(label, offset, num, turnon_delay, \ |
| 419 | #define TWL4030_FIXED_LDO(label, offset, mVolts, num) \ | 443 | remap_conf, TWL4030) |
| 420 | TWL_FIXED_LDO(label, offset, mVolts, num, TWL4030) | 444 | #define TWL4030_FIXED_LDO(label, offset, mVolts, num, turnon_delay, \ |
| 421 | #define TWL6030_ADJUSTABLE_LDO(label, offset, num) \ | 445 | remap_conf) \ |
| 422 | TWL_ADJUSTABLE_LDO(label, offset, num, TWL6030) | 446 | TWL_FIXED_LDO(label, offset, mVolts, num, turnon_delay, \ |
| 423 | #define TWL6030_FIXED_LDO(label, offset, mVolts, num) \ | 447 | remap_conf, TWL4030) |
| 424 | TWL_FIXED_LDO(label, offset, mVolts, num, TWL6030) | 448 | #define TWL6030_ADJUSTABLE_LDO(label, offset, num, turnon_delay, \ |
| 425 | 449 | remap_conf) \ | |
| 426 | #define TWL_ADJUSTABLE_LDO(label, offset, num, family) { \ | 450 | TWL_ADJUSTABLE_LDO(label, offset, num, turnon_delay, \ |
| 451 | remap_conf, TWL6030) | ||
| 452 | #define TWL6030_FIXED_LDO(label, offset, mVolts, num, turnon_delay, \ | ||
| 453 | remap_conf) \ | ||
| 454 | TWL_FIXED_LDO(label, offset, mVolts, num, turnon_delay, \ | ||
| 455 | remap_conf, TWL6030) | ||
| 456 | |||
| 457 | #define TWL_ADJUSTABLE_LDO(label, offset, num, turnon_delay, remap_conf, \ | ||
| 458 | family) { \ | ||
| 427 | .base = offset, \ | 459 | .base = offset, \ |
| 428 | .id = num, \ | 460 | .id = num, \ |
| 429 | .table_len = ARRAY_SIZE(label##_VSEL_table), \ | 461 | .table_len = ARRAY_SIZE(label##_VSEL_table), \ |
| 430 | .table = label##_VSEL_table, \ | 462 | .table = label##_VSEL_table, \ |
| 463 | .delay = turnon_delay, \ | ||
| 464 | .remap = remap_conf, \ | ||
| 431 | .desc = { \ | 465 | .desc = { \ |
| 432 | .name = #label, \ | 466 | .name = #label, \ |
| 433 | .id = family##_REG_##label, \ | 467 | .id = family##_REG_##label, \ |
| @@ -438,10 +472,13 @@ static struct regulator_ops twlfixed_ops = { | |||
| 438 | }, \ | 472 | }, \ |
| 439 | } | 473 | } |
| 440 | 474 | ||
| 441 | #define TWL_FIXED_LDO(label, offset, mVolts, num, family) { \ | 475 | #define TWL_FIXED_LDO(label, offset, mVolts, num, turnon_delay, remap_conf, \ |
| 476 | family) { \ | ||
| 442 | .base = offset, \ | 477 | .base = offset, \ |
| 443 | .id = num, \ | 478 | .id = num, \ |
| 444 | .min_mV = mVolts, \ | 479 | .min_mV = mVolts, \ |
| 480 | .delay = turnon_delay, \ | ||
| 481 | .remap = remap_conf, \ | ||
| 445 | .desc = { \ | 482 | .desc = { \ |
| 446 | .name = #label, \ | 483 | .name = #label, \ |
| 447 | .id = family##_REG_##label, \ | 484 | .id = family##_REG_##label, \ |
| @@ -457,43 +494,41 @@ static struct regulator_ops twlfixed_ops = { | |||
| 457 | * software control over them after boot. | 494 | * software control over them after boot. |
| 458 | */ | 495 | */ |
| 459 | static struct twlreg_info twl_regs[] = { | 496 | static struct twlreg_info twl_regs[] = { |
| 460 | TWL4030_ADJUSTABLE_LDO(VAUX1, 0x17, 1), | 497 | TWL4030_ADJUSTABLE_LDO(VAUX1, 0x17, 1, 100, 0x08), |
| 461 | TWL4030_ADJUSTABLE_LDO(VAUX2_4030, 0x1b, 2), | 498 | TWL4030_ADJUSTABLE_LDO(VAUX2_4030, 0x1b, 2, 100, 0x08), |
| 462 | TWL4030_ADJUSTABLE_LDO(VAUX2, 0x1b, 2), | 499 | TWL4030_ADJUSTABLE_LDO(VAUX2, 0x1b, 2, 100, 0x08), |
| 463 | TWL4030_ADJUSTABLE_LDO(VAUX3, 0x1f, 3), | 500 | TWL4030_ADJUSTABLE_LDO(VAUX3, 0x1f, 3, 100, 0x08), |
| 464 | TWL4030_ADJUSTABLE_LDO(VAUX4, 0x23, 4), | 501 | TWL4030_ADJUSTABLE_LDO(VAUX4, 0x23, 4, 100, 0x08), |
| 465 | TWL4030_ADJUSTABLE_LDO(VMMC1, 0x27, 5), | 502 | TWL4030_ADJUSTABLE_LDO(VMMC1, 0x27, 5, 100, 0x08), |
| 466 | TWL4030_ADJUSTABLE_LDO(VMMC2, 0x2b, 6), | 503 | TWL4030_ADJUSTABLE_LDO(VMMC2, 0x2b, 6, 100, 0x08), |
| 467 | /* | 504 | TWL4030_ADJUSTABLE_LDO(VPLL1, 0x2f, 7, 100, 0x00), |
| 468 | TWL4030_ADJUSTABLE_LDO(VPLL1, 0x2f, 7), | 505 | TWL4030_ADJUSTABLE_LDO(VPLL2, 0x33, 8, 100, 0x08), |
| 469 | */ | 506 | TWL4030_ADJUSTABLE_LDO(VSIM, 0x37, 9, 100, 0x00), |
| 470 | TWL4030_ADJUSTABLE_LDO(VPLL2, 0x33, 8), | 507 | TWL4030_ADJUSTABLE_LDO(VDAC, 0x3b, 10, 100, 0x08), |
| 471 | TWL4030_ADJUSTABLE_LDO(VSIM, 0x37, 9), | 508 | TWL4030_FIXED_LDO(VINTANA1, 0x3f, 1500, 11, 100, 0x08), |
| 472 | TWL4030_ADJUSTABLE_LDO(VDAC, 0x3b, 10), | 509 | TWL4030_ADJUSTABLE_LDO(VINTANA2, 0x43, 12, 100, 0x08), |
| 473 | /* | 510 | TWL4030_FIXED_LDO(VINTDIG, 0x47, 1500, 13, 100, 0x08), |
| 474 | TWL4030_ADJUSTABLE_LDO(VINTANA1, 0x3f, 11), | 511 | TWL4030_ADJUSTABLE_LDO(VIO, 0x4b, 14, 1000, 0x08), |
| 475 | TWL4030_ADJUSTABLE_LDO(VINTANA2, 0x43, 12), | 512 | TWL4030_ADJUSTABLE_LDO(VDD1, 0x55, 15, 1000, 0x08), |
| 476 | TWL4030_ADJUSTABLE_LDO(VINTDIG, 0x47, 13), | 513 | TWL4030_ADJUSTABLE_LDO(VDD2, 0x63, 16, 1000, 0x08), |
| 477 | TWL4030_SMPS(VIO, 0x4b, 14), | 514 | TWL4030_FIXED_LDO(VUSB1V5, 0x71, 1500, 17, 100, 0x08), |
| 478 | TWL4030_SMPS(VDD1, 0x55, 15), | 515 | TWL4030_FIXED_LDO(VUSB1V8, 0x74, 1800, 18, 100, 0x08), |
| 479 | TWL4030_SMPS(VDD2, 0x63, 16), | 516 | TWL4030_FIXED_LDO(VUSB3V1, 0x77, 3100, 19, 150, 0x08), |
| 480 | */ | ||
| 481 | TWL4030_FIXED_LDO(VUSB1V5, 0x71, 1500, 17), | ||
| 482 | TWL4030_FIXED_LDO(VUSB1V8, 0x74, 1800, 18), | ||
| 483 | TWL4030_FIXED_LDO(VUSB3V1, 0x77, 3100, 19), | ||
| 484 | /* VUSBCP is managed *only* by the USB subchip */ | 517 | /* VUSBCP is managed *only* by the USB subchip */ |
| 485 | 518 | ||
| 486 | /* 6030 REG with base as PMC Slave Misc : 0x0030 */ | 519 | /* 6030 REG with base as PMC Slave Misc : 0x0030 */ |
| 487 | TWL6030_ADJUSTABLE_LDO(VAUX1_6030, 0x54, 1), | 520 | /* Turnon-delay and remap configuration values for 6030 are not |
| 488 | TWL6030_ADJUSTABLE_LDO(VAUX2_6030, 0x58, 2), | 521 | verified since the specification is not public */ |
| 489 | TWL6030_ADJUSTABLE_LDO(VAUX3_6030, 0x5c, 3), | 522 | TWL6030_ADJUSTABLE_LDO(VAUX1_6030, 0x54, 1, 0, 0x08), |
| 490 | TWL6030_ADJUSTABLE_LDO(VMMC, 0x68, 4), | 523 | TWL6030_ADJUSTABLE_LDO(VAUX2_6030, 0x58, 2, 0, 0x08), |
| 491 | TWL6030_ADJUSTABLE_LDO(VPP, 0x6c, 5), | 524 | TWL6030_ADJUSTABLE_LDO(VAUX3_6030, 0x5c, 3, 0, 0x08), |
| 492 | TWL6030_ADJUSTABLE_LDO(VUSIM, 0x74, 7), | 525 | TWL6030_ADJUSTABLE_LDO(VMMC, 0x68, 4, 0, 0x08), |
| 493 | TWL6030_FIXED_LDO(VANA, 0x50, 2100, 15), | 526 | TWL6030_ADJUSTABLE_LDO(VPP, 0x6c, 5, 0, 0x08), |
| 494 | TWL6030_FIXED_LDO(VCXIO, 0x60, 1800, 16), | 527 | TWL6030_ADJUSTABLE_LDO(VUSIM, 0x74, 7, 0, 0x08), |
| 495 | TWL6030_FIXED_LDO(VDAC, 0x64, 1800, 17), | 528 | TWL6030_FIXED_LDO(VANA, 0x50, 2100, 15, 0, 0x08), |
| 496 | TWL6030_FIXED_LDO(VUSB, 0x70, 3300, 18) | 529 | TWL6030_FIXED_LDO(VCXIO, 0x60, 1800, 16, 0, 0x08), |
| 530 | TWL6030_FIXED_LDO(VDAC, 0x64, 1800, 17, 0, 0x08), | ||
| 531 | TWL6030_FIXED_LDO(VUSB, 0x70, 3300, 18, 0, 0x08) | ||
| 497 | }; | 532 | }; |
| 498 | 533 | ||
| 499 | static int twlreg_probe(struct platform_device *pdev) | 534 | static int twlreg_probe(struct platform_device *pdev) |
| @@ -525,6 +560,19 @@ static int twlreg_probe(struct platform_device *pdev) | |||
| 525 | c->valid_ops_mask &= REGULATOR_CHANGE_VOLTAGE | 560 | c->valid_ops_mask &= REGULATOR_CHANGE_VOLTAGE |
| 526 | | REGULATOR_CHANGE_MODE | 561 | | REGULATOR_CHANGE_MODE |
| 527 | | REGULATOR_CHANGE_STATUS; | 562 | | REGULATOR_CHANGE_STATUS; |
| 563 | switch (pdev->id) { | ||
| 564 | case TWL4030_REG_VIO: | ||
| 565 | case TWL4030_REG_VDD1: | ||
| 566 | case TWL4030_REG_VDD2: | ||
| 567 | case TWL4030_REG_VPLL1: | ||
| 568 | case TWL4030_REG_VINTANA1: | ||
| 569 | case TWL4030_REG_VINTANA2: | ||
| 570 | case TWL4030_REG_VINTDIG: | ||
| 571 | c->always_on = true; | ||
| 572 | break; | ||
| 573 | default: | ||
| 574 | break; | ||
| 575 | } | ||
| 528 | 576 | ||
| 529 | rdev = regulator_register(&info->desc, &pdev->dev, initdata, info); | 577 | rdev = regulator_register(&info->desc, &pdev->dev, initdata, info); |
| 530 | if (IS_ERR(rdev)) { | 578 | if (IS_ERR(rdev)) { |
| @@ -534,6 +582,9 @@ static int twlreg_probe(struct platform_device *pdev) | |||
| 534 | } | 582 | } |
| 535 | platform_set_drvdata(pdev, rdev); | 583 | platform_set_drvdata(pdev, rdev); |
| 536 | 584 | ||
| 585 | twlreg_write(info, TWL_MODULE_PM_RECEIVER, VREG_REMAP, | ||
| 586 | info->remap); | ||
| 587 | |||
| 537 | /* NOTE: many regulators support short-circuit IRQs (presentable | 588 | /* NOTE: many regulators support short-circuit IRQs (presentable |
| 538 | * as REGULATOR_OVER_CURRENT notifications?) configured via: | 589 | * as REGULATOR_OVER_CURRENT notifications?) configured via: |
| 539 | * - SC_CONFIG | 590 | * - SC_CONFIG |
diff --git a/drivers/regulator/wm831x-dcdc.c b/drivers/regulator/wm831x-dcdc.c index 2eefc1a0cf08..0a6577577e8d 100644 --- a/drivers/regulator/wm831x-dcdc.c +++ b/drivers/regulator/wm831x-dcdc.c | |||
| @@ -19,6 +19,8 @@ | |||
| 19 | #include <linux/i2c.h> | 19 | #include <linux/i2c.h> |
| 20 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
| 21 | #include <linux/regulator/driver.h> | 21 | #include <linux/regulator/driver.h> |
| 22 | #include <linux/regulator/machine.h> | ||
| 23 | #include <linux/gpio.h> | ||
| 22 | 24 | ||
| 23 | #include <linux/mfd/wm831x/core.h> | 25 | #include <linux/mfd/wm831x/core.h> |
| 24 | #include <linux/mfd/wm831x/regulator.h> | 26 | #include <linux/mfd/wm831x/regulator.h> |
| @@ -39,6 +41,7 @@ | |||
| 39 | #define WM831X_DCDC_CONTROL_2 1 | 41 | #define WM831X_DCDC_CONTROL_2 1 |
| 40 | #define WM831X_DCDC_ON_CONFIG 2 | 42 | #define WM831X_DCDC_ON_CONFIG 2 |
| 41 | #define WM831X_DCDC_SLEEP_CONTROL 3 | 43 | #define WM831X_DCDC_SLEEP_CONTROL 3 |
| 44 | #define WM831X_DCDC_DVS_CONTROL 4 | ||
| 42 | 45 | ||
| 43 | /* | 46 | /* |
| 44 | * Shared | 47 | * Shared |
| @@ -50,6 +53,10 @@ struct wm831x_dcdc { | |||
| 50 | int base; | 53 | int base; |
| 51 | struct wm831x *wm831x; | 54 | struct wm831x *wm831x; |
| 52 | struct regulator_dev *regulator; | 55 | struct regulator_dev *regulator; |
| 56 | int dvs_gpio; | ||
| 57 | int dvs_gpio_state; | ||
| 58 | int on_vsel; | ||
| 59 | int dvs_vsel; | ||
| 53 | }; | 60 | }; |
| 54 | 61 | ||
| 55 | static int wm831x_dcdc_is_enabled(struct regulator_dev *rdev) | 62 | static int wm831x_dcdc_is_enabled(struct regulator_dev *rdev) |
| @@ -240,11 +247,9 @@ static int wm831x_buckv_list_voltage(struct regulator_dev *rdev, | |||
| 240 | return -EINVAL; | 247 | return -EINVAL; |
| 241 | } | 248 | } |
| 242 | 249 | ||
| 243 | static int wm831x_buckv_set_voltage_int(struct regulator_dev *rdev, int reg, | 250 | static int wm831x_buckv_select_min_voltage(struct regulator_dev *rdev, |
| 244 | int min_uV, int max_uV) | 251 | int min_uV, int max_uV) |
| 245 | { | 252 | { |
| 246 | struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); | ||
| 247 | struct wm831x *wm831x = dcdc->wm831x; | ||
| 248 | u16 vsel; | 253 | u16 vsel; |
| 249 | 254 | ||
| 250 | if (min_uV < 600000) | 255 | if (min_uV < 600000) |
| @@ -257,39 +262,126 @@ static int wm831x_buckv_set_voltage_int(struct regulator_dev *rdev, int reg, | |||
| 257 | if (wm831x_buckv_list_voltage(rdev, vsel) > max_uV) | 262 | if (wm831x_buckv_list_voltage(rdev, vsel) > max_uV) |
| 258 | return -EINVAL; | 263 | return -EINVAL; |
| 259 | 264 | ||
| 260 | return wm831x_set_bits(wm831x, reg, WM831X_DC1_ON_VSEL_MASK, vsel); | 265 | return vsel; |
| 266 | } | ||
| 267 | |||
| 268 | static int wm831x_buckv_select_max_voltage(struct regulator_dev *rdev, | ||
| 269 | int min_uV, int max_uV) | ||
| 270 | { | ||
| 271 | u16 vsel; | ||
| 272 | |||
| 273 | if (max_uV < 600000 || max_uV > 1800000) | ||
| 274 | return -EINVAL; | ||
| 275 | |||
| 276 | vsel = ((max_uV - 600000) / 12500) + 8; | ||
| 277 | |||
| 278 | if (wm831x_buckv_list_voltage(rdev, vsel) < min_uV || | ||
| 279 | wm831x_buckv_list_voltage(rdev, vsel) < max_uV) | ||
| 280 | return -EINVAL; | ||
| 281 | |||
| 282 | return vsel; | ||
| 283 | } | ||
| 284 | |||
| 285 | static int wm831x_buckv_set_dvs(struct regulator_dev *rdev, int state) | ||
| 286 | { | ||
| 287 | struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); | ||
| 288 | |||
| 289 | if (state == dcdc->dvs_gpio_state) | ||
| 290 | return 0; | ||
| 291 | |||
| 292 | dcdc->dvs_gpio_state = state; | ||
| 293 | gpio_set_value(dcdc->dvs_gpio, state); | ||
| 294 | |||
| 295 | /* Should wait for DVS state change to be asserted if we have | ||
| 296 | * a GPIO for it, for now assume the device is configured | ||
| 297 | * for the fastest possible transition. | ||
| 298 | */ | ||
| 299 | |||
| 300 | return 0; | ||
| 261 | } | 301 | } |
| 262 | 302 | ||
| 263 | static int wm831x_buckv_set_voltage(struct regulator_dev *rdev, | 303 | static int wm831x_buckv_set_voltage(struct regulator_dev *rdev, |
| 264 | int min_uV, int max_uV) | 304 | int min_uV, int max_uV) |
| 265 | { | 305 | { |
| 266 | struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); | 306 | struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); |
| 267 | u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG; | 307 | struct wm831x *wm831x = dcdc->wm831x; |
| 308 | int on_reg = dcdc->base + WM831X_DCDC_ON_CONFIG; | ||
| 309 | int dvs_reg = dcdc->base + WM831X_DCDC_DVS_CONTROL; | ||
| 310 | int vsel, ret; | ||
| 311 | |||
| 312 | vsel = wm831x_buckv_select_min_voltage(rdev, min_uV, max_uV); | ||
| 313 | if (vsel < 0) | ||
| 314 | return vsel; | ||
| 315 | |||
| 316 | /* If this value is already set then do a GPIO update if we can */ | ||
| 317 | if (dcdc->dvs_gpio && dcdc->on_vsel == vsel) | ||
| 318 | return wm831x_buckv_set_dvs(rdev, 0); | ||
| 319 | |||
| 320 | if (dcdc->dvs_gpio && dcdc->dvs_vsel == vsel) | ||
| 321 | return wm831x_buckv_set_dvs(rdev, 1); | ||
| 322 | |||
| 323 | /* Always set the ON status to the minimum voltage */ | ||
| 324 | ret = wm831x_set_bits(wm831x, on_reg, WM831X_DC1_ON_VSEL_MASK, vsel); | ||
| 325 | if (ret < 0) | ||
| 326 | return ret; | ||
| 327 | dcdc->on_vsel = vsel; | ||
| 328 | |||
| 329 | if (!dcdc->dvs_gpio) | ||
| 330 | return ret; | ||
| 331 | |||
| 332 | /* Kick the voltage transition now */ | ||
| 333 | ret = wm831x_buckv_set_dvs(rdev, 0); | ||
| 334 | if (ret < 0) | ||
| 335 | return ret; | ||
| 336 | |||
| 337 | /* Set the high voltage as the DVS voltage. This is optimised | ||
| 338 | * for CPUfreq usage, most processors will keep the maximum | ||
| 339 | * voltage constant and lower the minimum with the frequency. */ | ||
| 340 | vsel = wm831x_buckv_select_max_voltage(rdev, min_uV, max_uV); | ||
| 341 | if (vsel < 0) { | ||
| 342 | /* This should never happen - at worst the same vsel | ||
| 343 | * should be chosen */ | ||
| 344 | WARN_ON(vsel < 0); | ||
| 345 | return 0; | ||
| 346 | } | ||
| 347 | |||
| 348 | /* Don't bother if it's the same VSEL we're already using */ | ||
| 349 | if (vsel == dcdc->on_vsel) | ||
| 350 | return 0; | ||
| 268 | 351 | ||
| 269 | return wm831x_buckv_set_voltage_int(rdev, reg, min_uV, max_uV); | 352 | ret = wm831x_set_bits(wm831x, dvs_reg, WM831X_DC1_DVS_VSEL_MASK, vsel); |
| 353 | if (ret == 0) | ||
| 354 | dcdc->dvs_vsel = vsel; | ||
| 355 | else | ||
| 356 | dev_warn(wm831x->dev, "Failed to set DCDC DVS VSEL: %d\n", | ||
| 357 | ret); | ||
| 358 | |||
| 359 | return 0; | ||
| 270 | } | 360 | } |
| 271 | 361 | ||
| 272 | static int wm831x_buckv_set_suspend_voltage(struct regulator_dev *rdev, | 362 | static int wm831x_buckv_set_suspend_voltage(struct regulator_dev *rdev, |
| 273 | int uV) | 363 | int uV) |
| 274 | { | 364 | { |
| 275 | struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); | 365 | struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); |
| 366 | struct wm831x *wm831x = dcdc->wm831x; | ||
| 276 | u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL; | 367 | u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL; |
| 368 | int vsel; | ||
| 369 | |||
| 370 | vsel = wm831x_buckv_select_min_voltage(rdev, uV, uV); | ||
| 371 | if (vsel < 0) | ||
| 372 | return vsel; | ||
| 277 | 373 | ||
| 278 | return wm831x_buckv_set_voltage_int(rdev, reg, uV, uV); | 374 | return wm831x_set_bits(wm831x, reg, WM831X_DC1_SLP_VSEL_MASK, vsel); |
| 279 | } | 375 | } |
| 280 | 376 | ||
| 281 | static int wm831x_buckv_get_voltage(struct regulator_dev *rdev) | 377 | static int wm831x_buckv_get_voltage(struct regulator_dev *rdev) |
| 282 | { | 378 | { |
| 283 | struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); | 379 | struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); |
| 284 | struct wm831x *wm831x = dcdc->wm831x; | ||
| 285 | u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG; | ||
| 286 | int val; | ||
| 287 | 380 | ||
| 288 | val = wm831x_reg_read(wm831x, reg); | 381 | if (dcdc->dvs_gpio && dcdc->dvs_gpio_state) |
| 289 | if (val < 0) | 382 | return wm831x_buckv_list_voltage(rdev, dcdc->dvs_vsel); |
| 290 | return val; | 383 | else |
| 291 | 384 | return wm831x_buckv_list_voltage(rdev, dcdc->on_vsel); | |
| 292 | return wm831x_buckv_list_voltage(rdev, val & WM831X_DC1_ON_VSEL_MASK); | ||
| 293 | } | 385 | } |
| 294 | 386 | ||
| 295 | /* Current limit options */ | 387 | /* Current limit options */ |
| @@ -346,6 +438,64 @@ static struct regulator_ops wm831x_buckv_ops = { | |||
| 346 | .set_suspend_mode = wm831x_dcdc_set_suspend_mode, | 438 | .set_suspend_mode = wm831x_dcdc_set_suspend_mode, |
| 347 | }; | 439 | }; |
| 348 | 440 | ||
| 441 | /* | ||
| 442 | * Set up DVS control. We just log errors since we can still run | ||
| 443 | * (with reduced performance) if we fail. | ||
| 444 | */ | ||
| 445 | static __devinit void wm831x_buckv_dvs_init(struct wm831x_dcdc *dcdc, | ||
| 446 | struct wm831x_buckv_pdata *pdata) | ||
| 447 | { | ||
| 448 | struct wm831x *wm831x = dcdc->wm831x; | ||
| 449 | int ret; | ||
| 450 | u16 ctrl; | ||
| 451 | |||
| 452 | if (!pdata || !pdata->dvs_gpio) | ||
| 453 | return; | ||
| 454 | |||
| 455 | switch (pdata->dvs_control_src) { | ||
| 456 | case 1: | ||
| 457 | ctrl = 2 << WM831X_DC1_DVS_SRC_SHIFT; | ||
| 458 | break; | ||
| 459 | case 2: | ||
| 460 | ctrl = 3 << WM831X_DC1_DVS_SRC_SHIFT; | ||
| 461 | break; | ||
| 462 | default: | ||
| 463 | dev_err(wm831x->dev, "Invalid DVS control source %d for %s\n", | ||
| 464 | pdata->dvs_control_src, dcdc->name); | ||
| 465 | return; | ||
| 466 | } | ||
| 467 | |||
| 468 | ret = wm831x_set_bits(wm831x, dcdc->base + WM831X_DCDC_DVS_CONTROL, | ||
| 469 | WM831X_DC1_DVS_SRC_MASK, ctrl); | ||
| 470 | if (ret < 0) { | ||
| 471 | dev_err(wm831x->dev, "Failed to set %s DVS source: %d\n", | ||
| 472 | dcdc->name, ret); | ||
| 473 | return; | ||
| 474 | } | ||
| 475 | |||
| 476 | ret = gpio_request(pdata->dvs_gpio, "DCDC DVS"); | ||
| 477 | if (ret < 0) { | ||
| 478 | dev_err(wm831x->dev, "Failed to get %s DVS GPIO: %d\n", | ||
| 479 | dcdc->name, ret); | ||
| 480 | return; | ||
| 481 | } | ||
| 482 | |||
| 483 | /* gpiolib won't let us read the GPIO status so pick the higher | ||
| 484 | * of the two existing voltages so we take it as platform data. | ||
| 485 | */ | ||
| 486 | dcdc->dvs_gpio_state = pdata->dvs_init_state; | ||
| 487 | |||
| 488 | ret = gpio_direction_output(pdata->dvs_gpio, dcdc->dvs_gpio_state); | ||
| 489 | if (ret < 0) { | ||
| 490 | dev_err(wm831x->dev, "Failed to enable %s DVS GPIO: %d\n", | ||
| 491 | dcdc->name, ret); | ||
| 492 | gpio_free(pdata->dvs_gpio); | ||
| 493 | return; | ||
| 494 | } | ||
| 495 | |||
| 496 | dcdc->dvs_gpio = pdata->dvs_gpio; | ||
| 497 | } | ||
| 498 | |||
| 349 | static __devinit int wm831x_buckv_probe(struct platform_device *pdev) | 499 | static __devinit int wm831x_buckv_probe(struct platform_device *pdev) |
| 350 | { | 500 | { |
| 351 | struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); | 501 | struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); |
| @@ -384,6 +534,23 @@ static __devinit int wm831x_buckv_probe(struct platform_device *pdev) | |||
| 384 | dcdc->desc.ops = &wm831x_buckv_ops; | 534 | dcdc->desc.ops = &wm831x_buckv_ops; |
| 385 | dcdc->desc.owner = THIS_MODULE; | 535 | dcdc->desc.owner = THIS_MODULE; |
| 386 | 536 | ||
| 537 | ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_ON_CONFIG); | ||
| 538 | if (ret < 0) { | ||
| 539 | dev_err(wm831x->dev, "Failed to read ON VSEL: %d\n", ret); | ||
| 540 | goto err; | ||
| 541 | } | ||
| 542 | dcdc->on_vsel = ret & WM831X_DC1_ON_VSEL_MASK; | ||
| 543 | |||
| 544 | ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_ON_CONFIG); | ||
| 545 | if (ret < 0) { | ||
| 546 | dev_err(wm831x->dev, "Failed to read DVS VSEL: %d\n", ret); | ||
| 547 | goto err; | ||
| 548 | } | ||
| 549 | dcdc->dvs_vsel = ret & WM831X_DC1_DVS_VSEL_MASK; | ||
| 550 | |||
| 551 | if (pdata->dcdc[id]) | ||
| 552 | wm831x_buckv_dvs_init(dcdc, pdata->dcdc[id]->driver_data); | ||
| 553 | |||
| 387 | dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev, | 554 | dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev, |
| 388 | pdata->dcdc[id], dcdc); | 555 | pdata->dcdc[id], dcdc); |
| 389 | if (IS_ERR(dcdc->regulator)) { | 556 | if (IS_ERR(dcdc->regulator)) { |
| @@ -422,6 +589,8 @@ err_uv: | |||
| 422 | err_regulator: | 589 | err_regulator: |
| 423 | regulator_unregister(dcdc->regulator); | 590 | regulator_unregister(dcdc->regulator); |
| 424 | err: | 591 | err: |
| 592 | if (dcdc->dvs_gpio) | ||
| 593 | gpio_free(dcdc->dvs_gpio); | ||
| 425 | kfree(dcdc); | 594 | kfree(dcdc); |
| 426 | return ret; | 595 | return ret; |
| 427 | } | 596 | } |
| @@ -434,6 +603,8 @@ static __devexit int wm831x_buckv_remove(struct platform_device *pdev) | |||
| 434 | wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "HC"), dcdc); | 603 | wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "HC"), dcdc); |
| 435 | wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc); | 604 | wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc); |
| 436 | regulator_unregister(dcdc->regulator); | 605 | regulator_unregister(dcdc->regulator); |
| 606 | if (dcdc->dvs_gpio) | ||
| 607 | gpio_free(dcdc->dvs_gpio); | ||
| 437 | kfree(dcdc); | 608 | kfree(dcdc); |
| 438 | 609 | ||
| 439 | return 0; | 610 | return 0; |
diff --git a/drivers/regulator/wm831x-ldo.c b/drivers/regulator/wm831x-ldo.c index 902db56ce099..61e02ac2fda3 100644 --- a/drivers/regulator/wm831x-ldo.c +++ b/drivers/regulator/wm831x-ldo.c | |||
| @@ -470,7 +470,7 @@ static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev) | |||
| 470 | struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); | 470 | struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); |
| 471 | struct wm831x *wm831x = ldo->wm831x; | 471 | struct wm831x *wm831x = ldo->wm831x; |
| 472 | int on_reg = ldo->base + WM831X_LDO_ON_CONTROL; | 472 | int on_reg = ldo->base + WM831X_LDO_ON_CONTROL; |
| 473 | unsigned int ret; | 473 | int ret; |
| 474 | 474 | ||
| 475 | ret = wm831x_reg_read(wm831x, on_reg); | 475 | ret = wm831x_reg_read(wm831x, on_reg); |
| 476 | if (ret < 0) | 476 | if (ret < 0) |
diff --git a/drivers/staging/iio/ring_sw.h b/drivers/staging/iio/ring_sw.h index f0b86f02cd80..fd677f008365 100644 --- a/drivers/staging/iio/ring_sw.h +++ b/drivers/staging/iio/ring_sw.h | |||
| @@ -29,7 +29,6 @@ | |||
| 29 | * driver requests - some may support multiple options */ | 29 | * driver requests - some may support multiple options */ |
| 30 | 30 | ||
| 31 | 31 | ||
| 32 | #include <linux/autoconf.h> | ||
| 33 | #include "iio.h" | 32 | #include "iio.h" |
| 34 | #include "ring_generic.h" | 33 | #include "ring_generic.h" |
| 35 | 34 | ||
diff --git a/drivers/staging/panel/panel.c b/drivers/staging/panel/panel.c index 4ce399b6d237..f98a52448eae 100644 --- a/drivers/staging/panel/panel.c +++ b/drivers/staging/panel/panel.c | |||
| @@ -55,7 +55,7 @@ | |||
| 55 | #include <linux/list.h> | 55 | #include <linux/list.h> |
| 56 | #include <linux/notifier.h> | 56 | #include <linux/notifier.h> |
| 57 | #include <linux/reboot.h> | 57 | #include <linux/reboot.h> |
| 58 | #include <linux/utsrelease.h> | 58 | #include <generated/utsrelease.h> |
| 59 | 59 | ||
| 60 | #include <linux/io.h> | 60 | #include <linux/io.h> |
| 61 | #include <asm/uaccess.h> | 61 | #include <asm/uaccess.h> |
diff --git a/drivers/video/atafb.c b/drivers/video/atafb.c index 2051c9dc813b..b7687c55fe16 100644 --- a/drivers/video/atafb.c +++ b/drivers/video/atafb.c | |||
| @@ -2245,9 +2245,6 @@ static int ext_setcolreg(unsigned int regno, unsigned int red, | |||
| 2245 | if (regno > 255) | 2245 | if (regno > 255) |
| 2246 | return 1; | 2246 | return 1; |
| 2247 | 2247 | ||
| 2248 | if (regno > 255) | ||
| 2249 | return 1; | ||
| 2250 | |||
| 2251 | switch (external_card_type) { | 2248 | switch (external_card_type) { |
| 2252 | case IS_VGA: | 2249 | case IS_VGA: |
| 2253 | OUTB(0x3c8, regno); | 2250 | OUTB(0x3c8, regno); |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index f72914db2a11..756f831cbdd5 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
| @@ -118,6 +118,7 @@ header-y += mtio.h | |||
| 118 | header-y += ncp_no.h | 118 | header-y += ncp_no.h |
| 119 | header-y += neighbour.h | 119 | header-y += neighbour.h |
| 120 | header-y += net_dropmon.h | 120 | header-y += net_dropmon.h |
| 121 | header-y += net_tstamp.h | ||
| 121 | header-y += netfilter_arp.h | 122 | header-y += netfilter_arp.h |
| 122 | header-y += netrom.h | 123 | header-y += netrom.h |
| 123 | header-y += nfs2.h | 124 | header-y += nfs2.h |
diff --git a/include/linux/mfd/wm831x/pdata.h b/include/linux/mfd/wm831x/pdata.h index 415c228743d5..fd322aca33ba 100644 --- a/include/linux/mfd/wm831x/pdata.h +++ b/include/linux/mfd/wm831x/pdata.h | |||
| @@ -41,6 +41,23 @@ struct wm831x_battery_pdata { | |||
| 41 | int timeout; /** Charge cycle timeout, in minutes */ | 41 | int timeout; /** Charge cycle timeout, in minutes */ |
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | /** | ||
| 45 | * Configuration for the WM831x DC-DC BuckWise convertors. This | ||
| 46 | * should be passed as driver_data in the regulator_init_data. | ||
| 47 | * | ||
| 48 | * Currently all the configuration is for the fast DVS switching | ||
| 49 | * support of the devices. This allows MFPs on the device to be | ||
| 50 | * configured as an input to switch between two output voltages, | ||
| 51 | * allowing voltage transitions without the expense of an access over | ||
| 52 | * I2C or SPI buses. | ||
| 53 | */ | ||
| 54 | struct wm831x_buckv_pdata { | ||
| 55 | int dvs_gpio; /** CPU GPIO to use for DVS switching */ | ||
| 56 | int dvs_control_src; /** Hardware DVS source to use (1 or 2) */ | ||
| 57 | int dvs_init_state; /** DVS state to expect on startup */ | ||
| 58 | int dvs_state_gpio; /** CPU GPIO to use for monitoring status */ | ||
| 59 | }; | ||
| 60 | |||
| 44 | /* Sources for status LED configuration. Values are register values | 61 | /* Sources for status LED configuration. Values are register values |
| 45 | * plus 1 to allow for a zero default for preserve. | 62 | * plus 1 to allow for a zero default for preserve. |
| 46 | */ | 63 | */ |
diff --git a/include/linux/mmdebug.h b/include/linux/mmdebug.h index 8a5509877192..ee24ef8ab616 100644 --- a/include/linux/mmdebug.h +++ b/include/linux/mmdebug.h | |||
| @@ -1,8 +1,6 @@ | |||
| 1 | #ifndef LINUX_MM_DEBUG_H | 1 | #ifndef LINUX_MM_DEBUG_H |
| 2 | #define LINUX_MM_DEBUG_H 1 | 2 | #define LINUX_MM_DEBUG_H 1 |
| 3 | 3 | ||
| 4 | #include <linux/autoconf.h> | ||
| 5 | |||
| 6 | #ifdef CONFIG_DEBUG_VM | 4 | #ifdef CONFIG_DEBUG_VM |
| 7 | #define VM_BUG_ON(cond) BUG_ON(cond) | 5 | #define VM_BUG_ON(cond) BUG_ON(cond) |
| 8 | #else | 6 | #else |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 6f7561730d88..30fe668c2542 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | #include <linux/seqlock.h> | 15 | #include <linux/seqlock.h> |
| 16 | #include <linux/nodemask.h> | 16 | #include <linux/nodemask.h> |
| 17 | #include <linux/pageblock-flags.h> | 17 | #include <linux/pageblock-flags.h> |
| 18 | #include <linux/bounds.h> | 18 | #include <generated/bounds.h> |
| 19 | #include <asm/atomic.h> | 19 | #include <asm/atomic.h> |
| 20 | #include <asm/page.h> | 20 | #include <asm/page.h> |
| 21 | 21 | ||
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index feee2ba8d06a..5b59f35dcb8f 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | #include <linux/types.h> | 8 | #include <linux/types.h> |
| 9 | #ifndef __GENERATING_BOUNDS_H | 9 | #ifndef __GENERATING_BOUNDS_H |
| 10 | #include <linux/mm_types.h> | 10 | #include <linux/mm_types.h> |
| 11 | #include <linux/bounds.h> | 11 | #include <generated/bounds.h> |
| 12 | #endif /* !__GENERATING_BOUNDS_H */ | 12 | #endif /* !__GENERATING_BOUNDS_H */ |
| 13 | 13 | ||
| 14 | /* | 14 | /* |
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index 490c5b37b6d7..030d92255c7a 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h | |||
| @@ -35,6 +35,8 @@ | |||
| 35 | #ifndef __LINUX_REGULATOR_CONSUMER_H_ | 35 | #ifndef __LINUX_REGULATOR_CONSUMER_H_ |
| 36 | #define __LINUX_REGULATOR_CONSUMER_H_ | 36 | #define __LINUX_REGULATOR_CONSUMER_H_ |
| 37 | 37 | ||
| 38 | #include <linux/device.h> | ||
| 39 | |||
| 38 | /* | 40 | /* |
| 39 | * Regulator operating modes. | 41 | * Regulator operating modes. |
| 40 | * | 42 | * |
diff --git a/include/linux/regulator/machine.h b/include/linux/regulator/machine.h index 87f5f176d4ef..234a8476cba8 100644 --- a/include/linux/regulator/machine.h +++ b/include/linux/regulator/machine.h | |||
| @@ -43,16 +43,20 @@ struct regulator; | |||
| 43 | /** | 43 | /** |
| 44 | * struct regulator_state - regulator state during low power system states | 44 | * struct regulator_state - regulator state during low power system states |
| 45 | * | 45 | * |
| 46 | * This describes a regulators state during a system wide low power state. | 46 | * This describes a regulators state during a system wide low power |
| 47 | * state. One of enabled or disabled must be set for the | ||
| 48 | * configuration to be applied. | ||
| 47 | * | 49 | * |
| 48 | * @uV: Operating voltage during suspend. | 50 | * @uV: Operating voltage during suspend. |
| 49 | * @mode: Operating mode during suspend. | 51 | * @mode: Operating mode during suspend. |
| 50 | * @enabled: Enabled during suspend. | 52 | * @enabled: Enabled during suspend. |
| 53 | * @disabled: Disabled during suspend. | ||
| 51 | */ | 54 | */ |
| 52 | struct regulator_state { | 55 | struct regulator_state { |
| 53 | int uV; /* suspend voltage */ | 56 | int uV; /* suspend voltage */ |
| 54 | unsigned int mode; /* suspend regulator operating mode */ | 57 | unsigned int mode; /* suspend regulator operating mode */ |
| 55 | int enabled; /* is regulator enabled in this suspend state */ | 58 | int enabled; /* is regulator enabled in this suspend state */ |
| 59 | int disabled; /* is the regulator disbled in this suspend state */ | ||
| 56 | }; | 60 | }; |
| 57 | 61 | ||
| 58 | /** | 62 | /** |
diff --git a/include/linux/regulator/max8660.h b/include/linux/regulator/max8660.h new file mode 100644 index 000000000000..9936763621c7 --- /dev/null +++ b/include/linux/regulator/max8660.h | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | /* | ||
| 2 | * max8660.h -- Voltage regulation for the Maxim 8660/8661 | ||
| 3 | * | ||
| 4 | * Copyright (C) 2009 Wolfram Sang, Pengutronix e.K. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; version 2 of the License. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | #ifndef __LINUX_REGULATOR_MAX8660_H | ||
| 21 | #define __LINUX_REGULATOR_MAX8660_H | ||
| 22 | |||
| 23 | #include <linux/regulator/machine.h> | ||
| 24 | |||
| 25 | enum { | ||
| 26 | MAX8660_V3, | ||
| 27 | MAX8660_V4, | ||
| 28 | MAX8660_V5, | ||
| 29 | MAX8660_V6, | ||
| 30 | MAX8660_V7, | ||
| 31 | MAX8660_V_END, | ||
| 32 | }; | ||
| 33 | |||
| 34 | /** | ||
| 35 | * max8660_subdev_data - regulator subdev data | ||
| 36 | * @id: regulator id | ||
| 37 | * @name: regulator name | ||
| 38 | * @platform_data: regulator init data | ||
| 39 | */ | ||
| 40 | struct max8660_subdev_data { | ||
| 41 | int id; | ||
| 42 | char *name; | ||
| 43 | struct regulator_init_data *platform_data; | ||
| 44 | }; | ||
| 45 | |||
| 46 | /** | ||
| 47 | * max8660_platform_data - platform data for max8660 | ||
| 48 | * @num_subdevs: number of regulators used | ||
| 49 | * @subdevs: pointer to regulators used | ||
| 50 | * @en34_is_high: if EN34 is driven high, regulators cannot be en-/disabled. | ||
| 51 | */ | ||
| 52 | struct max8660_platform_data { | ||
| 53 | int num_subdevs; | ||
| 54 | struct max8660_subdev_data *subdevs; | ||
| 55 | unsigned en34_is_high:1; | ||
| 56 | }; | ||
| 57 | #endif | ||
diff --git a/include/linux/vermagic.h b/include/linux/vermagic.h index 79b9837d9ca0..cf97b5b9d1fe 100644 --- a/include/linux/vermagic.h +++ b/include/linux/vermagic.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | #include <linux/utsrelease.h> | 1 | #include <generated/utsrelease.h> |
| 2 | #include <linux/module.h> | 2 | #include <linux/module.h> |
| 3 | 3 | ||
| 4 | /* Simply sanity version stamp for modules. */ | 4 | /* Simply sanity version stamp for modules. */ |
diff --git a/init/Makefile b/init/Makefile index 4a243df426f7..0bf677aa0872 100644 --- a/init/Makefile +++ b/init/Makefile | |||
| @@ -15,12 +15,8 @@ mounts-$(CONFIG_BLK_DEV_RAM) += do_mounts_rd.o | |||
| 15 | mounts-$(CONFIG_BLK_DEV_INITRD) += do_mounts_initrd.o | 15 | mounts-$(CONFIG_BLK_DEV_INITRD) += do_mounts_initrd.o |
| 16 | mounts-$(CONFIG_BLK_DEV_MD) += do_mounts_md.o | 16 | mounts-$(CONFIG_BLK_DEV_MD) += do_mounts_md.o |
| 17 | 17 | ||
| 18 | # files to be removed upon make clean | ||
| 19 | clean-files := ../include/linux/compile.h | ||
| 20 | |||
| 21 | # dependencies on generated files need to be listed explicitly | 18 | # dependencies on generated files need to be listed explicitly |
| 22 | 19 | $(obj)/version.o: include/generated/compile.h | |
| 23 | $(obj)/version.o: include/linux/compile.h | ||
| 24 | 20 | ||
| 25 | # compile.h changes depending on hostname, generation number, etc, | 21 | # compile.h changes depending on hostname, generation number, etc, |
| 26 | # so we regenerate it always. | 22 | # so we regenerate it always. |
| @@ -30,7 +26,7 @@ $(obj)/version.o: include/linux/compile.h | |||
| 30 | chk_compile.h = : | 26 | chk_compile.h = : |
| 31 | quiet_chk_compile.h = echo ' CHK $@' | 27 | quiet_chk_compile.h = echo ' CHK $@' |
| 32 | silent_chk_compile.h = : | 28 | silent_chk_compile.h = : |
| 33 | include/linux/compile.h: FORCE | 29 | include/generated/compile.h: FORCE |
| 34 | @$($(quiet)chk_compile.h) | 30 | @$($(quiet)chk_compile.h) |
| 35 | $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \ | 31 | $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \ |
| 36 | "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CC) $(KBUILD_CFLAGS)" | 32 | "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CC) $(KBUILD_CFLAGS)" |
diff --git a/init/version.c b/init/version.c index 52a8b98642b8..adff586401a5 100644 --- a/init/version.c +++ b/init/version.c | |||
| @@ -6,11 +6,11 @@ | |||
| 6 | * May be freely distributed as part of Linux. | 6 | * May be freely distributed as part of Linux. |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <linux/compile.h> | 9 | #include <generated/compile.h> |
| 10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
| 11 | #include <linux/uts.h> | 11 | #include <linux/uts.h> |
| 12 | #include <linux/utsname.h> | 12 | #include <linux/utsname.h> |
| 13 | #include <linux/utsrelease.h> | 13 | #include <generated/utsrelease.h> |
| 14 | #include <linux/version.h> | 14 | #include <linux/version.h> |
| 15 | 15 | ||
| 16 | #ifndef CONFIG_KALLSYMS | 16 | #ifndef CONFIG_KALLSYMS |
diff --git a/kernel/bounds.c b/kernel/bounds.c index 3c5301381837..98a51f26c136 100644 --- a/kernel/bounds.c +++ b/kernel/bounds.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | void foo(void) | 13 | void foo(void) |
| 14 | { | 14 | { |
| 15 | /* The enum constants to put into include/linux/bounds.h */ | 15 | /* The enum constants to put into include/generated/bounds.h */ |
| 16 | DEFINE(NR_PAGEFLAGS, __NR_PAGEFLAGS); | 16 | DEFINE(NR_PAGEFLAGS, __NR_PAGEFLAGS); |
| 17 | DEFINE(MAX_NR_ZONES, __MAX_NR_ZONES); | 17 | DEFINE(MAX_NR_ZONES, __MAX_NR_ZONES); |
| 18 | /* End of constants */ | 18 | /* End of constants */ |
diff --git a/kernel/kexec.c b/kernel/kexec.c index 433e9fcc1fc5..a9a93d9ee7a7 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | #include <linux/hardirq.h> | 21 | #include <linux/hardirq.h> |
| 22 | #include <linux/elf.h> | 22 | #include <linux/elf.h> |
| 23 | #include <linux/elfcore.h> | 23 | #include <linux/elfcore.h> |
| 24 | #include <linux/utsrelease.h> | 24 | #include <generated/utsrelease.h> |
| 25 | #include <linux/utsname.h> | 25 | #include <linux/utsname.h> |
| 26 | #include <linux/numa.h> | 26 | #include <linux/numa.h> |
| 27 | #include <linux/suspend.h> | 27 | #include <linux/suspend.h> |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 06ba26747d7e..8b9f20ab8eed 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | * Copyright (C) 2004 William Lee Irwin III | 12 | * Copyright (C) 2004 William Lee Irwin III |
| 13 | */ | 13 | */ |
| 14 | #include <linux/ring_buffer.h> | 14 | #include <linux/ring_buffer.h> |
| 15 | #include <linux/utsrelease.h> | 15 | #include <generated/utsrelease.h> |
| 16 | #include <linux/stacktrace.h> | 16 | #include <linux/stacktrace.h> |
| 17 | #include <linux/writeback.h> | 17 | #include <linux/writeback.h> |
| 18 | #include <linux/kallsyms.h> | 18 | #include <linux/kallsyms.h> |
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index c67e73ecd5be..ed2773edfe71 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include | |||
| @@ -149,6 +149,12 @@ ld-option = $(call try-run,\ | |||
| 149 | # $(Q)$(MAKE) $(build)=dir | 149 | # $(Q)$(MAKE) $(build)=dir |
| 150 | build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj | 150 | build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj |
| 151 | 151 | ||
| 152 | ### | ||
| 153 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.modbuiltin obj= | ||
| 154 | # Usage: | ||
| 155 | # $(Q)$(MAKE) $(modbuiltin)=dir | ||
| 156 | modbuiltin := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.modbuiltin obj | ||
| 157 | |||
| 152 | # Prefix -I with $(srctree) if it is not an absolute path. | 158 | # Prefix -I with $(srctree) if it is not an absolute path. |
| 153 | # skip if -I has no parameter | 159 | # skip if -I has no parameter |
| 154 | addtree = $(if $(patsubst -I%,%,$(1)), \ | 160 | addtree = $(if $(patsubst -I%,%,$(1)), \ |
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 224d85e72ef1..cd815ac2a50b 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib | |||
| @@ -213,7 +213,7 @@ cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -f -9 > $@) || \ | |||
| 213 | 213 | ||
| 214 | # Bzip2 and LZMA do not include size in file... so we have to fake that; | 214 | # Bzip2 and LZMA do not include size in file... so we have to fake that; |
| 215 | # append the size as a 32-bit littleendian number as gzip does. | 215 | # append the size as a 32-bit littleendian number as gzip does. |
| 216 | size_append = /bin/echo -ne $(shell \ | 216 | size_append = printf $(shell \ |
| 217 | dec_size=0; \ | 217 | dec_size=0; \ |
| 218 | for F in $1; do \ | 218 | for F in $1; do \ |
| 219 | fsize=$$(stat -c "%s" $$F); \ | 219 | fsize=$$(stat -c "%s" $$F); \ |
diff --git a/scripts/Makefile.modbuiltin b/scripts/Makefile.modbuiltin new file mode 100644 index 000000000000..102a276f6eea --- /dev/null +++ b/scripts/Makefile.modbuiltin | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | # ========================================================================== | ||
| 2 | # Generating modules.builtin | ||
| 3 | # ========================================================================== | ||
| 4 | |||
| 5 | src := $(obj) | ||
| 6 | |||
| 7 | PHONY := __modbuiltin | ||
| 8 | __modbuiltin: | ||
| 9 | |||
| 10 | -include include/config/auto.conf | ||
| 11 | # tristate.conf sets tristate variables to uppercase 'Y' or 'M' | ||
| 12 | # That way, we get the list of built-in modules in obj-Y | ||
| 13 | -include include/config/tristate.conf | ||
| 14 | |||
| 15 | include scripts/Kbuild.include | ||
| 16 | |||
| 17 | # The filename Kbuild has precedence over Makefile | ||
| 18 | kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) | ||
| 19 | kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) | ||
| 20 | include $(kbuild-file) | ||
| 21 | |||
| 22 | include scripts/Makefile.lib | ||
| 23 | __subdir-Y := $(patsubst %/,%,$(filter %/, $(obj-Y))) | ||
| 24 | subdir-Y += $(__subdir-Y) | ||
| 25 | subdir-ym := $(sort $(subdir-y) $(subdir-Y) $(subdir-m)) | ||
| 26 | subdir-ym := $(addprefix $(obj)/,$(subdir-ym)) | ||
| 27 | obj-Y := $(addprefix $(obj)/,$(obj-Y)) | ||
| 28 | |||
| 29 | modbuiltin-subdirs := $(patsubst %,%/modules.builtin, $(subdir-ym)) | ||
| 30 | modbuiltin-mods := $(filter %.ko, $(obj-Y:.o=.ko)) | ||
| 31 | modbuiltin-target := $(obj)/modules.builtin | ||
| 32 | |||
| 33 | __modbuiltin: $(modbuiltin-target) $(subdir-ym) | ||
| 34 | @: | ||
| 35 | |||
| 36 | $(modbuiltin-target): $(subdir-ym) FORCE | ||
| 37 | $(Q)(for m in $(modbuiltin-mods); do echo kernel/$$m; done; \ | ||
| 38 | cat /dev/null $(modbuiltin-subdirs)) > $@ | ||
| 39 | |||
| 40 | PHONY += FORCE | ||
| 41 | |||
| 42 | FORCE: | ||
| 43 | |||
| 44 | # Descending | ||
| 45 | # --------------------------------------------------------------------------- | ||
| 46 | |||
| 47 | PHONY += $(subdir-ym) | ||
| 48 | $(subdir-ym): | ||
| 49 | $(Q)$(MAKE) $(modbuiltin)=$@ | ||
| 50 | |||
| 51 | |||
| 52 | # Declare the contents of the .PHONY variable as phony. We keep that | ||
| 53 | # information in a variable se we can use it in if_changed and friends. | ||
| 54 | |||
| 55 | .PHONY: $(PHONY) | ||
diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c index 6bf21f83837d..ea26b23de082 100644 --- a/scripts/basic/fixdep.c +++ b/scripts/basic/fixdep.c | |||
| @@ -16,15 +16,15 @@ | |||
| 16 | * tells make when to remake a file. | 16 | * tells make when to remake a file. |
| 17 | * | 17 | * |
| 18 | * To use this list as-is however has the drawback that virtually | 18 | * To use this list as-is however has the drawback that virtually |
| 19 | * every file in the kernel includes <linux/autoconf.h>. | 19 | * every file in the kernel includes autoconf.h. |
| 20 | * | 20 | * |
| 21 | * If the user re-runs make *config, linux/autoconf.h will be | 21 | * If the user re-runs make *config, autoconf.h will be |
| 22 | * regenerated. make notices that and will rebuild every file which | 22 | * regenerated. make notices that and will rebuild every file which |
| 23 | * includes autoconf.h, i.e. basically all files. This is extremely | 23 | * includes autoconf.h, i.e. basically all files. This is extremely |
| 24 | * annoying if the user just changed CONFIG_HIS_DRIVER from n to m. | 24 | * annoying if the user just changed CONFIG_HIS_DRIVER from n to m. |
| 25 | * | 25 | * |
| 26 | * So we play the same trick that "mkdep" played before. We replace | 26 | * So we play the same trick that "mkdep" played before. We replace |
| 27 | * the dependency on linux/autoconf.h by a dependency on every config | 27 | * the dependency on autoconf.h by a dependency on every config |
| 28 | * option which is mentioned in any of the listed prequisites. | 28 | * option which is mentioned in any of the listed prequisites. |
| 29 | * | 29 | * |
| 30 | * kconfig populates a tree in include/config/ with an empty file | 30 | * kconfig populates a tree in include/config/ with an empty file |
| @@ -73,7 +73,7 @@ | |||
| 73 | * cmd_<target> = <cmdline> | 73 | * cmd_<target> = <cmdline> |
| 74 | * | 74 | * |
| 75 | * and then basically copies the .<target>.d file to stdout, in the | 75 | * and then basically copies the .<target>.d file to stdout, in the |
| 76 | * process filtering out the dependency on linux/autoconf.h and adding | 76 | * process filtering out the dependency on autoconf.h and adding |
| 77 | * dependencies on include/config/my/option.h for every | 77 | * dependencies on include/config/my/option.h for every |
| 78 | * CONFIG_MY_OPTION encountered in any of the prequisites. | 78 | * CONFIG_MY_OPTION encountered in any of the prequisites. |
| 79 | * | 79 | * |
| @@ -324,7 +324,7 @@ static void parse_dep_file(void *map, size_t len) | |||
| 324 | p++; | 324 | p++; |
| 325 | } | 325 | } |
| 326 | memcpy(s, m, p-m); s[p-m] = 0; | 326 | memcpy(s, m, p-m); s[p-m] = 0; |
| 327 | if (strrcmp(s, "include/linux/autoconf.h") && | 327 | if (strrcmp(s, "include/generated/autoconf.h") && |
| 328 | strrcmp(s, "arch/um/include/uml-config.h") && | 328 | strrcmp(s, "arch/um/include/uml-config.h") && |
| 329 | strrcmp(s, ".ver")) { | 329 | strrcmp(s, ".ver")) { |
| 330 | printf(" %s \\\n", s); | 330 | printf(" %s \\\n", s); |
diff --git a/scripts/genksyms/keywords.c_shipped b/scripts/genksyms/keywords.c_shipped index 287467a2e8c7..8060e06798b3 100644 --- a/scripts/genksyms/keywords.c_shipped +++ b/scripts/genksyms/keywords.c_shipped | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* ANSI-C code produced by gperf version 3.0.3 */ | 1 | /* ANSI-C code produced by gperf version 3.0.4 */ |
| 2 | /* Command-line: gperf -L ANSI-C -a -C -E -g -H is_reserved_hash -k '1,3,$' -N is_reserved_word -p -t scripts/genksyms/keywords.gperf */ | 2 | /* Command-line: gperf -L ANSI-C -a -C -E -g -H is_reserved_hash -k '1,3,$' -N is_reserved_word -p -t scripts/genksyms/keywords.gperf */ |
| 3 | 3 | ||
| 4 | #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ | 4 | #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ |
| @@ -34,7 +34,7 @@ struct resword; | |||
| 34 | static const struct resword *is_reserved_word(register const char *str, register unsigned int len); | 34 | static const struct resword *is_reserved_word(register const char *str, register unsigned int len); |
| 35 | #line 5 "scripts/genksyms/keywords.gperf" | 35 | #line 5 "scripts/genksyms/keywords.gperf" |
| 36 | struct resword { const char *name; int token; }; | 36 | struct resword { const char *name; int token; }; |
| 37 | /* maximum key range = 62, duplicates = 0 */ | 37 | /* maximum key range = 64, duplicates = 0 */ |
| 38 | 38 | ||
| 39 | #ifdef __GNUC__ | 39 | #ifdef __GNUC__ |
| 40 | __inline | 40 | __inline |
| @@ -48,39 +48,39 @@ is_reserved_hash (register const char *str, register unsigned int len) | |||
| 48 | { | 48 | { |
| 49 | static const unsigned char asso_values[] = | 49 | static const unsigned char asso_values[] = |
| 50 | { | 50 | { |
| 51 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 51 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 52 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 52 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 53 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 53 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 54 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 54 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 55 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 55 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 56 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 56 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 57 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 5, | 57 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, |
| 58 | 65, 65, 65, 65, 65, 65, 35, 65, 65, 65, | 58 | 67, 67, 67, 67, 67, 67, 15, 67, 67, 67, |
| 59 | 0, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 59 | 0, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 60 | 65, 65, 65, 65, 65, 0, 65, 0, 65, 5, | 60 | 67, 67, 67, 67, 67, 0, 67, 0, 67, 5, |
| 61 | 20, 15, 10, 30, 65, 15, 65, 65, 20, 0, | 61 | 25, 20, 15, 30, 67, 15, 67, 67, 10, 0, |
| 62 | 10, 35, 20, 65, 10, 5, 0, 10, 5, 65, | 62 | 10, 40, 20, 67, 10, 5, 0, 10, 15, 67, |
| 63 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 63 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 64 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 64 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 65 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 65 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 66 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 66 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 67 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 67 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 68 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 68 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 69 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 69 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 70 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 70 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 71 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 71 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 72 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 72 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 73 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 73 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 74 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 74 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 75 | 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, | 75 | 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, |
| 76 | 65, 65, 65, 65, 65, 65 | 76 | 67, 67, 67, 67, 67, 67 |
| 77 | }; | 77 | }; |
| 78 | return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]]; | 78 | return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]]; |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | #ifdef __GNUC__ | 81 | #ifdef __GNUC__ |
| 82 | __inline | 82 | __inline |
| 83 | #ifdef __GNUC_STDC_INLINE__ | 83 | #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ |
| 84 | __attribute__ ((__gnu_inline__)) | 84 | __attribute__ ((__gnu_inline__)) |
| 85 | #endif | 85 | #endif |
| 86 | #endif | 86 | #endif |
| @@ -89,116 +89,119 @@ is_reserved_word (register const char *str, register unsigned int len) | |||
| 89 | { | 89 | { |
| 90 | enum | 90 | enum |
| 91 | { | 91 | { |
| 92 | TOTAL_KEYWORDS = 43, | 92 | TOTAL_KEYWORDS = 45, |
| 93 | MIN_WORD_LENGTH = 3, | 93 | MIN_WORD_LENGTH = 3, |
| 94 | MAX_WORD_LENGTH = 24, | 94 | MAX_WORD_LENGTH = 24, |
| 95 | MIN_HASH_VALUE = 3, | 95 | MIN_HASH_VALUE = 3, |
| 96 | MAX_HASH_VALUE = 64 | 96 | MAX_HASH_VALUE = 66 |
| 97 | }; | 97 | }; |
| 98 | 98 | ||
| 99 | static const struct resword wordlist[] = | 99 | static const struct resword wordlist[] = |
| 100 | { | 100 | { |
| 101 | {""}, {""}, {""}, | 101 | {""}, {""}, {""}, |
| 102 | #line 28 "scripts/genksyms/keywords.gperf" | 102 | #line 30 "scripts/genksyms/keywords.gperf" |
| 103 | {"asm", ASM_KEYW}, | 103 | {"asm", ASM_KEYW}, |
| 104 | {""}, | 104 | {""}, |
| 105 | #line 10 "scripts/genksyms/keywords.gperf" | 105 | #line 12 "scripts/genksyms/keywords.gperf" |
| 106 | {"__asm", ASM_KEYW}, | 106 | {"__asm", ASM_KEYW}, |
| 107 | {""}, | 107 | {""}, |
| 108 | #line 11 "scripts/genksyms/keywords.gperf" | 108 | #line 13 "scripts/genksyms/keywords.gperf" |
| 109 | {"__asm__", ASM_KEYW}, | 109 | {"__asm__", ASM_KEYW}, |
| 110 | {""}, {""}, | 110 | {""}, {""}, |
| 111 | #line 54 "scripts/genksyms/keywords.gperf" | 111 | #line 56 "scripts/genksyms/keywords.gperf" |
| 112 | {"__typeof__", TYPEOF_KEYW}, | 112 | {"__typeof__", TYPEOF_KEYW}, |
| 113 | {""}, | 113 | {""}, |
| 114 | #line 14 "scripts/genksyms/keywords.gperf" | 114 | #line 16 "scripts/genksyms/keywords.gperf" |
| 115 | {"__const", CONST_KEYW}, | 115 | {"__const", CONST_KEYW}, |
| 116 | #line 13 "scripts/genksyms/keywords.gperf" | ||
| 117 | {"__attribute__", ATTRIBUTE_KEYW}, | ||
| 118 | #line 15 "scripts/genksyms/keywords.gperf" | 116 | #line 15 "scripts/genksyms/keywords.gperf" |
| 117 | {"__attribute__", ATTRIBUTE_KEYW}, | ||
| 118 | #line 17 "scripts/genksyms/keywords.gperf" | ||
| 119 | {"__const__", CONST_KEYW}, | 119 | {"__const__", CONST_KEYW}, |
| 120 | #line 20 "scripts/genksyms/keywords.gperf" | 120 | #line 22 "scripts/genksyms/keywords.gperf" |
| 121 | {"__signed__", SIGNED_KEYW}, | 121 | {"__signed__", SIGNED_KEYW}, |
| 122 | #line 46 "scripts/genksyms/keywords.gperf" | 122 | #line 48 "scripts/genksyms/keywords.gperf" |
| 123 | {"static", STATIC_KEYW}, | 123 | {"static", STATIC_KEYW}, |
| 124 | #line 22 "scripts/genksyms/keywords.gperf" | 124 | {""}, |
| 125 | {"__volatile__", VOLATILE_KEYW}, | 125 | #line 43 "scripts/genksyms/keywords.gperf" |
| 126 | #line 41 "scripts/genksyms/keywords.gperf" | ||
| 127 | {"int", INT_KEYW}, | 126 | {"int", INT_KEYW}, |
| 128 | #line 34 "scripts/genksyms/keywords.gperf" | 127 | #line 36 "scripts/genksyms/keywords.gperf" |
| 129 | {"char", CHAR_KEYW}, | 128 | {"char", CHAR_KEYW}, |
| 130 | #line 35 "scripts/genksyms/keywords.gperf" | 129 | #line 37 "scripts/genksyms/keywords.gperf" |
| 131 | {"const", CONST_KEYW}, | 130 | {"const", CONST_KEYW}, |
| 132 | #line 47 "scripts/genksyms/keywords.gperf" | 131 | #line 49 "scripts/genksyms/keywords.gperf" |
| 133 | {"struct", STRUCT_KEYW}, | 132 | {"struct", STRUCT_KEYW}, |
| 134 | #line 26 "scripts/genksyms/keywords.gperf" | 133 | #line 28 "scripts/genksyms/keywords.gperf" |
| 135 | {"__restrict__", RESTRICT_KEYW}, | 134 | {"__restrict__", RESTRICT_KEYW}, |
| 136 | #line 27 "scripts/genksyms/keywords.gperf" | 135 | #line 29 "scripts/genksyms/keywords.gperf" |
| 137 | {"restrict", RESTRICT_KEYW}, | 136 | {"restrict", RESTRICT_KEYW}, |
| 138 | #line 25 "scripts/genksyms/keywords.gperf" | 137 | #line 9 "scripts/genksyms/keywords.gperf" |
| 139 | {"_restrict", RESTRICT_KEYW}, | 138 | {"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW}, |
| 140 | #line 18 "scripts/genksyms/keywords.gperf" | 139 | #line 20 "scripts/genksyms/keywords.gperf" |
| 141 | {"__inline__", INLINE_KEYW}, | 140 | {"__inline__", INLINE_KEYW}, |
| 142 | #line 12 "scripts/genksyms/keywords.gperf" | ||
| 143 | {"__attribute", ATTRIBUTE_KEYW}, | ||
| 144 | {""}, | 141 | {""}, |
| 145 | #line 16 "scripts/genksyms/keywords.gperf" | 142 | #line 24 "scripts/genksyms/keywords.gperf" |
| 143 | {"__volatile__", VOLATILE_KEYW}, | ||
| 144 | #line 7 "scripts/genksyms/keywords.gperf" | ||
| 145 | {"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW}, | ||
| 146 | #line 27 "scripts/genksyms/keywords.gperf" | ||
| 147 | {"_restrict", RESTRICT_KEYW}, | ||
| 148 | {""}, | ||
| 149 | #line 14 "scripts/genksyms/keywords.gperf" | ||
| 150 | {"__attribute", ATTRIBUTE_KEYW}, | ||
| 151 | #line 8 "scripts/genksyms/keywords.gperf" | ||
| 152 | {"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW}, | ||
| 153 | #line 18 "scripts/genksyms/keywords.gperf" | ||
| 146 | {"__extension__", EXTENSION_KEYW}, | 154 | {"__extension__", EXTENSION_KEYW}, |
| 147 | #line 37 "scripts/genksyms/keywords.gperf" | 155 | #line 39 "scripts/genksyms/keywords.gperf" |
| 148 | {"enum", ENUM_KEYW}, | 156 | {"enum", ENUM_KEYW}, |
| 149 | #line 21 "scripts/genksyms/keywords.gperf" | 157 | #line 10 "scripts/genksyms/keywords.gperf" |
| 150 | {"__volatile", VOLATILE_KEYW}, | 158 | {"EXPORT_UNUSED_SYMBOL", EXPORT_SYMBOL_KEYW}, |
| 151 | #line 38 "scripts/genksyms/keywords.gperf" | 159 | #line 40 "scripts/genksyms/keywords.gperf" |
| 152 | {"extern", EXTERN_KEYW}, | 160 | {"extern", EXTERN_KEYW}, |
| 153 | {""}, | 161 | {""}, |
| 154 | #line 19 "scripts/genksyms/keywords.gperf" | 162 | #line 21 "scripts/genksyms/keywords.gperf" |
| 155 | {"__signed", SIGNED_KEYW}, | 163 | {"__signed", SIGNED_KEYW}, |
| 156 | #line 9 "scripts/genksyms/keywords.gperf" | 164 | #line 11 "scripts/genksyms/keywords.gperf" |
| 157 | {"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW}, | 165 | {"EXPORT_UNUSED_SYMBOL_GPL", EXPORT_SYMBOL_KEYW}, |
| 158 | {""}, | 166 | #line 51 "scripts/genksyms/keywords.gperf" |
| 159 | #line 53 "scripts/genksyms/keywords.gperf" | 167 | {"union", UNION_KEYW}, |
| 168 | #line 55 "scripts/genksyms/keywords.gperf" | ||
| 160 | {"typeof", TYPEOF_KEYW}, | 169 | {"typeof", TYPEOF_KEYW}, |
| 161 | #line 48 "scripts/genksyms/keywords.gperf" | 170 | #line 50 "scripts/genksyms/keywords.gperf" |
| 162 | {"typedef", TYPEDEF_KEYW}, | 171 | {"typedef", TYPEDEF_KEYW}, |
| 163 | #line 17 "scripts/genksyms/keywords.gperf" | 172 | #line 19 "scripts/genksyms/keywords.gperf" |
| 164 | {"__inline", INLINE_KEYW}, | 173 | {"__inline", INLINE_KEYW}, |
| 165 | #line 33 "scripts/genksyms/keywords.gperf" | 174 | #line 35 "scripts/genksyms/keywords.gperf" |
| 166 | {"auto", AUTO_KEYW}, | 175 | {"auto", AUTO_KEYW}, |
| 167 | #line 49 "scripts/genksyms/keywords.gperf" | 176 | #line 23 "scripts/genksyms/keywords.gperf" |
| 168 | {"union", UNION_KEYW}, | 177 | {"__volatile", VOLATILE_KEYW}, |
| 169 | {""}, {""}, | ||
| 170 | #line 50 "scripts/genksyms/keywords.gperf" | ||
| 171 | {"unsigned", UNSIGNED_KEYW}, | ||
| 172 | #line 51 "scripts/genksyms/keywords.gperf" | ||
| 173 | {"void", VOID_KEYW}, | ||
| 174 | #line 44 "scripts/genksyms/keywords.gperf" | ||
| 175 | {"short", SHORT_KEYW}, | ||
| 176 | {""}, {""}, | 178 | {""}, {""}, |
| 177 | #line 52 "scripts/genksyms/keywords.gperf" | 179 | #line 52 "scripts/genksyms/keywords.gperf" |
| 178 | {"volatile", VOLATILE_KEYW}, | 180 | {"unsigned", UNSIGNED_KEYW}, |
| 179 | {""}, | ||
| 180 | #line 39 "scripts/genksyms/keywords.gperf" | ||
| 181 | {"float", FLOAT_KEYW}, | ||
| 182 | #line 36 "scripts/genksyms/keywords.gperf" | ||
| 183 | {"double", DOUBLE_KEYW}, | ||
| 184 | {""}, | 181 | {""}, |
| 185 | #line 7 "scripts/genksyms/keywords.gperf" | 182 | #line 46 "scripts/genksyms/keywords.gperf" |
| 186 | {"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW}, | 183 | {"short", SHORT_KEYW}, |
| 187 | {""}, {""}, | 184 | #line 42 "scripts/genksyms/keywords.gperf" |
| 188 | #line 40 "scripts/genksyms/keywords.gperf" | ||
| 189 | {"inline", INLINE_KEYW}, | 185 | {"inline", INLINE_KEYW}, |
| 190 | #line 8 "scripts/genksyms/keywords.gperf" | ||
| 191 | {"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW}, | ||
| 192 | #line 43 "scripts/genksyms/keywords.gperf" | ||
| 193 | {"register", REGISTER_KEYW}, | ||
| 194 | {""}, | 186 | {""}, |
| 195 | #line 24 "scripts/genksyms/keywords.gperf" | 187 | #line 54 "scripts/genksyms/keywords.gperf" |
| 188 | {"volatile", VOLATILE_KEYW}, | ||
| 189 | #line 44 "scripts/genksyms/keywords.gperf" | ||
| 190 | {"long", LONG_KEYW}, | ||
| 191 | #line 26 "scripts/genksyms/keywords.gperf" | ||
| 196 | {"_Bool", BOOL_KEYW}, | 192 | {"_Bool", BOOL_KEYW}, |
| 197 | #line 45 "scripts/genksyms/keywords.gperf" | ||
| 198 | {"signed", SIGNED_KEYW}, | ||
| 199 | {""}, {""}, | 193 | {""}, {""}, |
| 200 | #line 42 "scripts/genksyms/keywords.gperf" | 194 | #line 45 "scripts/genksyms/keywords.gperf" |
| 201 | {"long", LONG_KEYW} | 195 | {"register", REGISTER_KEYW}, |
| 196 | #line 53 "scripts/genksyms/keywords.gperf" | ||
| 197 | {"void", VOID_KEYW}, | ||
| 198 | #line 41 "scripts/genksyms/keywords.gperf" | ||
| 199 | {"float", FLOAT_KEYW}, | ||
| 200 | #line 38 "scripts/genksyms/keywords.gperf" | ||
| 201 | {"double", DOUBLE_KEYW}, | ||
| 202 | {""}, {""}, {""}, {""}, | ||
| 203 | #line 47 "scripts/genksyms/keywords.gperf" | ||
| 204 | {"signed", SIGNED_KEYW} | ||
| 202 | }; | 205 | }; |
| 203 | 206 | ||
| 204 | if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) | 207 | if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) |
diff --git a/scripts/genksyms/keywords.gperf b/scripts/genksyms/keywords.gperf index 8fe977a4d57b..e6349acb6f2f 100644 --- a/scripts/genksyms/keywords.gperf +++ b/scripts/genksyms/keywords.gperf | |||
| @@ -7,6 +7,8 @@ struct resword { const char *name; int token; } | |||
| 7 | EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW | 7 | EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW |
| 8 | EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW | 8 | EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW |
| 9 | EXPORT_SYMBOL_GPL_FUTURE, EXPORT_SYMBOL_KEYW | 9 | EXPORT_SYMBOL_GPL_FUTURE, EXPORT_SYMBOL_KEYW |
| 10 | EXPORT_UNUSED_SYMBOL, EXPORT_SYMBOL_KEYW | ||
| 11 | EXPORT_UNUSED_SYMBOL_GPL, EXPORT_SYMBOL_KEYW | ||
| 10 | __asm, ASM_KEYW | 12 | __asm, ASM_KEYW |
| 11 | __asm__, ASM_KEYW | 13 | __asm__, ASM_KEYW |
| 12 | __attribute, ATTRIBUTE_KEYW | 14 | __attribute, ATTRIBUTE_KEYW |
diff --git a/scripts/headers.sh b/scripts/headers.sh index 0308ecc10d5b..1ddcdd38d97f 100755 --- a/scripts/headers.sh +++ b/scripts/headers.sh | |||
| @@ -8,8 +8,6 @@ do_command() | |||
| 8 | { | 8 | { |
| 9 | if [ -f ${srctree}/arch/$2/include/asm/Kbuild ]; then | 9 | if [ -f ${srctree}/arch/$2/include/asm/Kbuild ]; then |
| 10 | make ARCH=$2 KBUILD_HEADERS=$1 headers_$1 | 10 | make ARCH=$2 KBUILD_HEADERS=$1 headers_$1 |
| 11 | elif [ -f ${srctree}/include/asm-$2/Kbuild ]; then | ||
| 12 | make ARCH=$2 KBUILD_HEADERS=$1 headers_$1 | ||
| 13 | else | 11 | else |
| 14 | printf "Ignoring arch: %s\n" ${arch} | 12 | printf "Ignoring arch: %s\n" ${arch} |
| 15 | fi | 13 | fi |
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index 80599e3a7994..999e8a7d5bf7 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile | |||
| @@ -27,6 +27,7 @@ oldconfig: $(obj)/conf | |||
| 27 | $< -o $(Kconfig) | 27 | $< -o $(Kconfig) |
| 28 | 28 | ||
| 29 | silentoldconfig: $(obj)/conf | 29 | silentoldconfig: $(obj)/conf |
| 30 | $(Q)mkdir -p include/generated | ||
| 30 | $< -s $(Kconfig) | 31 | $< -s $(Kconfig) |
| 31 | 32 | ||
| 32 | localmodconfig: $(obj)/streamline_config.pl $(obj)/conf | 33 | localmodconfig: $(obj)/streamline_config.pl $(obj)/conf |
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index b55e72ff2fc6..c4dec80cfd8e 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
| @@ -677,7 +677,7 @@ int conf_write_autoconf(void) | |||
| 677 | struct symbol *sym; | 677 | struct symbol *sym; |
| 678 | const char *str; | 678 | const char *str; |
| 679 | const char *name; | 679 | const char *name; |
| 680 | FILE *out, *out_h; | 680 | FILE *out, *tristate, *out_h; |
| 681 | time_t now; | 681 | time_t now; |
| 682 | int i, l; | 682 | int i, l; |
| 683 | 683 | ||
| @@ -692,9 +692,16 @@ int conf_write_autoconf(void) | |||
| 692 | if (!out) | 692 | if (!out) |
| 693 | return 1; | 693 | return 1; |
| 694 | 694 | ||
| 695 | tristate = fopen(".tmpconfig_tristate", "w"); | ||
| 696 | if (!tristate) { | ||
| 697 | fclose(out); | ||
| 698 | return 1; | ||
| 699 | } | ||
| 700 | |||
| 695 | out_h = fopen(".tmpconfig.h", "w"); | 701 | out_h = fopen(".tmpconfig.h", "w"); |
| 696 | if (!out_h) { | 702 | if (!out_h) { |
| 697 | fclose(out); | 703 | fclose(out); |
| 704 | fclose(tristate); | ||
| 698 | return 1; | 705 | return 1; |
| 699 | } | 706 | } |
| 700 | 707 | ||
| @@ -707,6 +714,9 @@ int conf_write_autoconf(void) | |||
| 707 | "# %s" | 714 | "# %s" |
| 708 | "#\n", | 715 | "#\n", |
| 709 | sym_get_string_value(sym), ctime(&now)); | 716 | sym_get_string_value(sym), ctime(&now)); |
| 717 | fprintf(tristate, "#\n" | ||
| 718 | "# Automatically generated - do not edit\n" | ||
| 719 | "\n"); | ||
| 710 | fprintf(out_h, "/*\n" | 720 | fprintf(out_h, "/*\n" |
| 711 | " * Automatically generated C config: don't edit\n" | 721 | " * Automatically generated C config: don't edit\n" |
| 712 | " * Linux kernel version: %s\n" | 722 | " * Linux kernel version: %s\n" |
| @@ -727,10 +737,14 @@ int conf_write_autoconf(void) | |||
| 727 | break; | 737 | break; |
| 728 | case mod: | 738 | case mod: |
| 729 | fprintf(out, "CONFIG_%s=m\n", sym->name); | 739 | fprintf(out, "CONFIG_%s=m\n", sym->name); |
| 740 | fprintf(tristate, "CONFIG_%s=M\n", sym->name); | ||
| 730 | fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name); | 741 | fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name); |
| 731 | break; | 742 | break; |
| 732 | case yes: | 743 | case yes: |
| 733 | fprintf(out, "CONFIG_%s=y\n", sym->name); | 744 | fprintf(out, "CONFIG_%s=y\n", sym->name); |
| 745 | if (sym->type == S_TRISTATE) | ||
| 746 | fprintf(tristate, "CONFIG_%s=Y\n", | ||
| 747 | sym->name); | ||
| 734 | fprintf(out_h, "#define CONFIG_%s 1\n", sym->name); | 748 | fprintf(out_h, "#define CONFIG_%s 1\n", sym->name); |
| 735 | break; | 749 | break; |
| 736 | } | 750 | } |
| @@ -772,13 +786,19 @@ int conf_write_autoconf(void) | |||
| 772 | } | 786 | } |
| 773 | } | 787 | } |
| 774 | fclose(out); | 788 | fclose(out); |
| 789 | fclose(tristate); | ||
| 775 | fclose(out_h); | 790 | fclose(out_h); |
| 776 | 791 | ||
| 777 | name = getenv("KCONFIG_AUTOHEADER"); | 792 | name = getenv("KCONFIG_AUTOHEADER"); |
| 778 | if (!name) | 793 | if (!name) |
| 779 | name = "include/linux/autoconf.h"; | 794 | name = "include/generated/autoconf.h"; |
| 780 | if (rename(".tmpconfig.h", name)) | 795 | if (rename(".tmpconfig.h", name)) |
| 781 | return 1; | 796 | return 1; |
| 797 | name = getenv("KCONFIG_TRISTATE"); | ||
| 798 | if (!name) | ||
| 799 | name = "include/config/tristate.conf"; | ||
| 800 | if (rename(".tmpconfig_tristate", name)) | ||
| 801 | return 1; | ||
| 782 | name = conf_get_autoconfig_name(); | 802 | name = conf_get_autoconfig_name(); |
| 783 | /* | 803 | /* |
| 784 | * This must be the last step, kbuild has a dependency on auto.conf | 804 | * This must be the last step, kbuild has a dependency on auto.conf |
diff --git a/scripts/mkcompile_h b/scripts/mkcompile_h index bce3d0fe6fbd..23dbad80cce9 100755 --- a/scripts/mkcompile_h +++ b/scripts/mkcompile_h | |||
| @@ -14,7 +14,7 @@ vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; } | |||
| 14 | # So "sudo make install" won't change the "compiled by <user>" | 14 | # So "sudo make install" won't change the "compiled by <user>" |
| 15 | # do "compiled by root" | 15 | # do "compiled by root" |
| 16 | 16 | ||
| 17 | if [ -r $TARGET -a ! -O include/linux/autoconf.h ]; then | 17 | if [ -r $TARGET -a ! -O include/generated/autoconf.h ]; then |
| 18 | vecho " SKIPPED $TARGET" | 18 | vecho " SKIPPED $TARGET" |
| 19 | exit 0 | 19 | exit 0 |
| 20 | fi | 20 | fi |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 6c4ffc767b91..20923613467c 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | #include <stdio.h> | 15 | #include <stdio.h> |
| 16 | #include <ctype.h> | 16 | #include <ctype.h> |
| 17 | #include "modpost.h" | 17 | #include "modpost.h" |
| 18 | #include "../../include/linux/autoconf.h" | 18 | #include "../../include/generated/autoconf.h" |
| 19 | #include "../../include/linux/license.h" | 19 | #include "../../include/linux/license.h" |
| 20 | 20 | ||
| 21 | /* Some toolchains use a `_' prefix for all user symbols. */ | 21 | /* Some toolchains use a `_' prefix for all user symbols. */ |
diff --git a/scripts/package/Makefile b/scripts/package/Makefile index f67cc885c807..62fcc3a7f4d3 100644 --- a/scripts/package/Makefile +++ b/scripts/package/Makefile | |||
| @@ -77,9 +77,27 @@ clean-files += $(objtree)/binkernel.spec | |||
| 77 | 77 | ||
| 78 | # Deb target | 78 | # Deb target |
| 79 | # --------------------------------------------------------------------------- | 79 | # --------------------------------------------------------------------------- |
| 80 | quiet_cmd_builddeb = BUILDDEB | ||
| 81 | cmd_builddeb = set -e; \ | ||
| 82 | test `id -u` = 0 || \ | ||
| 83 | test -n "$(KBUILD_PKG_ROOTCMD)" || { \ | ||
| 84 | which fakeroot >/dev/null 2>&1 && \ | ||
| 85 | KBUILD_PKG_ROOTCMD="fakeroot -u"; \ | ||
| 86 | } || { \ | ||
| 87 | echo; \ | ||
| 88 | echo "builddeb must be run as root (or using fakeroot)."; \ | ||
| 89 | echo "KBUILD_PKG_ROOTCMD is unset and fakeroot not found."; \ | ||
| 90 | echo "Try setting KBUILD_PKG_ROOTCMD to a command to acquire"; \ | ||
| 91 | echo "root privileges (e.g., 'fakeroot -u' or 'sudo')."; \ | ||
| 92 | false; \ | ||
| 93 | } && \ | ||
| 94 | \ | ||
| 95 | $$KBUILD_PKG_ROOTCMD $(CONFIG_SHELL) \ | ||
| 96 | $(srctree)/scripts/package/builddeb | ||
| 97 | |||
| 80 | deb-pkg: FORCE | 98 | deb-pkg: FORCE |
| 81 | $(MAKE) KBUILD_SRC= | 99 | $(MAKE) KBUILD_SRC= |
| 82 | $(CONFIG_SHELL) $(srctree)/scripts/package/builddeb | 100 | $(call cmd,builddeb) |
| 83 | 101 | ||
| 84 | clean-dirs += $(objtree)/debian/ | 102 | clean-dirs += $(objtree)/debian/ |
| 85 | 103 | ||
diff --git a/scripts/package/buildtar b/scripts/package/buildtar index b1fd48db1640..51b2aa0acb82 100644 --- a/scripts/package/buildtar +++ b/scripts/package/buildtar | |||
| @@ -101,7 +101,11 @@ esac | |||
| 101 | # | 101 | # |
| 102 | ( | 102 | ( |
| 103 | cd "${tmpdir}" | 103 | cd "${tmpdir}" |
| 104 | tar cf - . | ${compress} > "${tarball}${file_ext}" | 104 | opts= |
| 105 | if tar --owner=root --group=root --help >/dev/null 2>&1; then | ||
| 106 | opts="--owner=root --group=root" | ||
| 107 | fi | ||
| 108 | tar cf - . $opts | ${compress} > "${tarball}${file_ext}" | ||
| 105 | ) | 109 | ) |
| 106 | 110 | ||
| 107 | echo "Tarball successfully created in ${tarball}${file_ext}" | 111 | echo "Tarball successfully created in ${tarball}${file_ext}" |
diff --git a/scripts/tags.sh b/scripts/tags.sh index d52f7a01557c..1a0c44d7c4a7 100755 --- a/scripts/tags.sh +++ b/scripts/tags.sh | |||
| @@ -89,7 +89,13 @@ all_defconfigs() | |||
| 89 | 89 | ||
| 90 | docscope() | 90 | docscope() |
| 91 | { | 91 | { |
| 92 | (echo \-k; echo \-q; all_sources) > cscope.files | 92 | # always use absolute paths for cscope, as recommended by cscope |
| 93 | # upstream | ||
| 94 | case "$tree" in | ||
| 95 | /*) ;; | ||
| 96 | *) tree=$PWD/$tree ;; | ||
| 97 | esac | ||
| 98 | (cd /; echo \-k; echo \-q; all_sources) > cscope.files | ||
| 93 | cscope -b -f cscope.out | 99 | cscope -b -f cscope.out |
| 94 | } | 100 | } |
| 95 | 101 | ||
diff --git a/scripts/unifdef.c b/scripts/unifdef.c index 30d459fb0709..44d39785e50d 100644 --- a/scripts/unifdef.c +++ b/scripts/unifdef.c | |||
| @@ -1,13 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2002 - 2005 Tony Finch <dot@dotat.at>. All rights reserved. | 2 | * Copyright (c) 2002 - 2009 Tony Finch <dot@dotat.at> |
| 3 | * | ||
| 4 | * This code is derived from software contributed to Berkeley by Dave Yost. | ||
| 5 | * It was rewritten to support ANSI C by Tony Finch. The original version of | ||
| 6 | * unifdef carried the following copyright notice. None of its code remains | ||
| 7 | * in this version (though some of the names remain). | ||
| 8 | * | ||
| 9 | * Copyright (c) 1985, 1993 | ||
| 10 | * The Regents of the University of California. All rights reserved. | ||
| 11 | * | 3 | * |
| 12 | * Redistribution and use in source and binary forms, with or without | 4 | * Redistribution and use in source and binary forms, with or without |
| 13 | * modification, are permitted provided that the following conditions | 5 | * modification, are permitted provided that the following conditions |
| @@ -31,23 +23,20 @@ | |||
| 31 | * SUCH DAMAGE. | 23 | * SUCH DAMAGE. |
| 32 | */ | 24 | */ |
| 33 | 25 | ||
| 34 | #include <sys/cdefs.h> | 26 | /* |
| 27 | * This code was derived from software contributed to Berkeley by Dave Yost. | ||
| 28 | * It was rewritten to support ANSI C by Tony Finch. The original version | ||
| 29 | * of unifdef carried the 4-clause BSD copyright licence. None of its code | ||
| 30 | * remains in this version (though some of the names remain) so it now | ||
| 31 | * carries a more liberal licence. | ||
| 32 | * | ||
| 33 | * The latest version is available from http://dotat.at/prog/unifdef | ||
| 34 | */ | ||
| 35 | 35 | ||
| 36 | #ifndef lint | 36 | static const char * const copyright[] = { |
| 37 | #if 0 | 37 | "@(#) Copyright (c) 2002 - 2009 Tony Finch <dot@dotat.at>\n", |
| 38 | static const char copyright[] = | 38 | "$dotat: unifdef/unifdef.c,v 1.190 2009/11/27 17:21:26 fanf2 Exp $", |
| 39 | "@(#) Copyright (c) 1985, 1993\n\ | 39 | }; |
| 40 | The Regents of the University of California. All rights reserved.\n"; | ||
| 41 | #endif | ||
| 42 | #ifdef __IDSTRING | ||
| 43 | __IDSTRING(Berkeley, "@(#)unifdef.c 8.1 (Berkeley) 6/6/93"); | ||
| 44 | __IDSTRING(NetBSD, "$NetBSD: unifdef.c,v 1.8 2000/07/03 02:51:36 matt Exp $"); | ||
| 45 | __IDSTRING(dotat, "$dotat: things/unifdef.c,v 1.171 2005/03/08 12:38:48 fanf2 Exp $"); | ||
| 46 | #endif | ||
| 47 | #endif /* not lint */ | ||
| 48 | #ifdef __FBSDID | ||
| 49 | __FBSDID("$FreeBSD: /repoman/r/ncvs/src/usr.bin/unifdef/unifdef.c,v 1.20 2005/05/21 09:55:09 ru Exp $"); | ||
| 50 | #endif | ||
| 51 | 40 | ||
| 52 | /* | 41 | /* |
| 53 | * unifdef - remove ifdef'ed lines | 42 | * unifdef - remove ifdef'ed lines |
| @@ -72,8 +61,6 @@ __FBSDID("$FreeBSD: /repoman/r/ncvs/src/usr.bin/unifdef/unifdef.c,v 1.20 2005/05 | |||
| 72 | #include <string.h> | 61 | #include <string.h> |
| 73 | #include <unistd.h> | 62 | #include <unistd.h> |
| 74 | 63 | ||
| 75 | size_t strlcpy(char *dst, const char *src, size_t siz); | ||
| 76 | |||
| 77 | /* types of input lines: */ | 64 | /* types of input lines: */ |
| 78 | typedef enum { | 65 | typedef enum { |
| 79 | LT_TRUEI, /* a true #if with ignore flag */ | 66 | LT_TRUEI, /* a true #if with ignore flag */ |
| @@ -90,6 +77,7 @@ typedef enum { | |||
| 90 | LT_DODGY_LAST = LT_DODGY + LT_ENDIF, | 77 | LT_DODGY_LAST = LT_DODGY + LT_ENDIF, |
| 91 | LT_PLAIN, /* ordinary line */ | 78 | LT_PLAIN, /* ordinary line */ |
| 92 | LT_EOF, /* end of file */ | 79 | LT_EOF, /* end of file */ |
| 80 | LT_ERROR, /* unevaluable #if */ | ||
| 93 | LT_COUNT | 81 | LT_COUNT |
| 94 | } Linetype; | 82 | } Linetype; |
| 95 | 83 | ||
| @@ -100,7 +88,7 @@ static char const * const linetype_name[] = { | |||
| 100 | "DODGY IF", "DODGY TRUE", "DODGY FALSE", | 88 | "DODGY IF", "DODGY TRUE", "DODGY FALSE", |
| 101 | "DODGY ELIF", "DODGY ELTRUE", "DODGY ELFALSE", | 89 | "DODGY ELIF", "DODGY ELTRUE", "DODGY ELFALSE", |
| 102 | "DODGY ELSE", "DODGY ENDIF", | 90 | "DODGY ELSE", "DODGY ENDIF", |
| 103 | "PLAIN", "EOF" | 91 | "PLAIN", "EOF", "ERROR" |
| 104 | }; | 92 | }; |
| 105 | 93 | ||
| 106 | /* state of #if processing */ | 94 | /* state of #if processing */ |
| @@ -168,11 +156,13 @@ static char const * const linestate_name[] = { | |||
| 168 | * Globals. | 156 | * Globals. |
| 169 | */ | 157 | */ |
| 170 | 158 | ||
| 159 | static bool compblank; /* -B: compress blank lines */ | ||
| 160 | static bool lnblank; /* -b: blank deleted lines */ | ||
| 171 | static bool complement; /* -c: do the complement */ | 161 | static bool complement; /* -c: do the complement */ |
| 172 | static bool debugging; /* -d: debugging reports */ | 162 | static bool debugging; /* -d: debugging reports */ |
| 173 | static bool iocccok; /* -e: fewer IOCCC errors */ | 163 | static bool iocccok; /* -e: fewer IOCCC errors */ |
| 164 | static bool strictlogic; /* -K: keep ambiguous #ifs */ | ||
| 174 | static bool killconsts; /* -k: eval constant #ifs */ | 165 | static bool killconsts; /* -k: eval constant #ifs */ |
| 175 | static bool lnblank; /* -l: blank deleted lines */ | ||
| 176 | static bool lnnum; /* -n: add #line directives */ | 166 | static bool lnnum; /* -n: add #line directives */ |
| 177 | static bool symlist; /* -s: output symbol list */ | 167 | static bool symlist; /* -s: output symbol list */ |
| 178 | static bool text; /* -t: this is a text file */ | 168 | static bool text; /* -t: this is a text file */ |
| @@ -196,7 +186,9 @@ static bool ignoring[MAXDEPTH]; /* ignore comments state */ | |||
| 196 | static int stifline[MAXDEPTH]; /* start of current #if */ | 186 | static int stifline[MAXDEPTH]; /* start of current #if */ |
| 197 | static int depth; /* current #if nesting */ | 187 | static int depth; /* current #if nesting */ |
| 198 | static int delcount; /* count of deleted lines */ | 188 | static int delcount; /* count of deleted lines */ |
| 199 | static bool keepthis; /* don't delete constant #if */ | 189 | static unsigned blankcount; /* count of blank lines */ |
| 190 | static unsigned blankmax; /* maximum recent blankcount */ | ||
| 191 | static bool constexpr; /* constant #if expression */ | ||
| 200 | 192 | ||
| 201 | static int exitstat; /* program exit status */ | 193 | static int exitstat; /* program exit status */ |
| 202 | 194 | ||
| @@ -206,13 +198,14 @@ static void done(void); | |||
| 206 | static void error(const char *); | 198 | static void error(const char *); |
| 207 | static int findsym(const char *); | 199 | static int findsym(const char *); |
| 208 | static void flushline(bool); | 200 | static void flushline(bool); |
| 209 | static Linetype get_line(void); | 201 | static Linetype parseline(void); |
| 210 | static Linetype ifeval(const char **); | 202 | static Linetype ifeval(const char **); |
| 211 | static void ignoreoff(void); | 203 | static void ignoreoff(void); |
| 212 | static void ignoreon(void); | 204 | static void ignoreon(void); |
| 213 | static void keywordedit(const char *); | 205 | static void keywordedit(const char *); |
| 214 | static void nest(void); | 206 | static void nest(void); |
| 215 | static void process(void); | 207 | static void process(void); |
| 208 | static const char *skipargs(const char *); | ||
| 216 | static const char *skipcomment(const char *); | 209 | static const char *skipcomment(const char *); |
| 217 | static const char *skipsym(const char *); | 210 | static const char *skipsym(const char *); |
| 218 | static void state(Ifstate); | 211 | static void state(Ifstate); |
| @@ -220,7 +213,7 @@ static int strlcmp(const char *, const char *, size_t); | |||
| 220 | static void unnest(void); | 213 | static void unnest(void); |
| 221 | static void usage(void); | 214 | static void usage(void); |
| 222 | 215 | ||
| 223 | #define endsym(c) (!isalpha((unsigned char)c) && !isdigit((unsigned char)c) && c != '_') | 216 | #define endsym(c) (!isalnum((unsigned char)c) && c != '_') |
| 224 | 217 | ||
| 225 | /* | 218 | /* |
| 226 | * The main program. | 219 | * The main program. |
| @@ -230,7 +223,7 @@ main(int argc, char *argv[]) | |||
| 230 | { | 223 | { |
| 231 | int opt; | 224 | int opt; |
| 232 | 225 | ||
| 233 | while ((opt = getopt(argc, argv, "i:D:U:I:cdeklnst")) != -1) | 226 | while ((opt = getopt(argc, argv, "i:D:U:I:BbcdeKklnst")) != -1) |
| 234 | switch (opt) { | 227 | switch (opt) { |
| 235 | case 'i': /* treat stuff controlled by these symbols as text */ | 228 | case 'i': /* treat stuff controlled by these symbols as text */ |
| 236 | /* | 229 | /* |
| @@ -255,6 +248,13 @@ main(int argc, char *argv[]) | |||
| 255 | case 'I': | 248 | case 'I': |
| 256 | /* no-op for compatibility with cpp */ | 249 | /* no-op for compatibility with cpp */ |
| 257 | break; | 250 | break; |
| 251 | case 'B': /* compress blank lines around removed section */ | ||
| 252 | compblank = true; | ||
| 253 | break; | ||
| 254 | case 'b': /* blank deleted lines instead of omitting them */ | ||
| 255 | case 'l': /* backwards compatibility */ | ||
| 256 | lnblank = true; | ||
| 257 | break; | ||
| 258 | case 'c': /* treat -D as -U and vice versa */ | 258 | case 'c': /* treat -D as -U and vice versa */ |
| 259 | complement = true; | 259 | complement = true; |
| 260 | break; | 260 | break; |
| @@ -264,12 +264,12 @@ main(int argc, char *argv[]) | |||
| 264 | case 'e': /* fewer errors from dodgy lines */ | 264 | case 'e': /* fewer errors from dodgy lines */ |
| 265 | iocccok = true; | 265 | iocccok = true; |
| 266 | break; | 266 | break; |
| 267 | case 'K': /* keep ambiguous #ifs */ | ||
| 268 | strictlogic = true; | ||
| 269 | break; | ||
| 267 | case 'k': /* process constant #ifs */ | 270 | case 'k': /* process constant #ifs */ |
| 268 | killconsts = true; | 271 | killconsts = true; |
| 269 | break; | 272 | break; |
| 270 | case 'l': /* blank deleted lines instead of omitting them */ | ||
| 271 | lnblank = true; | ||
| 272 | break; | ||
| 273 | case 'n': /* add #line directive after deleted lines */ | 273 | case 'n': /* add #line directive after deleted lines */ |
| 274 | lnnum = true; | 274 | lnnum = true; |
| 275 | break; | 275 | break; |
| @@ -284,6 +284,8 @@ main(int argc, char *argv[]) | |||
| 284 | } | 284 | } |
| 285 | argc -= optind; | 285 | argc -= optind; |
| 286 | argv += optind; | 286 | argv += optind; |
| 287 | if (compblank && lnblank) | ||
| 288 | errx(2, "-B and -b are mutually exclusive"); | ||
| 287 | if (argc > 1) { | 289 | if (argc > 1) { |
| 288 | errx(2, "can only do one file"); | 290 | errx(2, "can only do one file"); |
| 289 | } else if (argc == 1 && strcmp(*argv, "-") != 0) { | 291 | } else if (argc == 1 && strcmp(*argv, "-") != 0) { |
| @@ -302,7 +304,7 @@ main(int argc, char *argv[]) | |||
| 302 | static void | 304 | static void |
| 303 | usage(void) | 305 | usage(void) |
| 304 | { | 306 | { |
| 305 | fprintf(stderr, "usage: unifdef [-cdeklnst] [-Ipath]" | 307 | fprintf(stderr, "usage: unifdef [-BbcdeKknst] [-Ipath]" |
| 306 | " [-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym] ... [file]\n"); | 308 | " [-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym] ... [file]\n"); |
| 307 | exit(2); | 309 | exit(2); |
| 308 | } | 310 | } |
| @@ -383,46 +385,46 @@ static state_fn * const trans_table[IS_COUNT][LT_COUNT] = { | |||
| 383 | /* IS_OUTSIDE */ | 385 | /* IS_OUTSIDE */ |
| 384 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Eendif, | 386 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Eendif, |
| 385 | Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eendif, | 387 | Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eendif, |
| 386 | print, done }, | 388 | print, done, abort }, |
| 387 | /* IS_FALSE_PREFIX */ | 389 | /* IS_FALSE_PREFIX */ |
| 388 | { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Strue, Sfalse,Selse, Dendif, | 390 | { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Strue, Sfalse,Selse, Dendif, |
| 389 | Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Eioccc,Eioccc,Eioccc,Eioccc, | 391 | Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Eioccc,Eioccc,Eioccc,Eioccc, |
| 390 | drop, Eeof }, | 392 | drop, Eeof, abort }, |
| 391 | /* IS_TRUE_PREFIX */ | 393 | /* IS_TRUE_PREFIX */ |
| 392 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Dfalse,Dfalse,Dfalse,Delse, Dendif, | 394 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Dfalse,Dfalse,Dfalse,Delse, Dendif, |
| 393 | Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc, | 395 | Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc, |
| 394 | print, Eeof }, | 396 | print, Eeof, abort }, |
| 395 | /* IS_PASS_MIDDLE */ | 397 | /* IS_PASS_MIDDLE */ |
| 396 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Pelif, Mtrue, Delif, Pelse, Pendif, | 398 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Pelif, Mtrue, Delif, Pelse, Pendif, |
| 397 | Oiffy, Oiffy, Fpass, Oif, Oif, Pelif, Oelif, Oelif, Pelse, Pendif, | 399 | Oiffy, Oiffy, Fpass, Oif, Oif, Pelif, Oelif, Oelif, Pelse, Pendif, |
| 398 | print, Eeof }, | 400 | print, Eeof, abort }, |
| 399 | /* IS_FALSE_MIDDLE */ | 401 | /* IS_FALSE_MIDDLE */ |
| 400 | { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Pelif, Mtrue, Delif, Pelse, Pendif, | 402 | { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Pelif, Mtrue, Delif, Pelse, Pendif, |
| 401 | Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc, | 403 | Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc, |
| 402 | drop, Eeof }, | 404 | drop, Eeof, abort }, |
| 403 | /* IS_TRUE_MIDDLE */ | 405 | /* IS_TRUE_MIDDLE */ |
| 404 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Melif, Melif, Melif, Melse, Pendif, | 406 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Melif, Melif, Melif, Melse, Pendif, |
| 405 | Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Pendif, | 407 | Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Pendif, |
| 406 | print, Eeof }, | 408 | print, Eeof, abort }, |
| 407 | /* IS_PASS_ELSE */ | 409 | /* IS_PASS_ELSE */ |
| 408 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Pendif, | 410 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Pendif, |
| 409 | Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Pendif, | 411 | Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Pendif, |
| 410 | print, Eeof }, | 412 | print, Eeof, abort }, |
| 411 | /* IS_FALSE_ELSE */ | 413 | /* IS_FALSE_ELSE */ |
| 412 | { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Dendif, | 414 | { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Dendif, |
| 413 | Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Eioccc, | 415 | Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Eioccc, |
| 414 | drop, Eeof }, | 416 | drop, Eeof, abort }, |
| 415 | /* IS_TRUE_ELSE */ | 417 | /* IS_TRUE_ELSE */ |
| 416 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Dendif, | 418 | { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Dendif, |
| 417 | Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eioccc, | 419 | Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eioccc, |
| 418 | print, Eeof }, | 420 | print, Eeof, abort }, |
| 419 | /* IS_FALSE_TRAILER */ | 421 | /* IS_FALSE_TRAILER */ |
| 420 | { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Dendif, | 422 | { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Dendif, |
| 421 | Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Eioccc, | 423 | Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Eioccc, |
| 422 | drop, Eeof } | 424 | drop, Eeof, abort } |
| 423 | /*TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF | 425 | /*TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF |
| 424 | TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF (DODGY) | 426 | TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF (DODGY) |
| 425 | PLAIN EOF */ | 427 | PLAIN EOF ERROR */ |
| 426 | }; | 428 | }; |
| 427 | 429 | ||
| 428 | /* | 430 | /* |
| @@ -463,9 +465,11 @@ keywordedit(const char *replacement) | |||
| 463 | static void | 465 | static void |
| 464 | nest(void) | 466 | nest(void) |
| 465 | { | 467 | { |
| 466 | depth += 1; | 468 | if (depth > MAXDEPTH-1) |
| 467 | if (depth >= MAXDEPTH) | 469 | abort(); /* bug */ |
| 470 | if (depth == MAXDEPTH-1) | ||
| 468 | error("Too many levels of nesting"); | 471 | error("Too many levels of nesting"); |
| 472 | depth += 1; | ||
| 469 | stifline[depth] = linenum; | 473 | stifline[depth] = linenum; |
| 470 | } | 474 | } |
| 471 | static void | 475 | static void |
| @@ -490,15 +494,23 @@ flushline(bool keep) | |||
| 490 | if (symlist) | 494 | if (symlist) |
| 491 | return; | 495 | return; |
| 492 | if (keep ^ complement) { | 496 | if (keep ^ complement) { |
| 493 | if (lnnum && delcount > 0) | 497 | bool blankline = tline[strspn(tline, " \t\n")] == '\0'; |
| 494 | printf("#line %d\n", linenum); | 498 | if (blankline && compblank && blankcount != blankmax) { |
| 495 | fputs(tline, stdout); | 499 | delcount += 1; |
| 496 | delcount = 0; | 500 | blankcount += 1; |
| 501 | } else { | ||
| 502 | if (lnnum && delcount > 0) | ||
| 503 | printf("#line %d\n", linenum); | ||
| 504 | fputs(tline, stdout); | ||
| 505 | delcount = 0; | ||
| 506 | blankmax = blankcount = blankline ? blankcount + 1 : 0; | ||
| 507 | } | ||
| 497 | } else { | 508 | } else { |
| 498 | if (lnblank) | 509 | if (lnblank) |
| 499 | putc('\n', stdout); | 510 | putc('\n', stdout); |
| 500 | exitstat = 1; | 511 | exitstat = 1; |
| 501 | delcount += 1; | 512 | delcount += 1; |
| 513 | blankcount = 0; | ||
| 502 | } | 514 | } |
| 503 | } | 515 | } |
| 504 | 516 | ||
| @@ -510,9 +522,12 @@ process(void) | |||
| 510 | { | 522 | { |
| 511 | Linetype lineval; | 523 | Linetype lineval; |
| 512 | 524 | ||
| 525 | /* When compressing blank lines, act as if the file | ||
| 526 | is preceded by a large number of blank lines. */ | ||
| 527 | blankmax = blankcount = 1000; | ||
| 513 | for (;;) { | 528 | for (;;) { |
| 514 | linenum++; | 529 | linenum++; |
| 515 | lineval = get_line(); | 530 | lineval = parseline(); |
| 516 | trans_table[ifstate[depth]][lineval](); | 531 | trans_table[ifstate[depth]][lineval](); |
| 517 | debug("process %s -> %s depth %d", | 532 | debug("process %s -> %s depth %d", |
| 518 | linetype_name[lineval], | 533 | linetype_name[lineval], |
| @@ -526,7 +541,7 @@ process(void) | |||
| 526 | * help from skipcomment(). | 541 | * help from skipcomment(). |
| 527 | */ | 542 | */ |
| 528 | static Linetype | 543 | static Linetype |
| 529 | get_line(void) | 544 | parseline(void) |
| 530 | { | 545 | { |
| 531 | const char *cp; | 546 | const char *cp; |
| 532 | int cursym; | 547 | int cursym; |
| @@ -595,9 +610,21 @@ get_line(void) | |||
| 595 | if (incomment) | 610 | if (incomment) |
| 596 | linestate = LS_DIRTY; | 611 | linestate = LS_DIRTY; |
| 597 | } | 612 | } |
| 598 | /* skipcomment should have changed the state */ | 613 | /* skipcomment normally changes the state, except |
| 599 | if (linestate == LS_HASH) | 614 | if the last line of the file lacks a newline, or |
| 600 | abort(); /* bug */ | 615 | if there is too much whitespace in a directive */ |
| 616 | if (linestate == LS_HASH) { | ||
| 617 | size_t len = cp - tline; | ||
| 618 | if (fgets(tline + len, MAXLINE - len, input) == NULL) { | ||
| 619 | /* append the missing newline */ | ||
| 620 | tline[len+0] = '\n'; | ||
| 621 | tline[len+1] = '\0'; | ||
| 622 | cp++; | ||
| 623 | linestate = LS_START; | ||
| 624 | } else { | ||
| 625 | linestate = LS_DIRTY; | ||
| 626 | } | ||
| 627 | } | ||
| 601 | } | 628 | } |
| 602 | if (linestate == LS_DIRTY) { | 629 | if (linestate == LS_DIRTY) { |
| 603 | while (*cp != '\0') | 630 | while (*cp != '\0') |
| @@ -610,17 +637,40 @@ get_line(void) | |||
| 610 | 637 | ||
| 611 | /* | 638 | /* |
| 612 | * These are the binary operators that are supported by the expression | 639 | * These are the binary operators that are supported by the expression |
| 613 | * evaluator. Note that if support for division is added then we also | 640 | * evaluator. |
| 614 | * need short-circuiting booleans because of divide-by-zero. | ||
| 615 | */ | 641 | */ |
| 616 | static int op_lt(int a, int b) { return (a < b); } | 642 | static Linetype op_strict(int *p, int v, Linetype at, Linetype bt) { |
| 617 | static int op_gt(int a, int b) { return (a > b); } | 643 | if(at == LT_IF || bt == LT_IF) return (LT_IF); |
| 618 | static int op_le(int a, int b) { return (a <= b); } | 644 | return (*p = v, v ? LT_TRUE : LT_FALSE); |
| 619 | static int op_ge(int a, int b) { return (a >= b); } | 645 | } |
| 620 | static int op_eq(int a, int b) { return (a == b); } | 646 | static Linetype op_lt(int *p, Linetype at, int a, Linetype bt, int b) { |
| 621 | static int op_ne(int a, int b) { return (a != b); } | 647 | return op_strict(p, a < b, at, bt); |
| 622 | static int op_or(int a, int b) { return (a || b); } | 648 | } |
| 623 | static int op_and(int a, int b) { return (a && b); } | 649 | static Linetype op_gt(int *p, Linetype at, int a, Linetype bt, int b) { |
| 650 | return op_strict(p, a > b, at, bt); | ||
| 651 | } | ||
| 652 | static Linetype op_le(int *p, Linetype at, int a, Linetype bt, int b) { | ||
| 653 | return op_strict(p, a <= b, at, bt); | ||
| 654 | } | ||
| 655 | static Linetype op_ge(int *p, Linetype at, int a, Linetype bt, int b) { | ||
| 656 | return op_strict(p, a >= b, at, bt); | ||
| 657 | } | ||
| 658 | static Linetype op_eq(int *p, Linetype at, int a, Linetype bt, int b) { | ||
| 659 | return op_strict(p, a == b, at, bt); | ||
| 660 | } | ||
| 661 | static Linetype op_ne(int *p, Linetype at, int a, Linetype bt, int b) { | ||
| 662 | return op_strict(p, a != b, at, bt); | ||
| 663 | } | ||
| 664 | static Linetype op_or(int *p, Linetype at, int a, Linetype bt, int b) { | ||
| 665 | if (!strictlogic && (at == LT_TRUE || bt == LT_TRUE)) | ||
| 666 | return (*p = 1, LT_TRUE); | ||
| 667 | return op_strict(p, a || b, at, bt); | ||
| 668 | } | ||
| 669 | static Linetype op_and(int *p, Linetype at, int a, Linetype bt, int b) { | ||
| 670 | if (!strictlogic && (at == LT_FALSE || bt == LT_FALSE)) | ||
| 671 | return (*p = 0, LT_FALSE); | ||
| 672 | return op_strict(p, a && b, at, bt); | ||
| 673 | } | ||
| 624 | 674 | ||
| 625 | /* | 675 | /* |
| 626 | * An evaluation function takes three arguments, as follows: (1) a pointer to | 676 | * An evaluation function takes three arguments, as follows: (1) a pointer to |
| @@ -629,8 +679,8 @@ static int op_and(int a, int b) { return (a && b); } | |||
| 629 | * value of the expression; and (3) a pointer to a char* that points to the | 679 | * value of the expression; and (3) a pointer to a char* that points to the |
| 630 | * expression to be evaluated and that is updated to the end of the expression | 680 | * expression to be evaluated and that is updated to the end of the expression |
| 631 | * when evaluation is complete. The function returns LT_FALSE if the value of | 681 | * when evaluation is complete. The function returns LT_FALSE if the value of |
| 632 | * the expression is zero, LT_TRUE if it is non-zero, or LT_IF if the | 682 | * the expression is zero, LT_TRUE if it is non-zero, LT_IF if the expression |
| 633 | * expression could not be evaluated. | 683 | * depends on an unknown symbol, or LT_ERROR if there is a parse failure. |
| 634 | */ | 684 | */ |
| 635 | struct ops; | 685 | struct ops; |
| 636 | 686 | ||
| @@ -649,7 +699,7 @@ static const struct ops { | |||
| 649 | eval_fn *inner; | 699 | eval_fn *inner; |
| 650 | struct op { | 700 | struct op { |
| 651 | const char *str; | 701 | const char *str; |
| 652 | int (*fn)(int, int); | 702 | Linetype (*fn)(int *, Linetype, int, Linetype, int); |
| 653 | } op[5]; | 703 | } op[5]; |
| 654 | } eval_ops[] = { | 704 | } eval_ops[] = { |
| 655 | { eval_table, { { "||", op_or } } }, | 705 | { eval_table, { { "||", op_or } } }, |
| @@ -664,8 +714,8 @@ static const struct ops { | |||
| 664 | 714 | ||
| 665 | /* | 715 | /* |
| 666 | * Function for evaluating the innermost parts of expressions, | 716 | * Function for evaluating the innermost parts of expressions, |
| 667 | * viz. !expr (expr) defined(symbol) symbol number | 717 | * viz. !expr (expr) number defined(symbol) symbol |
| 668 | * We reset the keepthis flag when we find a non-constant subexpression. | 718 | * We reset the constexpr flag in the last two cases. |
| 669 | */ | 719 | */ |
| 670 | static Linetype | 720 | static Linetype |
| 671 | eval_unary(const struct ops *ops, int *valp, const char **cpp) | 721 | eval_unary(const struct ops *ops, int *valp, const char **cpp) |
| @@ -673,68 +723,83 @@ eval_unary(const struct ops *ops, int *valp, const char **cpp) | |||
| 673 | const char *cp; | 723 | const char *cp; |
| 674 | char *ep; | 724 | char *ep; |
| 675 | int sym; | 725 | int sym; |
| 726 | bool defparen; | ||
| 727 | Linetype lt; | ||
| 676 | 728 | ||
| 677 | cp = skipcomment(*cpp); | 729 | cp = skipcomment(*cpp); |
| 678 | if (*cp == '!') { | 730 | if (*cp == '!') { |
| 679 | debug("eval%d !", ops - eval_ops); | 731 | debug("eval%d !", ops - eval_ops); |
| 680 | cp++; | 732 | cp++; |
| 681 | if (eval_unary(ops, valp, &cp) == LT_IF) { | 733 | lt = eval_unary(ops, valp, &cp); |
| 682 | *cpp = cp; | 734 | if (lt == LT_ERROR) |
| 683 | return (LT_IF); | 735 | return (LT_ERROR); |
| 736 | if (lt != LT_IF) { | ||
| 737 | *valp = !*valp; | ||
| 738 | lt = *valp ? LT_TRUE : LT_FALSE; | ||
| 684 | } | 739 | } |
| 685 | *valp = !*valp; | ||
| 686 | } else if (*cp == '(') { | 740 | } else if (*cp == '(') { |
| 687 | cp++; | 741 | cp++; |
| 688 | debug("eval%d (", ops - eval_ops); | 742 | debug("eval%d (", ops - eval_ops); |
| 689 | if (eval_table(eval_ops, valp, &cp) == LT_IF) | 743 | lt = eval_table(eval_ops, valp, &cp); |
| 690 | return (LT_IF); | 744 | if (lt == LT_ERROR) |
| 745 | return (LT_ERROR); | ||
| 691 | cp = skipcomment(cp); | 746 | cp = skipcomment(cp); |
| 692 | if (*cp++ != ')') | 747 | if (*cp++ != ')') |
| 693 | return (LT_IF); | 748 | return (LT_ERROR); |
| 694 | } else if (isdigit((unsigned char)*cp)) { | 749 | } else if (isdigit((unsigned char)*cp)) { |
| 695 | debug("eval%d number", ops - eval_ops); | 750 | debug("eval%d number", ops - eval_ops); |
| 696 | *valp = strtol(cp, &ep, 0); | 751 | *valp = strtol(cp, &ep, 0); |
| 752 | if (ep == cp) | ||
| 753 | return (LT_ERROR); | ||
| 754 | lt = *valp ? LT_TRUE : LT_FALSE; | ||
| 697 | cp = skipsym(cp); | 755 | cp = skipsym(cp); |
| 698 | } else if (strncmp(cp, "defined", 7) == 0 && endsym(cp[7])) { | 756 | } else if (strncmp(cp, "defined", 7) == 0 && endsym(cp[7])) { |
| 699 | cp = skipcomment(cp+7); | 757 | cp = skipcomment(cp+7); |
| 700 | debug("eval%d defined", ops - eval_ops); | 758 | debug("eval%d defined", ops - eval_ops); |
| 701 | if (*cp++ != '(') | 759 | if (*cp == '(') { |
| 702 | return (LT_IF); | 760 | cp = skipcomment(cp+1); |
| 703 | cp = skipcomment(cp); | 761 | defparen = true; |
| 762 | } else { | ||
| 763 | defparen = false; | ||
| 764 | } | ||
| 704 | sym = findsym(cp); | 765 | sym = findsym(cp); |
| 705 | cp = skipsym(cp); | 766 | if (sym < 0) { |
| 706 | cp = skipcomment(cp); | 767 | lt = LT_IF; |
| 707 | if (*cp++ != ')') | 768 | } else { |
| 708 | return (LT_IF); | ||
| 709 | if (sym >= 0) | ||
| 710 | *valp = (value[sym] != NULL); | 769 | *valp = (value[sym] != NULL); |
| 711 | else { | 770 | lt = *valp ? LT_TRUE : LT_FALSE; |
| 712 | *cpp = cp; | ||
| 713 | return (LT_IF); | ||
| 714 | } | 771 | } |
| 715 | keepthis = false; | 772 | cp = skipsym(cp); |
| 773 | cp = skipcomment(cp); | ||
| 774 | if (defparen && *cp++ != ')') | ||
| 775 | return (LT_ERROR); | ||
| 776 | constexpr = false; | ||
| 716 | } else if (!endsym(*cp)) { | 777 | } else if (!endsym(*cp)) { |
| 717 | debug("eval%d symbol", ops - eval_ops); | 778 | debug("eval%d symbol", ops - eval_ops); |
| 718 | sym = findsym(cp); | 779 | sym = findsym(cp); |
| 719 | if (sym < 0) | 780 | cp = skipsym(cp); |
| 720 | return (LT_IF); | 781 | if (sym < 0) { |
| 721 | if (value[sym] == NULL) | 782 | lt = LT_IF; |
| 783 | cp = skipargs(cp); | ||
| 784 | } else if (value[sym] == NULL) { | ||
| 722 | *valp = 0; | 785 | *valp = 0; |
| 723 | else { | 786 | lt = LT_FALSE; |
| 787 | } else { | ||
| 724 | *valp = strtol(value[sym], &ep, 0); | 788 | *valp = strtol(value[sym], &ep, 0); |
| 725 | if (*ep != '\0' || ep == value[sym]) | 789 | if (*ep != '\0' || ep == value[sym]) |
| 726 | return (LT_IF); | 790 | return (LT_ERROR); |
| 791 | lt = *valp ? LT_TRUE : LT_FALSE; | ||
| 792 | cp = skipargs(cp); | ||
| 727 | } | 793 | } |
| 728 | cp = skipsym(cp); | 794 | constexpr = false; |
| 729 | keepthis = false; | ||
| 730 | } else { | 795 | } else { |
| 731 | debug("eval%d bad expr", ops - eval_ops); | 796 | debug("eval%d bad expr", ops - eval_ops); |
| 732 | return (LT_IF); | 797 | return (LT_ERROR); |
| 733 | } | 798 | } |
| 734 | 799 | ||
| 735 | *cpp = cp; | 800 | *cpp = cp; |
| 736 | debug("eval%d = %d", ops - eval_ops, *valp); | 801 | debug("eval%d = %d", ops - eval_ops, *valp); |
| 737 | return (*valp ? LT_TRUE : LT_FALSE); | 802 | return (lt); |
| 738 | } | 803 | } |
| 739 | 804 | ||
| 740 | /* | 805 | /* |
| @@ -746,11 +811,13 @@ eval_table(const struct ops *ops, int *valp, const char **cpp) | |||
| 746 | const struct op *op; | 811 | const struct op *op; |
| 747 | const char *cp; | 812 | const char *cp; |
| 748 | int val; | 813 | int val; |
| 749 | Linetype lhs, rhs; | 814 | Linetype lt, rt; |
| 750 | 815 | ||
| 751 | debug("eval%d", ops - eval_ops); | 816 | debug("eval%d", ops - eval_ops); |
| 752 | cp = *cpp; | 817 | cp = *cpp; |
| 753 | lhs = ops->inner(ops+1, valp, &cp); | 818 | lt = ops->inner(ops+1, valp, &cp); |
| 819 | if (lt == LT_ERROR) | ||
| 820 | return (LT_ERROR); | ||
| 754 | for (;;) { | 821 | for (;;) { |
| 755 | cp = skipcomment(cp); | 822 | cp = skipcomment(cp); |
| 756 | for (op = ops->op; op->str != NULL; op++) | 823 | for (op = ops->op; op->str != NULL; op++) |
| @@ -760,32 +827,16 @@ eval_table(const struct ops *ops, int *valp, const char **cpp) | |||
| 760 | break; | 827 | break; |
| 761 | cp += strlen(op->str); | 828 | cp += strlen(op->str); |
| 762 | debug("eval%d %s", ops - eval_ops, op->str); | 829 | debug("eval%d %s", ops - eval_ops, op->str); |
| 763 | rhs = ops->inner(ops+1, &val, &cp); | 830 | rt = ops->inner(ops+1, &val, &cp); |
| 764 | if (op->fn == op_and && (lhs == LT_FALSE || rhs == LT_FALSE)) { | 831 | if (rt == LT_ERROR) |
| 765 | debug("eval%d: and always false", ops - eval_ops); | 832 | return (LT_ERROR); |
| 766 | if (lhs == LT_IF) | 833 | lt = op->fn(valp, lt, *valp, rt, val); |
| 767 | *valp = val; | ||
| 768 | lhs = LT_FALSE; | ||
| 769 | continue; | ||
| 770 | } | ||
| 771 | if (op->fn == op_or && (lhs == LT_TRUE || rhs == LT_TRUE)) { | ||
| 772 | debug("eval%d: or always true", ops - eval_ops); | ||
| 773 | if (lhs == LT_IF) | ||
| 774 | *valp = val; | ||
| 775 | lhs = LT_TRUE; | ||
| 776 | continue; | ||
| 777 | } | ||
| 778 | if (rhs == LT_IF) | ||
| 779 | lhs = LT_IF; | ||
| 780 | if (lhs != LT_IF) | ||
| 781 | *valp = op->fn(*valp, val); | ||
| 782 | } | 834 | } |
| 783 | 835 | ||
| 784 | *cpp = cp; | 836 | *cpp = cp; |
| 785 | debug("eval%d = %d", ops - eval_ops, *valp); | 837 | debug("eval%d = %d", ops - eval_ops, *valp); |
| 786 | if (lhs != LT_IF) | 838 | debug("eval%d lt = %s", ops - eval_ops, linetype_name[lt]); |
| 787 | lhs = (*valp ? LT_TRUE : LT_FALSE); | 839 | return (lt); |
| 788 | return lhs; | ||
| 789 | } | 840 | } |
| 790 | 841 | ||
| 791 | /* | 842 | /* |
| @@ -796,17 +847,14 @@ eval_table(const struct ops *ops, int *valp, const char **cpp) | |||
| 796 | static Linetype | 847 | static Linetype |
| 797 | ifeval(const char **cpp) | 848 | ifeval(const char **cpp) |
| 798 | { | 849 | { |
| 799 | const char *cp = *cpp; | ||
| 800 | int ret; | 850 | int ret; |
| 801 | int val; | 851 | int val = 0; |
| 802 | 852 | ||
| 803 | debug("eval %s", *cpp); | 853 | debug("eval %s", *cpp); |
| 804 | keepthis = killconsts ? false : true; | 854 | constexpr = killconsts ? false : true; |
| 805 | ret = eval_table(eval_ops, &val, &cp); | 855 | ret = eval_table(eval_ops, &val, cpp); |
| 806 | if (ret != LT_IF) | ||
| 807 | *cpp = cp; | ||
| 808 | debug("eval = %d", val); | 856 | debug("eval = %d", val); |
| 809 | return (keepthis ? LT_IF : ret); | 857 | return (constexpr ? LT_IF : ret == LT_ERROR ? LT_IF : ret); |
| 810 | } | 858 | } |
| 811 | 859 | ||
| 812 | /* | 860 | /* |
| @@ -918,6 +966,31 @@ skipcomment(const char *cp) | |||
| 918 | } | 966 | } |
| 919 | 967 | ||
| 920 | /* | 968 | /* |
| 969 | * Skip macro arguments. | ||
| 970 | */ | ||
| 971 | static const char * | ||
| 972 | skipargs(const char *cp) | ||
| 973 | { | ||
| 974 | const char *ocp = cp; | ||
| 975 | int level = 0; | ||
| 976 | cp = skipcomment(cp); | ||
| 977 | if (*cp != '(') | ||
| 978 | return (cp); | ||
| 979 | do { | ||
| 980 | if (*cp == '(') | ||
| 981 | level++; | ||
| 982 | if (*cp == ')') | ||
| 983 | level--; | ||
| 984 | cp = skipcomment(cp+1); | ||
| 985 | } while (level != 0 && *cp != '\0'); | ||
| 986 | if (level == 0) | ||
| 987 | return (cp); | ||
| 988 | else | ||
| 989 | /* Rewind and re-detect the syntax error later. */ | ||
| 990 | return (ocp); | ||
| 991 | } | ||
| 992 | |||
| 993 | /* | ||
| 921 | * Skip over an identifier. | 994 | * Skip over an identifier. |
| 922 | */ | 995 | */ |
| 923 | static const char * | 996 | static const char * |
| @@ -929,7 +1002,7 @@ skipsym(const char *cp) | |||
| 929 | } | 1002 | } |
| 930 | 1003 | ||
| 931 | /* | 1004 | /* |
| 932 | * Look for the symbol in the symbol table. If is is found, we return | 1005 | * Look for the symbol in the symbol table. If it is found, we return |
| 933 | * the symbol table index, else we return -1. | 1006 | * the symbol table index, else we return -1. |
| 934 | */ | 1007 | */ |
| 935 | static int | 1008 | static int |
diff --git a/usr/gen_init_cpio.c b/usr/gen_init_cpio.c index 83b3dde1a83b..b2b3c2d1cf8b 100644 --- a/usr/gen_init_cpio.c +++ b/usr/gen_init_cpio.c | |||
| @@ -354,7 +354,10 @@ static int cpio_mkfile(const char *name, const char *location, | |||
| 354 | push_pad(); | 354 | push_pad(); |
| 355 | 355 | ||
| 356 | if (size) { | 356 | if (size) { |
| 357 | fwrite(filebuf, size, 1, stdout); | 357 | if (fwrite(filebuf, size, 1, stdout) != 1) { |
| 358 | fprintf(stderr, "writing filebuf failed\n"); | ||
| 359 | goto error; | ||
| 360 | } | ||
| 358 | offset += size; | 361 | offset += size; |
| 359 | push_pad(); | 362 | push_pad(); |
| 360 | } | 363 | } |
