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 | } |