diff options
111 files changed, 2756 insertions, 654 deletions
diff --git a/.gitignore b/.gitignore index fb2190c61af0..de6344e15706 100644 --- a/.gitignore +++ b/.gitignore | |||
@@ -37,6 +37,7 @@ modules.builtin | |||
37 | tags | 37 | tags |
38 | TAGS | 38 | TAGS |
39 | vmlinux | 39 | vmlinux |
40 | vmlinuz | ||
40 | System.map | 41 | System.map |
41 | Module.markers | 42 | Module.markers |
42 | Module.symvers | 43 | Module.symvers |
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index 220cc6376ef8..0d07513a67a6 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt | |||
@@ -177,7 +177,6 @@ read the file /proc/PID/status: | |||
177 | CapBnd: ffffffffffffffff | 177 | CapBnd: ffffffffffffffff |
178 | voluntary_ctxt_switches: 0 | 178 | voluntary_ctxt_switches: 0 |
179 | nonvoluntary_ctxt_switches: 1 | 179 | nonvoluntary_ctxt_switches: 1 |
180 | Stack usage: 12 kB | ||
181 | 180 | ||
182 | This shows you nearly the same information you would get if you viewed it with | 181 | This shows you nearly the same information you would get if you viewed it with |
183 | the ps command. In fact, ps uses the proc file system to obtain its | 182 | the ps command. In fact, ps uses the proc file system to obtain its |
@@ -231,7 +230,6 @@ Table 1-2: Contents of the statm files (as of 2.6.30-rc7) | |||
231 | Mems_allowed_list Same as previous, but in "list format" | 230 | Mems_allowed_list Same as previous, but in "list format" |
232 | voluntary_ctxt_switches number of voluntary context switches | 231 | voluntary_ctxt_switches number of voluntary context switches |
233 | nonvoluntary_ctxt_switches number of non voluntary context switches | 232 | nonvoluntary_ctxt_switches number of non voluntary context switches |
234 | Stack usage: stack usage high water mark (round up to page size) | ||
235 | .............................................................................. | 233 | .............................................................................. |
236 | 234 | ||
237 | Table 1-3: Contents of the statm files (as of 2.6.8-rc3) | 235 | Table 1-3: Contents of the statm files (as of 2.6.8-rc3) |
diff --git a/Documentation/hwmon/amc6821 b/Documentation/hwmon/amc6821 new file mode 100644 index 000000000000..ced8359c50f8 --- /dev/null +++ b/Documentation/hwmon/amc6821 | |||
@@ -0,0 +1,102 @@ | |||
1 | Kernel driver amc6821 | ||
2 | ===================== | ||
3 | |||
4 | Supported chips: | ||
5 | Texas Instruments AMC6821 | ||
6 | Prefix: 'amc6821' | ||
7 | Addresses scanned: 0x18, 0x19, 0x1a, 0x2c, 0x2d, 0x2e, 0x4c, 0x4d, 0x4e | ||
8 | Datasheet: http://focus.ti.com/docs/prod/folders/print/amc6821.html | ||
9 | |||
10 | Authors: | ||
11 | Tomaz Mertelj <tomaz.mertelj@guest.arnes.si> | ||
12 | |||
13 | |||
14 | Description | ||
15 | ----------- | ||
16 | |||
17 | This driver implements support for the Texas Instruments amc6821 chip. | ||
18 | The chip has one on-chip and one remote temperature sensor and one pwm fan | ||
19 | regulator. | ||
20 | The pwm can be controlled either from software or automatically. | ||
21 | |||
22 | The driver provides the following sensor accesses in sysfs: | ||
23 | |||
24 | temp1_input ro on-chip temperature | ||
25 | temp1_min rw " | ||
26 | temp1_max rw " | ||
27 | temp1_crit rw " | ||
28 | temp1_min_alarm ro " | ||
29 | temp1_max_alarm ro " | ||
30 | temp1_crit_alarm ro " | ||
31 | |||
32 | temp2_input ro remote temperature | ||
33 | temp2_min rw " | ||
34 | temp2_max rw " | ||
35 | temp2_crit rw " | ||
36 | temp2_min_alarm ro " | ||
37 | temp2_max_alarm ro " | ||
38 | temp2_crit_alarm ro " | ||
39 | temp2_fault ro " | ||
40 | |||
41 | fan1_input ro tachometer speed | ||
42 | fan1_min rw " | ||
43 | fan1_max rw " | ||
44 | fan1_fault ro " | ||
45 | fan1_div rw Fan divisor can be either 2 or 4. | ||
46 | |||
47 | pwm1 rw pwm1 | ||
48 | pwm1_enable rw regulator mode, 1=open loop, 2=fan controlled | ||
49 | by remote temperature, 3=fan controlled by | ||
50 | combination of the on-chip temperature and | ||
51 | remote-sensor temperature, | ||
52 | pwm1_auto_channels_temp ro 1 if pwm_enable==2, 3 if pwm_enable==3 | ||
53 | pwm1_auto_point1_pwm ro Hardwired to 0, shared for both | ||
54 | temperature channels. | ||
55 | pwm1_auto_point2_pwm rw This value is shared for both temperature | ||
56 | channels. | ||
57 | pwm1_auto_point3_pwm rw Hardwired to 255, shared for both | ||
58 | temperature channels. | ||
59 | |||
60 | temp1_auto_point1_temp ro Hardwired to temp2_auto_point1_temp | ||
61 | which is rw. Below this temperature fan stops. | ||
62 | temp1_auto_point2_temp rw The low-temperature limit of the proportional | ||
63 | range. Below this temperature | ||
64 | pwm1 = pwm1_auto_point2_pwm. It can go from | ||
65 | 0 degree C to 124 degree C in steps of | ||
66 | 4 degree C. Read it out after writing to get | ||
67 | the actual value. | ||
68 | temp1_auto_point3_temp rw Above this temperature fan runs at maximum | ||
69 | speed. It can go from temp1_auto_point2_temp. | ||
70 | It can only have certain discrete values | ||
71 | which depend on temp1_auto_point2_temp and | ||
72 | pwm1_auto_point2_pwm. Read it out after | ||
73 | writing to get the actual value. | ||
74 | |||
75 | temp2_auto_point1_temp rw Must be between 0 degree C and 63 degree C and | ||
76 | it defines the passive cooling temperature. | ||
77 | Below this temperature the fan stops in | ||
78 | the closed loop mode. | ||
79 | temp2_auto_point2_temp rw The low-temperature limit of the proportional | ||
80 | range. Below this temperature | ||
81 | pwm1 = pwm1_auto_point2_pwm. It can go from | ||
82 | 0 degree C to 124 degree C in steps | ||
83 | of 4 degree C. | ||
84 | |||
85 | temp2_auto_point3_temp rw Above this temperature fan runs at maximum | ||
86 | speed. It can only have certain discrete | ||
87 | values which depend on temp2_auto_point2_temp | ||
88 | and pwm1_auto_point2_pwm. Read it out after | ||
89 | writing to get actual value. | ||
90 | |||
91 | |||
92 | Module parameters | ||
93 | ----------------- | ||
94 | |||
95 | If your board has a BIOS that initializes the amc6821 correctly, you should | ||
96 | load the module with: init=0. | ||
97 | |||
98 | If your board BIOS doesn't initialize the chip, or you want | ||
99 | different settings, you can set the following parameters: | ||
100 | init=1, | ||
101 | pwminv: 0 default pwm output, 1 inverts pwm output. | ||
102 | |||
diff --git a/Documentation/ioctl/ioctl-number.txt b/Documentation/ioctl/ioctl-number.txt index 947374977ca5..35cf64d4436d 100644 --- a/Documentation/ioctl/ioctl-number.txt +++ b/Documentation/ioctl/ioctl-number.txt | |||
@@ -56,10 +56,11 @@ Following this convention is good because: | |||
56 | (5) When following the convention, the driver code can use generic | 56 | (5) When following the convention, the driver code can use generic |
57 | code to copy the parameters between user and kernel space. | 57 | code to copy the parameters between user and kernel space. |
58 | 58 | ||
59 | This table lists ioctls visible from user land for Linux/i386. It contains | 59 | This table lists ioctls visible from user land for Linux/x86. It contains |
60 | most drivers up to 2.3.14, but I know I am missing some. | 60 | most drivers up to 2.6.31, but I know I am missing some. There has been |
61 | no attempt to list non-X86 architectures or ioctls from drivers/staging/. | ||
61 | 62 | ||
62 | Code Seq# Include File Comments | 63 | Code Seq#(hex) Include File Comments |
63 | ======================================================== | 64 | ======================================================== |
64 | 0x00 00-1F linux/fs.h conflict! | 65 | 0x00 00-1F linux/fs.h conflict! |
65 | 0x00 00-1F scsi/scsi_ioctl.h conflict! | 66 | 0x00 00-1F scsi/scsi_ioctl.h conflict! |
@@ -69,119 +70,228 @@ Code Seq# Include File Comments | |||
69 | 0x03 all linux/hdreg.h | 70 | 0x03 all linux/hdreg.h |
70 | 0x04 D2-DC linux/umsdos_fs.h Dead since 2.6.11, but don't reuse these. | 71 | 0x04 D2-DC linux/umsdos_fs.h Dead since 2.6.11, but don't reuse these. |
71 | 0x06 all linux/lp.h | 72 | 0x06 all linux/lp.h |
72 | 0x09 all linux/md.h | 73 | 0x09 all linux/raid/md_u.h |
74 | 0x10 00-0F drivers/char/s390/vmcp.h | ||
73 | 0x12 all linux/fs.h | 75 | 0x12 all linux/fs.h |
74 | linux/blkpg.h | 76 | linux/blkpg.h |
75 | 0x1b all InfiniBand Subsystem <http://www.openib.org/> | 77 | 0x1b all InfiniBand Subsystem <http://www.openib.org/> |
76 | 0x20 all drivers/cdrom/cm206.h | 78 | 0x20 all drivers/cdrom/cm206.h |
77 | 0x22 all scsi/sg.h | 79 | 0x22 all scsi/sg.h |
78 | '#' 00-3F IEEE 1394 Subsystem Block for the entire subsystem | 80 | '#' 00-3F IEEE 1394 Subsystem Block for the entire subsystem |
81 | '$' 00-0F linux/perf_counter.h, linux/perf_event.h | ||
79 | '1' 00-1F <linux/timepps.h> PPS kit from Ulrich Windl | 82 | '1' 00-1F <linux/timepps.h> PPS kit from Ulrich Windl |
80 | <ftp://ftp.de.kernel.org/pub/linux/daemons/ntp/PPS/> | 83 | <ftp://ftp.de.kernel.org/pub/linux/daemons/ntp/PPS/> |
84 | '2' 01-04 linux/i2o.h | ||
85 | '3' 00-0F drivers/s390/char/raw3270.h conflict! | ||
86 | '3' 00-1F linux/suspend_ioctls.h conflict! | ||
87 | and kernel/power/user.c | ||
81 | '8' all SNP8023 advanced NIC card | 88 | '8' all SNP8023 advanced NIC card |
82 | <mailto:mcr@solidum.com> | 89 | <mailto:mcr@solidum.com> |
83 | 'A' 00-1F linux/apm_bios.h | 90 | '@' 00-0F linux/radeonfb.h conflict! |
91 | '@' 00-0F drivers/video/aty/aty128fb.c conflict! | ||
92 | 'A' 00-1F linux/apm_bios.h conflict! | ||
93 | 'A' 00-0F linux/agpgart.h conflict! | ||
94 | and drivers/char/agp/compat_ioctl.h | ||
95 | 'A' 00-7F sound/asound.h conflict! | ||
96 | 'B' 00-1F linux/cciss_ioctl.h conflict! | ||
97 | 'B' 00-0F include/linux/pmu.h conflict! | ||
84 | 'B' C0-FF advanced bbus | 98 | 'B' C0-FF advanced bbus |
85 | <mailto:maassen@uni-freiburg.de> | 99 | <mailto:maassen@uni-freiburg.de> |
86 | 'C' all linux/soundcard.h | 100 | 'C' all linux/soundcard.h conflict! |
101 | 'C' 01-2F linux/capi.h conflict! | ||
102 | 'C' F0-FF drivers/net/wan/cosa.h conflict! | ||
87 | 'D' all arch/s390/include/asm/dasd.h | 103 | 'D' all arch/s390/include/asm/dasd.h |
88 | 'E' all linux/input.h | 104 | 'D' 40-5F drivers/scsi/dpt/dtpi_ioctl.h |
89 | 'F' all linux/fb.h | 105 | 'D' 05 drivers/scsi/pmcraid.h |
90 | 'H' all linux/hiddev.h | 106 | 'E' all linux/input.h conflict! |
91 | 'I' all linux/isdn.h | 107 | 'E' 00-0F xen/evtchn.h conflict! |
108 | 'F' all linux/fb.h conflict! | ||
109 | 'F' 01-02 drivers/scsi/pmcraid.h conflict! | ||
110 | 'F' 20 drivers/video/fsl-diu-fb.h conflict! | ||
111 | 'F' 20 drivers/video/intelfb/intelfb.h conflict! | ||
112 | 'F' 20 linux/ivtvfb.h conflict! | ||
113 | 'F' 20 linux/matroxfb.h conflict! | ||
114 | 'F' 20 drivers/video/aty/atyfb_base.c conflict! | ||
115 | 'F' 00-0F video/da8xx-fb.h conflict! | ||
116 | 'F' 80-8F linux/arcfb.h conflict! | ||
117 | 'F' DD video/sstfb.h conflict! | ||
118 | 'G' 00-3F drivers/misc/sgi-gru/grulib.h conflict! | ||
119 | 'G' 00-0F linux/gigaset_dev.h conflict! | ||
120 | 'H' 00-7F linux/hiddev.h conflict! | ||
121 | 'H' 00-0F linux/hidraw.h conflict! | ||
122 | 'H' 00-0F sound/asound.h conflict! | ||
123 | 'H' 20-40 sound/asound_fm.h conflict! | ||
124 | 'H' 80-8F sound/sfnt_info.h conflict! | ||
125 | 'H' 10-8F sound/emu10k1.h conflict! | ||
126 | 'H' 10-1F sound/sb16_csp.h conflict! | ||
127 | 'H' 10-1F sound/hda_hwdep.h conflict! | ||
128 | 'H' 40-4F sound/hdspm.h conflict! | ||
129 | 'H' 40-4F sound/hdsp.h conflict! | ||
130 | 'H' 90 sound/usb/usx2y/usb_stream.h | ||
131 | 'H' C0-F0 net/bluetooth/hci.h conflict! | ||
132 | 'H' C0-DF net/bluetooth/hidp/hidp.h conflict! | ||
133 | 'H' C0-DF net/bluetooth/cmtp/cmtp.h conflict! | ||
134 | 'H' C0-DF net/bluetooth/bnep/bnep.h conflict! | ||
135 | 'I' all linux/isdn.h conflict! | ||
136 | 'I' 00-0F drivers/isdn/divert/isdn_divert.h conflict! | ||
137 | 'I' 40-4F linux/mISDNif.h conflict! | ||
92 | 'J' 00-1F drivers/scsi/gdth_ioctl.h | 138 | 'J' 00-1F drivers/scsi/gdth_ioctl.h |
93 | 'K' all linux/kd.h | 139 | 'K' all linux/kd.h |
94 | 'L' 00-1F linux/loop.h | 140 | 'L' 00-1F linux/loop.h conflict! |
95 | 'L' 20-2F driver/usb/misc/vstusb.h | 141 | 'L' 10-1F drivers/scsi/mpt2sas/mpt2sas_ctl.h conflict! |
142 | 'L' 20-2F linux/usb/vstusb.h | ||
96 | 'L' E0-FF linux/ppdd.h encrypted disk device driver | 143 | 'L' E0-FF linux/ppdd.h encrypted disk device driver |
97 | <http://linux01.gwdg.de/~alatham/ppdd.html> | 144 | <http://linux01.gwdg.de/~alatham/ppdd.html> |
98 | 'M' all linux/soundcard.h | 145 | 'M' all linux/soundcard.h conflict! |
146 | 'M' 01-16 mtd/mtd-abi.h conflict! | ||
147 | and drivers/mtd/mtdchar.c | ||
148 | 'M' 01-03 drivers/scsi/megaraid/megaraid_sas.h | ||
149 | 'M' 00-0F drivers/video/fsl-diu-fb.h conflict! | ||
99 | 'N' 00-1F drivers/usb/scanner.h | 150 | 'N' 00-1F drivers/usb/scanner.h |
100 | 'O' 00-02 include/mtd/ubi-user.h UBI | 151 | 'O' 00-06 mtd/ubi-user.h UBI |
101 | 'P' all linux/soundcard.h | 152 | 'P' all linux/soundcard.h conflict! |
153 | 'P' 60-6F sound/sscape_ioctl.h conflict! | ||
154 | 'P' 00-0F drivers/usb/class/usblp.c conflict! | ||
102 | 'Q' all linux/soundcard.h | 155 | 'Q' all linux/soundcard.h |
103 | 'R' 00-1F linux/random.h | 156 | 'R' 00-1F linux/random.h conflict! |
157 | 'R' 01 linux/rfkill.h conflict! | ||
158 | 'R' 01-0F media/rds.h conflict! | ||
159 | 'R' C0-DF net/bluetooth/rfcomm.h | ||
104 | 'S' all linux/cdrom.h conflict! | 160 | 'S' all linux/cdrom.h conflict! |
105 | 'S' 80-81 scsi/scsi_ioctl.h conflict! | 161 | 'S' 80-81 scsi/scsi_ioctl.h conflict! |
106 | 'S' 82-FF scsi/scsi.h conflict! | 162 | 'S' 82-FF scsi/scsi.h conflict! |
163 | 'S' 00-7F sound/asequencer.h conflict! | ||
107 | 'T' all linux/soundcard.h conflict! | 164 | 'T' all linux/soundcard.h conflict! |
165 | 'T' 00-AF sound/asound.h conflict! | ||
108 | 'T' all arch/x86/include/asm/ioctls.h conflict! | 166 | 'T' all arch/x86/include/asm/ioctls.h conflict! |
109 | 'U' 00-EF linux/drivers/usb/usb.h | 167 | 'T' C0-DF linux/if_tun.h conflict! |
110 | 'V' all linux/vt.h | 168 | 'U' all sound/asound.h conflict! |
169 | 'U' 00-0F drivers/media/video/uvc/uvcvideo.h conflict! | ||
170 | 'U' 00-CF linux/uinput.h conflict! | ||
171 | 'U' 00-EF linux/usbdevice_fs.h | ||
172 | 'U' C0-CF drivers/bluetooth/hci_uart.h | ||
173 | 'V' all linux/vt.h conflict! | ||
174 | 'V' all linux/videodev2.h conflict! | ||
175 | 'V' C0 linux/ivtvfb.h conflict! | ||
176 | 'V' C0 linux/ivtv.h conflict! | ||
177 | 'V' C0 media/davinci/vpfe_capture.h conflict! | ||
178 | 'V' C0 media/si4713.h conflict! | ||
179 | 'V' C0-CF drivers/media/video/mxb.h conflict! | ||
111 | 'W' 00-1F linux/watchdog.h conflict! | 180 | 'W' 00-1F linux/watchdog.h conflict! |
112 | 'W' 00-1F linux/wanrouter.h conflict! | 181 | 'W' 00-1F linux/wanrouter.h conflict! |
113 | 'X' all linux/xfs_fs.h | 182 | 'W' 00-3F sound/asound.h conflict! |
183 | 'X' all fs/xfs/xfs_fs.h conflict! | ||
184 | and fs/xfs/linux-2.6/xfs_ioctl32.h | ||
185 | and include/linux/falloc.h | ||
186 | and linux/fs.h | ||
187 | 'X' all fs/ocfs2/ocfs_fs.h conflict! | ||
188 | 'X' 01 linux/pktcdvd.h conflict! | ||
114 | 'Y' all linux/cyclades.h | 189 | 'Y' all linux/cyclades.h |
115 | '[' 00-07 linux/usb/usbtmc.h USB Test and Measurement Devices | 190 | 'Z' 14-15 drivers/message/fusion/mptctl.h |
191 | '[' 00-07 linux/usb/tmc.h USB Test and Measurement Devices | ||
116 | <mailto:gregkh@suse.de> | 192 | <mailto:gregkh@suse.de> |
117 | 'a' all ATM on linux | 193 | 'a' all linux/atm*.h, linux/sonet.h ATM on linux |
118 | <http://lrcwww.epfl.ch/linux-atm/magic.html> | 194 | <http://lrcwww.epfl.ch/linux-atm/magic.html> |
119 | 'b' 00-FF bit3 vme host bridge | 195 | 'b' 00-FF conflict! bit3 vme host bridge |
120 | <mailto:natalia@nikhefk.nikhef.nl> | 196 | <mailto:natalia@nikhefk.nikhef.nl> |
197 | 'b' 00-0F media/bt819.h conflict! | ||
198 | 'c' all linux/cm4000_cs.h conflict! | ||
121 | 'c' 00-7F linux/comstats.h conflict! | 199 | 'c' 00-7F linux/comstats.h conflict! |
122 | 'c' 00-7F linux/coda.h conflict! | 200 | 'c' 00-7F linux/coda.h conflict! |
123 | 'c' 80-9F arch/s390/include/asm/chsc.h | 201 | 'c' 00-1F linux/chio.h conflict! |
124 | 'c' A0-AF arch/x86/include/asm/msr.h | 202 | 'c' 80-9F arch/s390/include/asm/chsc.h conflict! |
203 | 'c' A0-AF arch/x86/include/asm/msr.h conflict! | ||
125 | 'd' 00-FF linux/char/drm/drm/h conflict! | 204 | 'd' 00-FF linux/char/drm/drm/h conflict! |
205 | 'd' 02-40 pcmcia/ds.h conflict! | ||
206 | 'd' 10-3F drivers/media/video/dabusb.h conflict! | ||
207 | 'd' C0-CF drivers/media/video/saa7191.h conflict! | ||
126 | 'd' F0-FF linux/digi1.h | 208 | 'd' F0-FF linux/digi1.h |
127 | 'e' all linux/digi1.h conflict! | 209 | 'e' all linux/digi1.h conflict! |
128 | 'e' 00-1F net/irda/irtty.h conflict! | 210 | 'e' 00-1F drivers/net/irda/irtty-sir.h conflict! |
129 | 'f' 00-1F linux/ext2_fs.h | 211 | 'f' 00-1F linux/ext2_fs.h conflict! |
130 | 'h' 00-7F Charon filesystem | 212 | 'f' 00-1F linux/ext3_fs.h conflict! |
213 | 'f' 00-0F fs/jfs/jfs_dinode.h conflict! | ||
214 | 'f' 00-0F fs/ext4/ext4.h conflict! | ||
215 | 'f' 00-0F linux/fs.h conflict! | ||
216 | 'f' 00-0F fs/ocfs2/ocfs2_fs.h conflict! | ||
217 | 'g' 00-0F linux/usb/gadgetfs.h | ||
218 | 'g' 20-2F linux/usb/g_printer.h | ||
219 | 'h' 00-7F conflict! Charon filesystem | ||
131 | <mailto:zapman@interlan.net> | 220 | <mailto:zapman@interlan.net> |
132 | 'i' 00-3F linux/i2o.h | 221 | 'h' 00-1F linux/hpet.h conflict! |
222 | 'i' 00-3F linux/i2o-dev.h conflict! | ||
223 | 'i' 0B-1F linux/ipmi.h conflict! | ||
224 | 'i' 80-8F linux/i8k.h | ||
133 | 'j' 00-3F linux/joystick.h | 225 | 'j' 00-3F linux/joystick.h |
226 | 'k' 00-0F linux/spi/spidev.h conflict! | ||
227 | 'k' 00-05 video/kyro.h conflict! | ||
134 | 'l' 00-3F linux/tcfs_fs.h transparent cryptographic file system | 228 | 'l' 00-3F linux/tcfs_fs.h transparent cryptographic file system |
135 | <http://mikonos.dia.unisa.it/tcfs> | 229 | <http://mikonos.dia.unisa.it/tcfs> |
136 | 'l' 40-7F linux/udf_fs_i.h in development: | 230 | 'l' 40-7F linux/udf_fs_i.h in development: |
137 | <http://sourceforge.net/projects/linux-udf/> | 231 | <http://sourceforge.net/projects/linux-udf/> |
138 | 'm' 00-09 linux/mmtimer.h | 232 | 'm' 00-09 linux/mmtimer.h conflict! |
139 | 'm' all linux/mtio.h conflict! | 233 | 'm' all linux/mtio.h conflict! |
140 | 'm' all linux/soundcard.h conflict! | 234 | 'm' all linux/soundcard.h conflict! |
141 | 'm' all linux/synclink.h conflict! | 235 | 'm' all linux/synclink.h conflict! |
236 | 'm' 00-19 drivers/message/fusion/mptctl.h conflict! | ||
237 | 'm' 00 drivers/scsi/megaraid/megaraid_ioctl.h conflict! | ||
142 | 'm' 00-1F net/irda/irmod.h conflict! | 238 | 'm' 00-1F net/irda/irmod.h conflict! |
143 | 'n' 00-7F linux/ncp_fs.h | 239 | 'n' 00-7F linux/ncp_fs.h and fs/ncpfs/ioctl.c |
144 | 'n' 80-8F linux/nilfs2_fs.h NILFS2 | 240 | 'n' 80-8F linux/nilfs2_fs.h NILFS2 |
145 | 'n' E0-FF video/matrox.h matroxfb | 241 | 'n' E0-FF linux/matroxfb.h matroxfb |
146 | 'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2 | 242 | 'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2 |
147 | 'o' 00-03 include/mtd/ubi-user.h conflict! (OCFS2 and UBI overlaps) | 243 | 'o' 00-03 mtd/ubi-user.h conflict! (OCFS2 and UBI overlaps) |
148 | 'o' 40-41 include/mtd/ubi-user.h UBI | 244 | 'o' 40-41 mtd/ubi-user.h UBI |
149 | 'o' 01-A1 include/linux/dvb/*.h DVB | 245 | 'o' 01-A1 linux/dvb/*.h DVB |
150 | 'p' 00-0F linux/phantom.h conflict! (OpenHaptics needs this) | 246 | 'p' 00-0F linux/phantom.h conflict! (OpenHaptics needs this) |
247 | 'p' 00-1F linux/rtc.h conflict! | ||
151 | 'p' 00-3F linux/mc146818rtc.h conflict! | 248 | 'p' 00-3F linux/mc146818rtc.h conflict! |
152 | 'p' 40-7F linux/nvram.h | 249 | 'p' 40-7F linux/nvram.h |
153 | 'p' 80-9F user-space parport | 250 | 'p' 80-9F linux/ppdev.h user-space parport |
154 | <mailto:tim@cyberelk.net> | 251 | <mailto:tim@cyberelk.net> |
155 | 'p' a1-a4 linux/pps.h LinuxPPS | 252 | 'p' A1-A4 linux/pps.h LinuxPPS |
156 | <mailto:giometti@linux.it> | 253 | <mailto:giometti@linux.it> |
157 | 'q' 00-1F linux/serio.h | 254 | 'q' 00-1F linux/serio.h |
158 | 'q' 80-FF Internet PhoneJACK, Internet LineJACK | 255 | 'q' 80-FF linux/telephony.h Internet PhoneJACK, Internet LineJACK |
159 | <http://www.quicknet.net> | 256 | linux/ixjuser.h <http://www.quicknet.net> |
160 | 'r' 00-1F linux/msdos_fs.h | 257 | 'r' 00-1F linux/msdos_fs.h and fs/fat/dir.c |
161 | 's' all linux/cdk.h | 258 | 's' all linux/cdk.h |
162 | 't' 00-7F linux/if_ppp.h | 259 | 't' 00-7F linux/if_ppp.h |
163 | 't' 80-8F linux/isdn_ppp.h | 260 | 't' 80-8F linux/isdn_ppp.h |
261 | 't' 90 linux/toshiba.h | ||
164 | 'u' 00-1F linux/smb_fs.h | 262 | 'u' 00-1F linux/smb_fs.h |
165 | 'v' 00-1F linux/ext2_fs.h conflict! | ||
166 | 'v' all linux/videodev.h conflict! | 263 | 'v' all linux/videodev.h conflict! |
264 | 'v' 00-1F linux/ext2_fs.h conflict! | ||
265 | 'v' 00-1F linux/fs.h conflict! | ||
266 | 'v' 00-0F linux/sonypi.h conflict! | ||
267 | 'v' C0-CF drivers/media/video/ov511.h conflict! | ||
268 | 'v' C0-DF media/pwc-ioctl.h conflict! | ||
269 | 'v' C0-FF linux/meye.h conflict! | ||
270 | 'v' C0-CF drivers/media/video/zoran/zoran.h conflict! | ||
271 | 'v' D0-DF drivers/media/video/cpia2/cpia2dev.h conflict! | ||
167 | 'w' all CERN SCI driver | 272 | 'w' all CERN SCI driver |
168 | 'y' 00-1F packet based user level communications | 273 | 'y' 00-1F packet based user level communications |
169 | <mailto:zapman@interlan.net> | 274 | <mailto:zapman@interlan.net> |
170 | 'z' 00-3F CAN bus card | 275 | 'z' 00-3F CAN bus card conflict! |
171 | <mailto:hdstich@connectu.ulm.circular.de> | 276 | <mailto:hdstich@connectu.ulm.circular.de> |
172 | 'z' 40-7F CAN bus card | 277 | 'z' 40-7F CAN bus card conflict! |
173 | <mailto:oe@port.de> | 278 | <mailto:oe@port.de> |
279 | 'z' 10-4F drivers/s390/crypto/zcrypt_api.h conflict! | ||
174 | 0x80 00-1F linux/fb.h | 280 | 0x80 00-1F linux/fb.h |
175 | 0x81 00-1F linux/videotext.h | 281 | 0x81 00-1F linux/videotext.h |
282 | 0x88 00-3F media/ovcamchip.h | ||
176 | 0x89 00-06 arch/x86/include/asm/sockios.h | 283 | 0x89 00-06 arch/x86/include/asm/sockios.h |
177 | 0x89 0B-DF linux/sockios.h | 284 | 0x89 0B-DF linux/sockios.h |
178 | 0x89 E0-EF linux/sockios.h SIOCPROTOPRIVATE range | 285 | 0x89 E0-EF linux/sockios.h SIOCPROTOPRIVATE range |
286 | 0x89 E0-EF linux/dn.h PROTOPRIVATE range | ||
179 | 0x89 F0-FF linux/sockios.h SIOCDEVPRIVATE range | 287 | 0x89 F0-FF linux/sockios.h SIOCDEVPRIVATE range |
180 | 0x8B all linux/wireless.h | 288 | 0x8B all linux/wireless.h |
181 | 0x8C 00-3F WiNRADiO driver | 289 | 0x8C 00-3F WiNRADiO driver |
182 | <http://www.proximity.com.au/~brian/winradio/> | 290 | <http://www.proximity.com.au/~brian/winradio/> |
183 | 0x90 00 drivers/cdrom/sbpcd.h | 291 | 0x90 00 drivers/cdrom/sbpcd.h |
292 | 0x92 00-0F drivers/usb/mon/mon_bin.c | ||
184 | 0x93 60-7F linux/auto_fs.h | 293 | 0x93 60-7F linux/auto_fs.h |
294 | 0x94 all fs/btrfs/ioctl.h | ||
185 | 0x99 00-0F 537-Addinboard driver | 295 | 0x99 00-0F 537-Addinboard driver |
186 | <mailto:buk@buks.ipn.de> | 296 | <mailto:buk@buks.ipn.de> |
187 | 0xA0 all linux/sdp/sdp.h Industrial Device Project | 297 | 0xA0 all linux/sdp/sdp.h Industrial Device Project |
@@ -192,17 +302,22 @@ Code Seq# Include File Comments | |||
192 | 0xAB 00-1F linux/nbd.h | 302 | 0xAB 00-1F linux/nbd.h |
193 | 0xAC 00-1F linux/raw.h | 303 | 0xAC 00-1F linux/raw.h |
194 | 0xAD 00 Netfilter device in development: | 304 | 0xAD 00 Netfilter device in development: |
195 | <mailto:rusty@rustcorp.com.au> | 305 | <mailto:rusty@rustcorp.com.au> |
196 | 0xAE all linux/kvm.h Kernel-based Virtual Machine | 306 | 0xAE all linux/kvm.h Kernel-based Virtual Machine |
197 | <mailto:kvm@vger.kernel.org> | 307 | <mailto:kvm@vger.kernel.org> |
198 | 0xB0 all RATIO devices in development: | 308 | 0xB0 all RATIO devices in development: |
199 | <mailto:vgo@ratio.de> | 309 | <mailto:vgo@ratio.de> |
200 | 0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca> | 310 | 0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca> |
311 | 0xC0 00-0F linux/usb/iowarrior.h | ||
201 | 0xCB 00-1F CBM serial IEC bus in development: | 312 | 0xCB 00-1F CBM serial IEC bus in development: |
202 | <mailto:michael.klein@puffin.lb.shuttle.de> | 313 | <mailto:michael.klein@puffin.lb.shuttle.de> |
314 | 0xCD 01 linux/reiserfs_fs.h | ||
315 | 0xCF 02 fs/cifs/ioctl.c | ||
316 | 0xDB 00-0F drivers/char/mwave/mwavepub.h | ||
203 | 0xDD 00-3F ZFCP device driver see drivers/s390/scsi/ | 317 | 0xDD 00-3F ZFCP device driver see drivers/s390/scsi/ |
204 | <mailto:aherrman@de.ibm.com> | 318 | <mailto:aherrman@de.ibm.com> |
205 | 0xF3 00-3F video/sisfb.h sisfb (in development) | 319 | 0xF3 00-3F drivers/usb/misc/sisusbvga/sisusb.h sisfb (in development) |
206 | <mailto:thomas@winischhofer.net> | 320 | <mailto:thomas@winischhofer.net> |
207 | 0xF4 00-1F video/mbxfb.h mbxfb | 321 | 0xF4 00-1F video/mbxfb.h mbxfb |
208 | <mailto:raph@8d.com> | 322 | <mailto:raph@8d.com> |
323 | 0xFD all linux/dm-ioctl.h | ||
diff --git a/Documentation/kernel-doc-nano-HOWTO.txt b/Documentation/kernel-doc-nano-HOWTO.txt index 348b9e5e28fc..27a52b35d55b 100644 --- a/Documentation/kernel-doc-nano-HOWTO.txt +++ b/Documentation/kernel-doc-nano-HOWTO.txt | |||
@@ -214,11 +214,13 @@ The format of the block comment is like this: | |||
214 | * (section header: (section description)? )* | 214 | * (section header: (section description)? )* |
215 | (*)?*/ | 215 | (*)?*/ |
216 | 216 | ||
217 | The short function description ***cannot be multiline***, but the other | 217 | All "description" text can span multiple lines, although the |
218 | descriptions can be (and they can contain blank lines). If you continue | 218 | function_name & its short description are traditionally on a single line. |
219 | that initial short description onto a second line, that second line will | 219 | Description text may also contain blank lines (i.e., lines that contain |
220 | appear further down at the beginning of the description section, which is | 220 | only a "*"). |
221 | almost certainly not what you had in mind. | 221 | |
222 | "section header:" names must be unique per function (or struct, | ||
223 | union, typedef, enum). | ||
222 | 224 | ||
223 | Avoid putting a spurious blank line after the function name, or else the | 225 | Avoid putting a spurious blank line after the function name, or else the |
224 | description will be repeated! | 226 | description will be repeated! |
diff --git a/Documentation/trace/ring-buffer-design.txt b/Documentation/trace/ring-buffer-design.txt index 5b1d23d604c5..d299ff31df57 100644 --- a/Documentation/trace/ring-buffer-design.txt +++ b/Documentation/trace/ring-buffer-design.txt | |||
@@ -33,9 +33,9 @@ head_page - a pointer to the page that the reader will use next | |||
33 | 33 | ||
34 | tail_page - a pointer to the page that will be written to next | 34 | tail_page - a pointer to the page that will be written to next |
35 | 35 | ||
36 | commit_page - a pointer to the page with the last finished non nested write. | 36 | commit_page - a pointer to the page with the last finished non-nested write. |
37 | 37 | ||
38 | cmpxchg - hardware assisted atomic transaction that performs the following: | 38 | cmpxchg - hardware-assisted atomic transaction that performs the following: |
39 | 39 | ||
40 | A = B iff previous A == C | 40 | A = B iff previous A == C |
41 | 41 | ||
@@ -52,15 +52,15 @@ The Generic Ring Buffer | |||
52 | The ring buffer can be used in either an overwrite mode or in | 52 | The ring buffer can be used in either an overwrite mode or in |
53 | producer/consumer mode. | 53 | producer/consumer mode. |
54 | 54 | ||
55 | Producer/consumer mode is where the producer were to fill up the | 55 | Producer/consumer mode is where if the producer were to fill up the |
56 | buffer before the consumer could free up anything, the producer | 56 | buffer before the consumer could free up anything, the producer |
57 | will stop writing to the buffer. This will lose most recent events. | 57 | will stop writing to the buffer. This will lose most recent events. |
58 | 58 | ||
59 | Overwrite mode is where the produce were to fill up the buffer | 59 | Overwrite mode is where if the producer were to fill up the buffer |
60 | before the consumer could free up anything, the producer will | 60 | before the consumer could free up anything, the producer will |
61 | overwrite the older data. This will lose the oldest events. | 61 | overwrite the older data. This will lose the oldest events. |
62 | 62 | ||
63 | No two writers can write at the same time (on the same per cpu buffer), | 63 | No two writers can write at the same time (on the same per-cpu buffer), |
64 | but a writer may interrupt another writer, but it must finish writing | 64 | but a writer may interrupt another writer, but it must finish writing |
65 | before the previous writer may continue. This is very important to the | 65 | before the previous writer may continue. This is very important to the |
66 | algorithm. The writers act like a "stack". The way interrupts works | 66 | algorithm. The writers act like a "stack". The way interrupts works |
@@ -79,16 +79,16 @@ the interrupt doing a write as well. | |||
79 | 79 | ||
80 | Readers can happen at any time. But no two readers may run at the | 80 | Readers can happen at any time. But no two readers may run at the |
81 | same time, nor can a reader preempt/interrupt another reader. A reader | 81 | same time, nor can a reader preempt/interrupt another reader. A reader |
82 | can not preempt/interrupt a writer, but it may read/consume from the | 82 | cannot preempt/interrupt a writer, but it may read/consume from the |
83 | buffer at the same time as a writer is writing, but the reader must be | 83 | buffer at the same time as a writer is writing, but the reader must be |
84 | on another processor to do so. A reader may read on its own processor | 84 | on another processor to do so. A reader may read on its own processor |
85 | and can be preempted by a writer. | 85 | and can be preempted by a writer. |
86 | 86 | ||
87 | A writer can preempt a reader, but a reader can not preempt a writer. | 87 | A writer can preempt a reader, but a reader cannot preempt a writer. |
88 | But a reader can read the buffer at the same time (on another processor) | 88 | But a reader can read the buffer at the same time (on another processor) |
89 | as a writer. | 89 | as a writer. |
90 | 90 | ||
91 | The ring buffer is made up of a list of pages held together by a link list. | 91 | The ring buffer is made up of a list of pages held together by a linked list. |
92 | 92 | ||
93 | At initialization a reader page is allocated for the reader that is not | 93 | At initialization a reader page is allocated for the reader that is not |
94 | part of the ring buffer. | 94 | part of the ring buffer. |
@@ -102,7 +102,7 @@ the head page. | |||
102 | 102 | ||
103 | The reader has its own page to use. At start up time, this page is | 103 | The reader has its own page to use. At start up time, this page is |
104 | allocated but is not attached to the list. When the reader wants | 104 | allocated but is not attached to the list. When the reader wants |
105 | to read from the buffer, if its page is empty (like it is on start up) | 105 | to read from the buffer, if its page is empty (like it is on start-up), |
106 | it will swap its page with the head_page. The old reader page will | 106 | it will swap its page with the head_page. The old reader page will |
107 | become part of the ring buffer and the head_page will be removed. | 107 | become part of the ring buffer and the head_page will be removed. |
108 | The page after the inserted page (old reader_page) will become the | 108 | The page after the inserted page (old reader_page) will become the |
@@ -206,7 +206,7 @@ The main pointers: | |||
206 | 206 | ||
207 | commit page - the page that last finished a write. | 207 | commit page - the page that last finished a write. |
208 | 208 | ||
209 | The commit page only is updated by the outer most writer in the | 209 | The commit page only is updated by the outermost writer in the |
210 | writer stack. A writer that preempts another writer will not move the | 210 | writer stack. A writer that preempts another writer will not move the |
211 | commit page. | 211 | commit page. |
212 | 212 | ||
@@ -281,7 +281,7 @@ with the previous write. | |||
281 | The commit pointer points to the last write location that was | 281 | The commit pointer points to the last write location that was |
282 | committed without preempting another write. When a write that | 282 | committed without preempting another write. When a write that |
283 | preempted another write is committed, it only becomes a pending commit | 283 | preempted another write is committed, it only becomes a pending commit |
284 | and will not be a full commit till all writes have been committed. | 284 | and will not be a full commit until all writes have been committed. |
285 | 285 | ||
286 | The commit page points to the page that has the last full commit. | 286 | The commit page points to the page that has the last full commit. |
287 | The tail page points to the page with the last write (before | 287 | The tail page points to the page with the last write (before |
@@ -292,7 +292,7 @@ be several pages ahead. If the tail page catches up to the commit | |||
292 | page then no more writes may take place (regardless of the mode | 292 | page then no more writes may take place (regardless of the mode |
293 | of the ring buffer: overwrite and produce/consumer). | 293 | of the ring buffer: overwrite and produce/consumer). |
294 | 294 | ||
295 | The order of pages are: | 295 | The order of pages is: |
296 | 296 | ||
297 | head page | 297 | head page |
298 | commit page | 298 | commit page |
@@ -311,7 +311,7 @@ Possible scenario: | |||
311 | There is a special case that the head page is after either the commit page | 311 | There is a special case that the head page is after either the commit page |
312 | and possibly the tail page. That is when the commit (and tail) page has been | 312 | and possibly the tail page. That is when the commit (and tail) page has been |
313 | swapped with the reader page. This is because the head page is always | 313 | swapped with the reader page. This is because the head page is always |
314 | part of the ring buffer, but the reader page is not. When ever there | 314 | part of the ring buffer, but the reader page is not. Whenever there |
315 | has been less than a full page that has been committed inside the ring buffer, | 315 | has been less than a full page that has been committed inside the ring buffer, |
316 | and a reader swaps out a page, it will be swapping out the commit page. | 316 | and a reader swaps out a page, it will be swapping out the commit page. |
317 | 317 | ||
@@ -338,7 +338,7 @@ and a reader swaps out a page, it will be swapping out the commit page. | |||
338 | In this case, the head page will not move when the tail and commit | 338 | In this case, the head page will not move when the tail and commit |
339 | move back into the ring buffer. | 339 | move back into the ring buffer. |
340 | 340 | ||
341 | The reader can not swap a page into the ring buffer if the commit page | 341 | The reader cannot swap a page into the ring buffer if the commit page |
342 | is still on that page. If the read meets the last commit (real commit | 342 | is still on that page. If the read meets the last commit (real commit |
343 | not pending or reserved), then there is nothing more to read. | 343 | not pending or reserved), then there is nothing more to read. |
344 | The buffer is considered empty until another full commit finishes. | 344 | The buffer is considered empty until another full commit finishes. |
@@ -395,7 +395,7 @@ The main idea behind the lockless algorithm is to combine the moving | |||
395 | of the head_page pointer with the swapping of pages with the reader. | 395 | of the head_page pointer with the swapping of pages with the reader. |
396 | State flags are placed inside the pointer to the page. To do this, | 396 | State flags are placed inside the pointer to the page. To do this, |
397 | each page must be aligned in memory by 4 bytes. This will allow the 2 | 397 | each page must be aligned in memory by 4 bytes. This will allow the 2 |
398 | least significant bits of the address to be used as flags. Since | 398 | least significant bits of the address to be used as flags, since |
399 | they will always be zero for the address. To get the address, | 399 | they will always be zero for the address. To get the address, |
400 | simply mask out the flags. | 400 | simply mask out the flags. |
401 | 401 | ||
@@ -460,7 +460,7 @@ When the reader tries to swap the page with the ring buffer, it | |||
460 | will also use cmpxchg. If the flag bit in the pointer to the | 460 | will also use cmpxchg. If the flag bit in the pointer to the |
461 | head page does not have the HEADER flag set, the compare will fail | 461 | head page does not have the HEADER flag set, the compare will fail |
462 | and the reader will need to look for the new head page and try again. | 462 | and the reader will need to look for the new head page and try again. |
463 | Note, the flag UPDATE and HEADER are never set at the same time. | 463 | Note, the flags UPDATE and HEADER are never set at the same time. |
464 | 464 | ||
465 | The reader swaps the reader page as follows: | 465 | The reader swaps the reader page as follows: |
466 | 466 | ||
@@ -539,7 +539,7 @@ updated to the reader page. | |||
539 | | +-----------------------------+ | | 539 | | +-----------------------------+ | |
540 | +------------------------------------+ | 540 | +------------------------------------+ |
541 | 541 | ||
542 | Another important point. The page that the reader page points back to | 542 | Another important point: The page that the reader page points back to |
543 | by its previous pointer (the one that now points to the new head page) | 543 | by its previous pointer (the one that now points to the new head page) |
544 | never points back to the reader page. That is because the reader page is | 544 | never points back to the reader page. That is because the reader page is |
545 | not part of the ring buffer. Traversing the ring buffer via the next pointers | 545 | not part of the ring buffer. Traversing the ring buffer via the next pointers |
@@ -572,7 +572,7 @@ not be able to swap the head page from the buffer, nor will it be able to | |||
572 | move the head page, until the writer is finished with the move. | 572 | move the head page, until the writer is finished with the move. |
573 | 573 | ||
574 | This eliminates any races that the reader can have on the writer. The reader | 574 | This eliminates any races that the reader can have on the writer. The reader |
575 | must spin, and this is why the reader can not preempt the writer. | 575 | must spin, and this is why the reader cannot preempt the writer. |
576 | 576 | ||
577 | tail page | 577 | tail page |
578 | | | 578 | | |
@@ -659,9 +659,9 @@ before pushing the head page. If it is, then it can be assumed that the | |||
659 | tail page wrapped the buffer, and we must drop new writes. | 659 | tail page wrapped the buffer, and we must drop new writes. |
660 | 660 | ||
661 | This is not a race condition, because the commit page can only be moved | 661 | This is not a race condition, because the commit page can only be moved |
662 | by the outter most writer (the writer that was preempted). | 662 | by the outermost writer (the writer that was preempted). |
663 | This means that the commit will not move while a writer is moving the | 663 | This means that the commit will not move while a writer is moving the |
664 | tail page. The reader can not swap the reader page if it is also being | 664 | tail page. The reader cannot swap the reader page if it is also being |
665 | used as the commit page. The reader can simply check that the commit | 665 | used as the commit page. The reader can simply check that the commit |
666 | is off the reader page. Once the commit page leaves the reader page | 666 | is off the reader page. Once the commit page leaves the reader page |
667 | it will never go back on it unless a reader does another swap with the | 667 | it will never go back on it unless a reader does another swap with the |
@@ -733,7 +733,7 @@ The write converts the head page pointer to UPDATE. | |||
733 | --->| |<---| |<---| |<---| |<--- | 733 | --->| |<---| |<---| |<---| |<--- |
734 | +---+ +---+ +---+ +---+ | 734 | +---+ +---+ +---+ +---+ |
735 | 735 | ||
736 | But if a nested writer preempts here. It will see that the next | 736 | But if a nested writer preempts here, it will see that the next |
737 | page is a head page, but it is also nested. It will detect that | 737 | page is a head page, but it is also nested. It will detect that |
738 | it is nested and will save that information. The detection is the | 738 | it is nested and will save that information. The detection is the |
739 | fact that it sees the UPDATE flag instead of a HEADER or NORMAL | 739 | fact that it sees the UPDATE flag instead of a HEADER or NORMAL |
@@ -761,7 +761,7 @@ to NORMAL. | |||
761 | --->| |<---| |<---| |<---| |<--- | 761 | --->| |<---| |<---| |<---| |<--- |
762 | +---+ +---+ +---+ +---+ | 762 | +---+ +---+ +---+ +---+ |
763 | 763 | ||
764 | After the nested writer finishes, the outer most writer will convert | 764 | After the nested writer finishes, the outermost writer will convert |
765 | the UPDATE pointer to NORMAL. | 765 | the UPDATE pointer to NORMAL. |
766 | 766 | ||
767 | 767 | ||
@@ -812,7 +812,7 @@ head page. | |||
812 | +---+ +---+ +---+ +---+ | 812 | +---+ +---+ +---+ +---+ |
813 | 813 | ||
814 | The nested writer moves the tail page forward. But does not set the old | 814 | The nested writer moves the tail page forward. But does not set the old |
815 | update page to NORMAL because it is not the outer most writer. | 815 | update page to NORMAL because it is not the outermost writer. |
816 | 816 | ||
817 | tail page | 817 | tail page |
818 | | | 818 | | |
@@ -892,7 +892,7 @@ It will return to the first writer. | |||
892 | --->| |<---| |<---| |<---| |<--- | 892 | --->| |<---| |<---| |<---| |<--- |
893 | +---+ +---+ +---+ +---+ | 893 | +---+ +---+ +---+ +---+ |
894 | 894 | ||
895 | The first writer can not know atomically test if the tail page moved | 895 | The first writer cannot know atomically if the tail page moved |
896 | while it updates the HEAD page. It will then update the head page to | 896 | while it updates the HEAD page. It will then update the head page to |
897 | what it thinks is the new head page. | 897 | what it thinks is the new head page. |
898 | 898 | ||
@@ -923,9 +923,9 @@ if the tail page is either where it use to be or on the next page: | |||
923 | --->| |<---| |<---| |<---| |<--- | 923 | --->| |<---| |<---| |<---| |<--- |
924 | +---+ +---+ +---+ +---+ | 924 | +---+ +---+ +---+ +---+ |
925 | 925 | ||
926 | If tail page != A and tail page does not equal B, then it must reset the | 926 | If tail page != A and tail page != B, then it must reset the pointer |
927 | pointer back to NORMAL. The fact that it only needs to worry about | 927 | back to NORMAL. The fact that it only needs to worry about nested |
928 | nested writers, it only needs to check this after setting the HEAD page. | 928 | writers means that it only needs to check this after setting the HEAD page. |
929 | 929 | ||
930 | 930 | ||
931 | (first writer) | 931 | (first writer) |
@@ -939,7 +939,7 @@ nested writers, it only needs to check this after setting the HEAD page. | |||
939 | +---+ +---+ +---+ +---+ | 939 | +---+ +---+ +---+ +---+ |
940 | 940 | ||
941 | Now the writer can update the head page. This is also why the head page must | 941 | Now the writer can update the head page. This is also why the head page must |
942 | remain in UPDATE and only reset by the outer most writer. This prevents | 942 | remain in UPDATE and only reset by the outermost writer. This prevents |
943 | the reader from seeing the incorrect head page. | 943 | the reader from seeing the incorrect head page. |
944 | 944 | ||
945 | 945 | ||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 4f8760d7b7a7..c2238cd474c7 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -18,6 +18,8 @@ config ARM | |||
18 | select HAVE_KRETPROBES if (HAVE_KPROBES) | 18 | select HAVE_KRETPROBES if (HAVE_KPROBES) |
19 | select HAVE_FUNCTION_TRACER if (!XIP_KERNEL) | 19 | select HAVE_FUNCTION_TRACER if (!XIP_KERNEL) |
20 | select HAVE_GENERIC_DMA_COHERENT | 20 | select HAVE_GENERIC_DMA_COHERENT |
21 | select HAVE_KERNEL_GZIP | ||
22 | select HAVE_KERNEL_LZO | ||
21 | help | 23 | help |
22 | The ARM series is a line of low-power-consumption RISC chip designs | 24 | The ARM series is a line of low-power-consumption RISC chip designs |
23 | licensed by ARM Ltd and targeted at embedded applications and | 25 | licensed by ARM Ltd and targeted at embedded applications and |
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index ce39dc540085..2d4d88ba73bf 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile | |||
@@ -63,8 +63,12 @@ endif | |||
63 | 63 | ||
64 | SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/ | 64 | SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/ |
65 | 65 | ||
66 | targets := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \ | 66 | suffix_$(CONFIG_KERNEL_GZIP) = gzip |
67 | head.o misc.o $(OBJS) | 67 | suffix_$(CONFIG_KERNEL_LZO) = lzo |
68 | |||
69 | targets := vmlinux vmlinux.lds \ | ||
70 | piggy.$(suffix_y) piggy.$(suffix_y).o \ | ||
71 | font.o font.c head.o misc.o $(OBJS) | ||
68 | 72 | ||
69 | ifeq ($(CONFIG_FUNCTION_TRACER),y) | 73 | ifeq ($(CONFIG_FUNCTION_TRACER),y) |
70 | ORIG_CFLAGS := $(KBUILD_CFLAGS) | 74 | ORIG_CFLAGS := $(KBUILD_CFLAGS) |
@@ -87,22 +91,34 @@ endif | |||
87 | ifneq ($(PARAMS_PHYS),) | 91 | ifneq ($(PARAMS_PHYS),) |
88 | LDFLAGS_vmlinux += --defsym params_phys=$(PARAMS_PHYS) | 92 | LDFLAGS_vmlinux += --defsym params_phys=$(PARAMS_PHYS) |
89 | endif | 93 | endif |
90 | LDFLAGS_vmlinux += -p --no-undefined -X \ | 94 | # ? |
91 | $(shell $(CC) $(KBUILD_CFLAGS) --print-libgcc-file-name) -T | 95 | LDFLAGS_vmlinux += -p |
96 | # Report unresolved symbol references | ||
97 | LDFLAGS_vmlinux += --no-undefined | ||
98 | # Delete all temporary local symbols | ||
99 | LDFLAGS_vmlinux += -X | ||
100 | # Next argument is a linker script | ||
101 | LDFLAGS_vmlinux += -T | ||
102 | |||
103 | # For __aeabi_uidivmod | ||
104 | lib1funcs = $(obj)/lib1funcs.o | ||
105 | |||
106 | $(obj)/lib1funcs.S: $(srctree)/arch/$(SRCARCH)/lib/lib1funcs.S FORCE | ||
107 | $(call cmd,shipped) | ||
92 | 108 | ||
93 | # Don't allow any static data in misc.o, which | 109 | # Don't allow any static data in misc.o, which |
94 | # would otherwise mess up our GOT table | 110 | # would otherwise mess up our GOT table |
95 | CFLAGS_misc.o := -Dstatic= | 111 | CFLAGS_misc.o := -Dstatic= |
96 | 112 | ||
97 | $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \ | 113 | $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \ |
98 | $(addprefix $(obj)/, $(OBJS)) FORCE | 114 | $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) FORCE |
99 | $(call if_changed,ld) | 115 | $(call if_changed,ld) |
100 | @: | 116 | @: |
101 | 117 | ||
102 | $(obj)/piggy.gz: $(obj)/../Image FORCE | 118 | $(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE |
103 | $(call if_changed,gzip) | 119 | $(call if_changed,$(suffix_y)) |
104 | 120 | ||
105 | $(obj)/piggy.o: $(obj)/piggy.gz FORCE | 121 | $(obj)/piggy.$(suffix_y).o: $(obj)/piggy.$(suffix_y) FORCE |
106 | 122 | ||
107 | CFLAGS_font.o := -Dstatic= | 123 | CFLAGS_font.o := -Dstatic= |
108 | 124 | ||
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c index 17153b54613b..7e0fe4d42c7b 100644 --- a/arch/arm/boot/compressed/misc.c +++ b/arch/arm/boot/compressed/misc.c | |||
@@ -18,10 +18,15 @@ | |||
18 | 18 | ||
19 | unsigned int __machine_arch_type; | 19 | unsigned int __machine_arch_type; |
20 | 20 | ||
21 | #define _LINUX_STRING_H_ | ||
22 | |||
21 | #include <linux/compiler.h> /* for inline */ | 23 | #include <linux/compiler.h> /* for inline */ |
22 | #include <linux/types.h> /* for size_t */ | 24 | #include <linux/types.h> /* for size_t */ |
23 | #include <linux/stddef.h> /* for NULL */ | 25 | #include <linux/stddef.h> /* for NULL */ |
24 | #include <asm/string.h> | 26 | #include <asm/string.h> |
27 | #include <linux/linkage.h> | ||
28 | |||
29 | #include <asm/unaligned.h> | ||
25 | 30 | ||
26 | #ifdef STANDALONE_DEBUG | 31 | #ifdef STANDALONE_DEBUG |
27 | #define putstr printf | 32 | #define putstr printf |
@@ -188,34 +193,8 @@ static inline __ptr_t memcpy(__ptr_t __dest, __const __ptr_t __src, | |||
188 | /* | 193 | /* |
189 | * gzip delarations | 194 | * gzip delarations |
190 | */ | 195 | */ |
191 | #define OF(args) args | ||
192 | #define STATIC static | 196 | #define STATIC static |
193 | 197 | ||
194 | typedef unsigned char uch; | ||
195 | typedef unsigned short ush; | ||
196 | typedef unsigned long ulg; | ||
197 | |||
198 | #define WSIZE 0x8000 /* Window size must be at least 32k, */ | ||
199 | /* and a power of two */ | ||
200 | |||
201 | static uch *inbuf; /* input buffer */ | ||
202 | static uch window[WSIZE]; /* Sliding window buffer */ | ||
203 | |||
204 | static unsigned insize; /* valid bytes in inbuf */ | ||
205 | static unsigned inptr; /* index of next byte to be processed in inbuf */ | ||
206 | static unsigned outcnt; /* bytes in output buffer */ | ||
207 | |||
208 | /* gzip flag byte */ | ||
209 | #define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ | ||
210 | #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ | ||
211 | #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ | ||
212 | #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ | ||
213 | #define COMMENT 0x10 /* bit 4 set: file comment present */ | ||
214 | #define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ | ||
215 | #define RESERVED 0xC0 /* bit 6,7: reserved */ | ||
216 | |||
217 | #define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf()) | ||
218 | |||
219 | /* Diagnostic functions */ | 198 | /* Diagnostic functions */ |
220 | #ifdef DEBUG | 199 | #ifdef DEBUG |
221 | # define Assert(cond,msg) {if(!(cond)) error(msg);} | 200 | # define Assert(cond,msg) {if(!(cond)) error(msg);} |
@@ -233,24 +212,20 @@ static unsigned outcnt; /* bytes in output buffer */ | |||
233 | # define Tracecv(c,x) | 212 | # define Tracecv(c,x) |
234 | #endif | 213 | #endif |
235 | 214 | ||
236 | static int fill_inbuf(void); | ||
237 | static void flush_window(void); | ||
238 | static void error(char *m); | 215 | static void error(char *m); |
239 | 216 | ||
240 | extern char input_data[]; | 217 | extern char input_data[]; |
241 | extern char input_data_end[]; | 218 | extern char input_data_end[]; |
242 | 219 | ||
243 | static uch *output_data; | 220 | static unsigned char *output_data; |
244 | static ulg output_ptr; | 221 | static unsigned long output_ptr; |
245 | static ulg bytes_out; | ||
246 | 222 | ||
247 | static void error(char *m); | 223 | static void error(char *m); |
248 | 224 | ||
249 | static void putstr(const char *); | 225 | static void putstr(const char *); |
250 | 226 | ||
251 | extern int end; | 227 | static unsigned long free_mem_ptr; |
252 | static ulg free_mem_ptr; | 228 | static unsigned long free_mem_end_ptr; |
253 | static ulg free_mem_end_ptr; | ||
254 | 229 | ||
255 | #ifdef STANDALONE_DEBUG | 230 | #ifdef STANDALONE_DEBUG |
256 | #define NO_INFLATE_MALLOC | 231 | #define NO_INFLATE_MALLOC |
@@ -258,46 +233,13 @@ static ulg free_mem_end_ptr; | |||
258 | 233 | ||
259 | #define ARCH_HAS_DECOMP_WDOG | 234 | #define ARCH_HAS_DECOMP_WDOG |
260 | 235 | ||
261 | #include "../../../../lib/inflate.c" | 236 | #ifdef CONFIG_KERNEL_GZIP |
262 | 237 | #include "../../../../lib/decompress_inflate.c" | |
263 | /* =========================================================================== | 238 | #endif |
264 | * Fill the input buffer. This is called only when the buffer is empty | ||
265 | * and at least one byte is really needed. | ||
266 | */ | ||
267 | int fill_inbuf(void) | ||
268 | { | ||
269 | if (insize != 0) | ||
270 | error("ran out of input data"); | ||
271 | |||
272 | inbuf = input_data; | ||
273 | insize = &input_data_end[0] - &input_data[0]; | ||
274 | |||
275 | inptr = 1; | ||
276 | return inbuf[0]; | ||
277 | } | ||
278 | 239 | ||
279 | /* =========================================================================== | 240 | #ifdef CONFIG_KERNEL_LZO |
280 | * Write the output window window[0..outcnt-1] and update crc and bytes_out. | 241 | #include "../../../../lib/decompress_unlzo.c" |
281 | * (Used for the decompressed data only.) | 242 | #endif |
282 | */ | ||
283 | void flush_window(void) | ||
284 | { | ||
285 | ulg c = crc; | ||
286 | unsigned n; | ||
287 | uch *in, *out, ch; | ||
288 | |||
289 | in = window; | ||
290 | out = &output_data[output_ptr]; | ||
291 | for (n = 0; n < outcnt; n++) { | ||
292 | ch = *out++ = *in++; | ||
293 | c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8); | ||
294 | } | ||
295 | crc = c; | ||
296 | bytes_out += (ulg)outcnt; | ||
297 | output_ptr += (ulg)outcnt; | ||
298 | outcnt = 0; | ||
299 | putstr("."); | ||
300 | } | ||
301 | 243 | ||
302 | #ifndef arch_error | 244 | #ifndef arch_error |
303 | #define arch_error(x) | 245 | #define arch_error(x) |
@@ -314,22 +256,33 @@ static void error(char *x) | |||
314 | while(1); /* Halt */ | 256 | while(1); /* Halt */ |
315 | } | 257 | } |
316 | 258 | ||
259 | asmlinkage void __div0(void) | ||
260 | { | ||
261 | error("Attempting division by 0!"); | ||
262 | } | ||
263 | |||
317 | #ifndef STANDALONE_DEBUG | 264 | #ifndef STANDALONE_DEBUG |
318 | 265 | ||
319 | ulg | 266 | unsigned long |
320 | decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p, | 267 | decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p, |
321 | int arch_id) | 268 | unsigned long free_mem_ptr_end_p, |
269 | int arch_id) | ||
322 | { | 270 | { |
323 | output_data = (uch *)output_start; /* Points to kernel start */ | 271 | unsigned char *tmp; |
272 | |||
273 | output_data = (unsigned char *)output_start; | ||
324 | free_mem_ptr = free_mem_ptr_p; | 274 | free_mem_ptr = free_mem_ptr_p; |
325 | free_mem_end_ptr = free_mem_ptr_end_p; | 275 | free_mem_end_ptr = free_mem_ptr_end_p; |
326 | __machine_arch_type = arch_id; | 276 | __machine_arch_type = arch_id; |
327 | 277 | ||
328 | arch_decomp_setup(); | 278 | arch_decomp_setup(); |
329 | 279 | ||
330 | makecrc(); | 280 | tmp = (unsigned char *) (((unsigned long)input_data_end) - 4); |
281 | output_ptr = get_unaligned_le32(tmp); | ||
282 | |||
331 | putstr("Uncompressing Linux..."); | 283 | putstr("Uncompressing Linux..."); |
332 | gunzip(); | 284 | decompress(input_data, input_data_end - input_data, |
285 | NULL, NULL, output_data, NULL, error); | ||
333 | putstr(" done, booting the kernel.\n"); | 286 | putstr(" done, booting the kernel.\n"); |
334 | return output_ptr; | 287 | return output_ptr; |
335 | } | 288 | } |
@@ -341,11 +294,10 @@ int main() | |||
341 | { | 294 | { |
342 | output_data = output_buffer; | 295 | output_data = output_buffer; |
343 | 296 | ||
344 | makecrc(); | ||
345 | putstr("Uncompressing Linux..."); | 297 | putstr("Uncompressing Linux..."); |
346 | gunzip(); | 298 | decompress(input_data, input_data_end - input_data, |
299 | NULL, NULL, output_data, NULL, error); | ||
347 | putstr("done.\n"); | 300 | putstr("done.\n"); |
348 | return 0; | 301 | return 0; |
349 | } | 302 | } |
350 | #endif | 303 | #endif |
351 | |||
diff --git a/arch/arm/boot/compressed/piggy.gzip.S b/arch/arm/boot/compressed/piggy.gzip.S new file mode 100644 index 000000000000..a68adf91a165 --- /dev/null +++ b/arch/arm/boot/compressed/piggy.gzip.S | |||
@@ -0,0 +1,6 @@ | |||
1 | .section .piggydata,#alloc | ||
2 | .globl input_data | ||
3 | input_data: | ||
4 | .incbin "arch/arm/boot/compressed/piggy.gzip" | ||
5 | .globl input_data_end | ||
6 | input_data_end: | ||
diff --git a/arch/arm/boot/compressed/piggy.S b/arch/arm/boot/compressed/piggy.lzo.S index 54c951800ebd..a425ad95959a 100644 --- a/arch/arm/boot/compressed/piggy.S +++ b/arch/arm/boot/compressed/piggy.lzo.S | |||
@@ -1,6 +1,6 @@ | |||
1 | .section .piggydata,#alloc | 1 | .section .piggydata,#alloc |
2 | .globl input_data | 2 | .globl input_data |
3 | input_data: | 3 | input_data: |
4 | .incbin "arch/arm/boot/compressed/piggy.gz" | 4 | .incbin "arch/arm/boot/compressed/piggy.lzo" |
5 | .globl input_data_end | 5 | .globl input_data_end |
6 | input_data_end: | 6 | input_data_end: |
diff --git a/arch/arm/mach-omap1/clock_data.c b/arch/arm/mach-omap1/clock_data.c index ab995a9c606c..65e7b5b85d83 100644 --- a/arch/arm/mach-omap1/clock_data.c +++ b/arch/arm/mach-omap1/clock_data.c | |||
@@ -599,7 +599,7 @@ static struct clk i2c_ick = { | |||
599 | static struct omap_clk omap_clks[] = { | 599 | static struct omap_clk omap_clks[] = { |
600 | /* non-ULPD clocks */ | 600 | /* non-ULPD clocks */ |
601 | CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX), | 601 | CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX), |
602 | CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310), | 602 | CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310 | CK_7XX), |
603 | /* CK_GEN1 clocks */ | 603 | /* CK_GEN1 clocks */ |
604 | CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX), | 604 | CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX), |
605 | CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX), | 605 | CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX), |
@@ -627,7 +627,7 @@ static struct omap_clk omap_clks[] = { | |||
627 | CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX), | 627 | CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX), |
628 | CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310), | 628 | CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310), |
629 | CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX), | 629 | CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX), |
630 | CLK(NULL, "api_ck", &api_ck.clk, CK_16XX | CK_1510 | CK_310), | 630 | CLK(NULL, "api_ck", &api_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX), |
631 | CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310), | 631 | CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310), |
632 | CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX), | 632 | CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX), |
633 | CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX), | 633 | CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX), |
@@ -658,6 +658,10 @@ static struct omap_clk omap_clks[] = { | |||
658 | CLK("i2c_omap.1", "fck", &i2c_fck, CK_16XX | CK_1510 | CK_310 | CK_7XX), | 658 | CLK("i2c_omap.1", "fck", &i2c_fck, CK_16XX | CK_1510 | CK_310 | CK_7XX), |
659 | CLK("i2c_omap.1", "ick", &i2c_ick, CK_16XX), | 659 | CLK("i2c_omap.1", "ick", &i2c_ick, CK_16XX), |
660 | CLK("i2c_omap.1", "ick", &dummy_ck, CK_1510 | CK_310 | CK_7XX), | 660 | CLK("i2c_omap.1", "ick", &dummy_ck, CK_1510 | CK_310 | CK_7XX), |
661 | CLK("omap1_spi100k.1", "fck", &dummy_ck, CK_7XX), | ||
662 | CLK("omap1_spi100k.1", "ick", &dummy_ck, CK_7XX), | ||
663 | CLK("omap1_spi100k.2", "fck", &dummy_ck, CK_7XX), | ||
664 | CLK("omap1_spi100k.2", "ick", &dummy_ck, CK_7XX), | ||
661 | CLK("omap_uwire", "fck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310), | 665 | CLK("omap_uwire", "fck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310), |
662 | CLK("omap-mcbsp.1", "ick", &dspper_ck, CK_16XX), | 666 | CLK("omap-mcbsp.1", "ick", &dspper_ck, CK_16XX), |
663 | CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_1510 | CK_310), | 667 | CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_1510 | CK_310), |
@@ -674,7 +678,7 @@ static struct omap_clk omap_clks[] = { | |||
674 | * init | 678 | * init |
675 | */ | 679 | */ |
676 | 680 | ||
677 | static struct clk_functions omap1_clk_functions __initdata = { | 681 | static struct clk_functions omap1_clk_functions = { |
678 | .clk_enable = omap1_clk_enable, | 682 | .clk_enable = omap1_clk_enable, |
679 | .clk_disable = omap1_clk_disable, | 683 | .clk_disable = omap1_clk_disable, |
680 | .clk_round_rate = omap1_clk_round_rate, | 684 | .clk_round_rate = omap1_clk_round_rate, |
diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c index 23ded2d49600..a2d07aa75c9e 100644 --- a/arch/arm/mach-omap1/devices.c +++ b/arch/arm/mach-omap1/devices.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <linux/spi/spi.h> | ||
17 | 18 | ||
18 | #include <mach/hardware.h> | 19 | #include <mach/hardware.h> |
19 | #include <asm/mach/map.h> | 20 | #include <asm/mach/map.h> |
@@ -23,6 +24,7 @@ | |||
23 | #include <plat/mux.h> | 24 | #include <plat/mux.h> |
24 | #include <mach/gpio.h> | 25 | #include <mach/gpio.h> |
25 | #include <plat/mmc.h> | 26 | #include <plat/mmc.h> |
27 | #include <plat/omap7xx.h> | ||
26 | 28 | ||
27 | /*-------------------------------------------------------------------------*/ | 29 | /*-------------------------------------------------------------------------*/ |
28 | 30 | ||
@@ -196,6 +198,38 @@ void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, | |||
196 | 198 | ||
197 | /*-------------------------------------------------------------------------*/ | 199 | /*-------------------------------------------------------------------------*/ |
198 | 200 | ||
201 | /* OMAP7xx SPI support */ | ||
202 | #if defined(CONFIG_SPI_OMAP_100K) || defined(CONFIG_SPI_OMAP_100K_MODULE) | ||
203 | |||
204 | struct platform_device omap_spi1 = { | ||
205 | .name = "omap1_spi100k", | ||
206 | .id = 1, | ||
207 | }; | ||
208 | |||
209 | struct platform_device omap_spi2 = { | ||
210 | .name = "omap1_spi100k", | ||
211 | .id = 2, | ||
212 | }; | ||
213 | |||
214 | static void omap_init_spi100k(void) | ||
215 | { | ||
216 | omap_spi1.dev.platform_data = ioremap(OMAP7XX_SPI1_BASE, 0x7ff); | ||
217 | if (omap_spi1.dev.platform_data) | ||
218 | platform_device_register(&omap_spi1); | ||
219 | |||
220 | omap_spi2.dev.platform_data = ioremap(OMAP7XX_SPI2_BASE, 0x7ff); | ||
221 | if (omap_spi2.dev.platform_data) | ||
222 | platform_device_register(&omap_spi2); | ||
223 | } | ||
224 | |||
225 | #else | ||
226 | static inline void omap_init_spi100k(void) | ||
227 | { | ||
228 | } | ||
229 | #endif | ||
230 | |||
231 | /*-------------------------------------------------------------------------*/ | ||
232 | |||
199 | #if defined(CONFIG_OMAP_STI) | 233 | #if defined(CONFIG_OMAP_STI) |
200 | 234 | ||
201 | #define OMAP1_STI_BASE 0xfffea000 | 235 | #define OMAP1_STI_BASE 0xfffea000 |
@@ -263,6 +297,7 @@ static int __init omap1_init_devices(void) | |||
263 | 297 | ||
264 | omap_init_mbox(); | 298 | omap_init_mbox(); |
265 | omap_init_rtc(); | 299 | omap_init_rtc(); |
300 | omap_init_spi100k(); | ||
266 | omap_init_sti(); | 301 | omap_init_sti(); |
267 | 302 | ||
268 | return 0; | 303 | return 0; |
diff --git a/arch/arm/mach-omap1/mux.c b/arch/arm/mach-omap1/mux.c index 07212cc621ae..84341377232d 100644 --- a/arch/arm/mach-omap1/mux.c +++ b/arch/arm/mach-omap1/mux.c | |||
@@ -62,6 +62,14 @@ MUX_CFG_7XX("MMC_7XX_DAT0", 2, 17, 0, 16, 1, 0) | |||
62 | /* I2C interface */ | 62 | /* I2C interface */ |
63 | MUX_CFG_7XX("I2C_7XX_SCL", 5, 1, 0, 0, 1, 0) | 63 | MUX_CFG_7XX("I2C_7XX_SCL", 5, 1, 0, 0, 1, 0) |
64 | MUX_CFG_7XX("I2C_7XX_SDA", 5, 5, 0, 0, 1, 0) | 64 | MUX_CFG_7XX("I2C_7XX_SDA", 5, 5, 0, 0, 1, 0) |
65 | |||
66 | /* SPI pins */ | ||
67 | MUX_CFG_7XX("SPI_7XX_1", 6, 5, 4, 4, 1, 0) | ||
68 | MUX_CFG_7XX("SPI_7XX_2", 6, 9, 4, 8, 1, 0) | ||
69 | MUX_CFG_7XX("SPI_7XX_3", 6, 13, 4, 12, 1, 0) | ||
70 | MUX_CFG_7XX("SPI_7XX_4", 6, 17, 4, 16, 1, 0) | ||
71 | MUX_CFG_7XX("SPI_7XX_5", 8, 25, 0, 24, 0, 0) | ||
72 | MUX_CFG_7XX("SPI_7XX_6", 9, 5, 0, 4, 0, 0) | ||
65 | }; | 73 | }; |
66 | #define OMAP7XX_PINS_SZ ARRAY_SIZE(omap7xx_pins) | 74 | #define OMAP7XX_PINS_SZ ARRAY_SIZE(omap7xx_pins) |
67 | #else | 75 | #else |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 10eafa70a909..606bf04f51b6 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -80,6 +80,7 @@ config MACH_OVERO | |||
80 | config MACH_OMAP3EVM | 80 | config MACH_OMAP3EVM |
81 | bool "OMAP 3530 EVM board" | 81 | bool "OMAP 3530 EVM board" |
82 | depends on ARCH_OMAP3 && ARCH_OMAP34XX | 82 | depends on ARCH_OMAP3 && ARCH_OMAP34XX |
83 | select OMAP_PACKAGE_CBB | ||
83 | 84 | ||
84 | config MACH_OMAP3517EVM | 85 | config MACH_OMAP3517EVM |
85 | bool "OMAP3517/ AM3517 EVM board" | 86 | bool "OMAP3517/ AM3517 EVM board" |
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 8dd277c36661..1e3dfb652acc 100755 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c | |||
@@ -63,21 +63,21 @@ static int board_keymap[] = { | |||
63 | KEY(5, 1, KEY_H), | 63 | KEY(5, 1, KEY_H), |
64 | KEY(5, 2, KEY_J), | 64 | KEY(5, 2, KEY_J), |
65 | KEY(5, 3, KEY_F3), | 65 | KEY(5, 3, KEY_F3), |
66 | KEY(5, 4, KEY_UNKNOWN), | ||
66 | KEY(5, 5, KEY_VOLUMEDOWN), | 67 | KEY(5, 5, KEY_VOLUMEDOWN), |
67 | KEY(5, 6, KEY_M), | 68 | KEY(5, 6, KEY_M), |
68 | KEY(5, 7, KEY_ENTER), | 69 | KEY(5, 7, KEY_RIGHT), |
69 | KEY(6, 0, KEY_Q), | 70 | KEY(6, 0, KEY_Q), |
70 | KEY(6, 1, KEY_A), | 71 | KEY(6, 1, KEY_A), |
71 | KEY(6, 2, KEY_N), | 72 | KEY(6, 2, KEY_N), |
72 | KEY(6, 3, KEY_BACKSPACE), | 73 | KEY(6, 3, KEY_BACKSPACE), |
73 | KEY(6, 6, KEY_P), | 74 | KEY(6, 6, KEY_P), |
74 | KEY(6, 7, KEY_SELECT), | 75 | KEY(6, 7, KEY_UP), |
75 | KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */ | 76 | KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */ |
76 | KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */ | 77 | KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */ |
77 | KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */ | 78 | KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */ |
78 | KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */ | 79 | KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */ |
79 | KEY(7, 5, KEY_RIGHT), | 80 | KEY(7, 6, KEY_SELECT), |
80 | KEY(7, 6, KEY_UP), | ||
81 | KEY(7, 7, KEY_DOWN) | 81 | KEY(7, 7, KEY_DOWN) |
82 | }; | 82 | }; |
83 | 83 | ||
diff --git a/arch/arm/mach-omap2/clock2xxx.c b/arch/arm/mach-omap2/clock2xxx.c index d0e3fb7f9298..5420356eb407 100644 --- a/arch/arm/mach-omap2/clock2xxx.c +++ b/arch/arm/mach-omap2/clock2xxx.c | |||
@@ -449,40 +449,78 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate) | |||
449 | #ifdef CONFIG_CPU_FREQ | 449 | #ifdef CONFIG_CPU_FREQ |
450 | /* | 450 | /* |
451 | * Walk PRCM rate table and fillout cpufreq freq_table | 451 | * Walk PRCM rate table and fillout cpufreq freq_table |
452 | * XXX This should be replaced by an OPP layer in the near future | ||
452 | */ | 453 | */ |
453 | static struct cpufreq_frequency_table freq_table[ARRAY_SIZE(rate_table)]; | 454 | static struct cpufreq_frequency_table *freq_table; |
454 | 455 | ||
455 | void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table) | 456 | void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table) |
456 | { | 457 | { |
457 | struct prcm_config *prcm; | 458 | const struct prcm_config *prcm; |
459 | long sys_ck_rate; | ||
458 | int i = 0; | 460 | int i = 0; |
461 | int tbl_sz = 0; | ||
462 | |||
463 | sys_ck_rate = clk_get_rate(sclk); | ||
459 | 464 | ||
460 | for (prcm = rate_table; prcm->mpu_speed; prcm++) { | 465 | for (prcm = rate_table; prcm->mpu_speed; prcm++) { |
461 | if (!(prcm->flags & cpu_mask)) | 466 | if (!(prcm->flags & cpu_mask)) |
462 | continue; | 467 | continue; |
463 | if (prcm->xtal_speed != sys_ck.rate) | 468 | if (prcm->xtal_speed != sys_ck_rate) |
464 | continue; | 469 | continue; |
465 | 470 | ||
466 | /* don't put bypass rates in table */ | 471 | /* don't put bypass rates in table */ |
467 | if (prcm->dpll_speed == prcm->xtal_speed) | 472 | if (prcm->dpll_speed == prcm->xtal_speed) |
468 | continue; | 473 | continue; |
469 | 474 | ||
470 | freq_table[i].index = i; | 475 | tbl_sz++; |
471 | freq_table[i].frequency = prcm->mpu_speed / 1000; | ||
472 | i++; | ||
473 | } | 476 | } |
474 | 477 | ||
475 | if (i == 0) { | 478 | /* |
476 | printk(KERN_WARNING "%s: failed to initialize frequency " | 479 | * XXX Ensure that we're doing what CPUFreq expects for this error |
477 | "table\n", __func__); | 480 | * case and the following one |
481 | */ | ||
482 | if (tbl_sz == 0) { | ||
483 | pr_warning("%s: no matching entries in rate_table\n", | ||
484 | __func__); | ||
485 | return; | ||
486 | } | ||
487 | |||
488 | /* Include the CPUFREQ_TABLE_END terminator entry */ | ||
489 | tbl_sz++; | ||
490 | |||
491 | freq_table = kzalloc(sizeof(struct cpufreq_frequency_table) * tbl_sz, | ||
492 | GFP_ATOMIC); | ||
493 | if (!freq_table) { | ||
494 | pr_err("%s: could not kzalloc frequency table\n", __func__); | ||
478 | return; | 495 | return; |
479 | } | 496 | } |
480 | 497 | ||
498 | for (prcm = rate_table; prcm->mpu_speed; prcm++) { | ||
499 | if (!(prcm->flags & cpu_mask)) | ||
500 | continue; | ||
501 | if (prcm->xtal_speed != sys_ck_rate) | ||
502 | continue; | ||
503 | |||
504 | /* don't put bypass rates in table */ | ||
505 | if (prcm->dpll_speed == prcm->xtal_speed) | ||
506 | continue; | ||
507 | |||
508 | freq_table[i].index = i; | ||
509 | freq_table[i].frequency = prcm->mpu_speed / 1000; | ||
510 | i++; | ||
511 | } | ||
512 | |||
481 | freq_table[i].index = i; | 513 | freq_table[i].index = i; |
482 | freq_table[i].frequency = CPUFREQ_TABLE_END; | 514 | freq_table[i].frequency = CPUFREQ_TABLE_END; |
483 | 515 | ||
484 | *table = &freq_table[0]; | 516 | *table = &freq_table[0]; |
485 | } | 517 | } |
518 | |||
519 | void omap2_clk_exit_cpufreq_table(struct cpufreq_frequency_table **table) | ||
520 | { | ||
521 | kfree(freq_table); | ||
522 | } | ||
523 | |||
486 | #endif | 524 | #endif |
487 | 525 | ||
488 | struct clk_functions omap2_clk_functions = { | 526 | struct clk_functions omap2_clk_functions = { |
@@ -494,6 +532,7 @@ struct clk_functions omap2_clk_functions = { | |||
494 | .clk_disable_unused = omap2_clk_disable_unused, | 532 | .clk_disable_unused = omap2_clk_disable_unused, |
495 | #ifdef CONFIG_CPU_FREQ | 533 | #ifdef CONFIG_CPU_FREQ |
496 | .clk_init_cpufreq_table = omap2_clk_init_cpufreq_table, | 534 | .clk_init_cpufreq_table = omap2_clk_init_cpufreq_table, |
535 | .clk_exit_cpufreq_table = omap2_clk_exit_cpufreq_table, | ||
497 | #endif | 536 | #endif |
498 | }; | 537 | }; |
499 | 538 | ||
diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c index ded32364f32b..d4217b93e10b 100644 --- a/arch/arm/mach-omap2/clock34xx.c +++ b/arch/arm/mach-omap2/clock34xx.c | |||
@@ -34,7 +34,6 @@ | |||
34 | #include <asm/div64.h> | 34 | #include <asm/div64.h> |
35 | #include <asm/clkdev.h> | 35 | #include <asm/clkdev.h> |
36 | 36 | ||
37 | #include <plat/sdrc.h> | ||
38 | #include "clock.h" | 37 | #include "clock.h" |
39 | #include "clock34xx.h" | 38 | #include "clock34xx.h" |
40 | #include "sdrc.h" | 39 | #include "sdrc.h" |
diff --git a/arch/arm/mach-omap2/clock34xx_data.c b/arch/arm/mach-omap2/clock34xx_data.c index 8bdcc9cc7f9a..c6031d74d6f6 100644 --- a/arch/arm/mach-omap2/clock34xx_data.c +++ b/arch/arm/mach-omap2/clock34xx_data.c | |||
@@ -776,6 +776,8 @@ static struct clk dpll4_m5_ck = { | |||
776 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, | 776 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, |
777 | .clksel = div16_dpll4_clksel, | 777 | .clksel = div16_dpll4_clksel, |
778 | .clkdm_name = "dpll4_clkdm", | 778 | .clkdm_name = "dpll4_clkdm", |
779 | .set_rate = &omap2_clksel_set_rate, | ||
780 | .round_rate = &omap2_clksel_round_rate, | ||
779 | .recalc = &omap2_clksel_recalc, | 781 | .recalc = &omap2_clksel_recalc, |
780 | }; | 782 | }; |
781 | 783 | ||
@@ -1500,6 +1502,7 @@ static struct clk uart2_fck = { | |||
1500 | .parent = &core_48m_fck, | 1502 | .parent = &core_48m_fck, |
1501 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1503 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1502 | .enable_bit = OMAP3430_EN_UART2_SHIFT, | 1504 | .enable_bit = OMAP3430_EN_UART2_SHIFT, |
1505 | .clkdm_name = "core_l4_clkdm", | ||
1503 | .recalc = &followparent_recalc, | 1506 | .recalc = &followparent_recalc, |
1504 | }; | 1507 | }; |
1505 | 1508 | ||
@@ -1509,6 +1512,7 @@ static struct clk uart1_fck = { | |||
1509 | .parent = &core_48m_fck, | 1512 | .parent = &core_48m_fck, |
1510 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1513 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1511 | .enable_bit = OMAP3430_EN_UART1_SHIFT, | 1514 | .enable_bit = OMAP3430_EN_UART1_SHIFT, |
1515 | .clkdm_name = "core_l4_clkdm", | ||
1512 | .recalc = &followparent_recalc, | 1516 | .recalc = &followparent_recalc, |
1513 | }; | 1517 | }; |
1514 | 1518 | ||
@@ -2745,7 +2749,7 @@ static struct clk mcbsp4_ick = { | |||
2745 | }; | 2749 | }; |
2746 | 2750 | ||
2747 | static const struct clksel mcbsp_234_clksel[] = { | 2751 | static const struct clksel mcbsp_234_clksel[] = { |
2748 | { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates }, | 2752 | { .parent = &per_96m_fck, .rates = common_mcbsp_96m_rates }, |
2749 | { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, | 2753 | { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, |
2750 | { .parent = NULL } | 2754 | { .parent = NULL } |
2751 | }; | 2755 | }; |
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c index 1a45ed1e8ba1..dd285f001467 100644 --- a/arch/arm/mach-omap2/clockdomain.c +++ b/arch/arm/mach-omap2/clockdomain.c | |||
@@ -559,7 +559,7 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) | |||
559 | * downstream clocks for debugging purposes? | 559 | * downstream clocks for debugging purposes? |
560 | */ | 560 | */ |
561 | 561 | ||
562 | if (!clkdm || !clk) | 562 | if (!clkdm || !clk || !clkdm->clktrctrl_mask) |
563 | return -EINVAL; | 563 | return -EINVAL; |
564 | 564 | ||
565 | if (atomic_inc_return(&clkdm->usecount) > 1) | 565 | if (atomic_inc_return(&clkdm->usecount) > 1) |
@@ -610,7 +610,7 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk) | |||
610 | * downstream clocks for debugging purposes? | 610 | * downstream clocks for debugging purposes? |
611 | */ | 611 | */ |
612 | 612 | ||
613 | if (!clkdm || !clk) | 613 | if (!clkdm || !clk || !clkdm->clktrctrl_mask) |
614 | return -EINVAL; | 614 | return -EINVAL; |
615 | 615 | ||
616 | #ifdef DEBUG | 616 | #ifdef DEBUG |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index a8749e8017b9..5a7996402c53 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -33,7 +33,6 @@ | |||
33 | #include <plat/sdrc.h> | 33 | #include <plat/sdrc.h> |
34 | #include <plat/gpmc.h> | 34 | #include <plat/gpmc.h> |
35 | #include <plat/serial.h> | 35 | #include <plat/serial.h> |
36 | #include <plat/mux.h> | ||
37 | #include <plat/vram.h> | 36 | #include <plat/vram.h> |
38 | 37 | ||
39 | #include "clock.h" | 38 | #include "clock.h" |
@@ -73,21 +72,21 @@ static struct map_desc omap24xx_io_desc[] __initdata = { | |||
73 | #ifdef CONFIG_ARCH_OMAP2420 | 72 | #ifdef CONFIG_ARCH_OMAP2420 |
74 | static struct map_desc omap242x_io_desc[] __initdata = { | 73 | static struct map_desc omap242x_io_desc[] __initdata = { |
75 | { | 74 | { |
76 | .virtual = DSP_MEM_24XX_VIRT, | 75 | .virtual = DSP_MEM_2420_VIRT, |
77 | .pfn = __phys_to_pfn(DSP_MEM_24XX_PHYS), | 76 | .pfn = __phys_to_pfn(DSP_MEM_2420_PHYS), |
78 | .length = DSP_MEM_24XX_SIZE, | 77 | .length = DSP_MEM_2420_SIZE, |
79 | .type = MT_DEVICE | 78 | .type = MT_DEVICE |
80 | }, | 79 | }, |
81 | { | 80 | { |
82 | .virtual = DSP_IPI_24XX_VIRT, | 81 | .virtual = DSP_IPI_2420_VIRT, |
83 | .pfn = __phys_to_pfn(DSP_IPI_24XX_PHYS), | 82 | .pfn = __phys_to_pfn(DSP_IPI_2420_PHYS), |
84 | .length = DSP_IPI_24XX_SIZE, | 83 | .length = DSP_IPI_2420_SIZE, |
85 | .type = MT_DEVICE | 84 | .type = MT_DEVICE |
86 | }, | 85 | }, |
87 | { | 86 | { |
88 | .virtual = DSP_MMU_24XX_VIRT, | 87 | .virtual = DSP_MMU_2420_VIRT, |
89 | .pfn = __phys_to_pfn(DSP_MMU_24XX_PHYS), | 88 | .pfn = __phys_to_pfn(DSP_MMU_2420_PHYS), |
90 | .length = DSP_MMU_24XX_SIZE, | 89 | .length = DSP_MMU_2420_SIZE, |
91 | .type = MT_DEVICE | 90 | .type = MT_DEVICE |
92 | }, | 91 | }, |
93 | }; | 92 | }; |
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index e071b3fd1878..459ef23ab8a8 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c | |||
@@ -994,8 +994,10 @@ int __init omap_mux_init(u32 mux_pbase, u32 mux_size, | |||
994 | } | 994 | } |
995 | 995 | ||
996 | #ifdef CONFIG_OMAP_MUX | 996 | #ifdef CONFIG_OMAP_MUX |
997 | omap_mux_package_fixup(package_subset, superset); | 997 | if (package_subset) |
998 | omap_mux_package_init_balls(package_balls, superset); | 998 | omap_mux_package_fixup(package_subset, superset); |
999 | if (package_balls) | ||
1000 | omap_mux_package_init_balls(package_balls, superset); | ||
999 | omap_mux_set_cmdline_signals(); | 1001 | omap_mux_set_cmdline_signals(); |
1000 | omap_mux_set_board_signals(board_mux); | 1002 | omap_mux_set_board_signals(board_mux); |
1001 | #endif | 1003 | #endif |
diff --git a/arch/arm/mach-omap2/opp2420_data.c b/arch/arm/mach-omap2/opp2420_data.c index 126a9396b3a8..e6dda694fd5c 100644 --- a/arch/arm/mach-omap2/opp2420_data.c +++ b/arch/arm/mach-omap2/opp2420_data.c | |||
@@ -9,45 +9,47 @@ | |||
9 | * The OMAP2 processor can be run at several discrete 'PRCM configurations'. | 9 | * The OMAP2 processor can be run at several discrete 'PRCM configurations'. |
10 | * These configurations are characterized by voltage and speed for clocks. | 10 | * These configurations are characterized by voltage and speed for clocks. |
11 | * The device is only validated for certain combinations. One way to express | 11 | * The device is only validated for certain combinations. One way to express |
12 | * these combinations is via the 'ratio's' which the clocks operate with | 12 | * these combinations is via the 'ratios' which the clocks operate with |
13 | * respect to each other. These ratio sets are for a given voltage/DPLL | 13 | * respect to each other. These ratio sets are for a given voltage/DPLL |
14 | * setting. All configurations can be described by a DPLL setting and a ratio | 14 | * setting. All configurations can be described by a DPLL setting and a ratio. |
15 | * There are 3 ratio sets for the 2430 and X ratio sets for 2420. | ||
16 | * | ||
17 | * 2430 differs from 2420 in that there are no more phase synchronizers used. | ||
18 | * They both have a slightly different clock domain setup. 2420(iva1,dsp) vs | ||
19 | * 2430 (iva2.1, NOdsp, mdm) | ||
20 | * | 15 | * |
21 | * XXX Missing voltage data. | 16 | * XXX Missing voltage data. |
17 | * XXX Missing 19.2MHz sys_clk rate sets (needed for N800/N810) | ||
22 | * | 18 | * |
23 | * THe format described in this file is deprecated. Once a reasonable | 19 | * THe format described in this file is deprecated. Once a reasonable |
24 | * OPP API exists, the data in this file should be converted to use it. | 20 | * OPP API exists, the data in this file should be converted to use it. |
25 | * | 21 | * |
26 | * This is technically part of the OMAP2xxx clock code. | 22 | * This is technically part of the OMAP2xxx clock code. |
23 | * | ||
24 | * Considerable work is still needed to fully support dynamic frequency | ||
25 | * changes on OMAP2xxx-series chips. Readers interested in such a | ||
26 | * project are encouraged to review the Maemo Diablo RX-34 and RX-44 | ||
27 | * kernel source at: | ||
28 | * http://repository.maemo.org/pool/diablo/free/k/kernel-source-diablo/ | ||
27 | */ | 29 | */ |
28 | 30 | ||
29 | #include "opp2xxx.h" | 31 | #include "opp2xxx.h" |
30 | #include "sdrc.h" | 32 | #include "sdrc.h" |
31 | #include "clock.h" | 33 | #include "clock.h" |
32 | 34 | ||
33 | /*------------------------------------------------------------------------- | 35 | /* |
34 | * Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated. | 36 | * Key dividers which make up a PRCM set. Ratios for a PRCM are mandated. |
35 | * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU, | 37 | * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU, |
36 | * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL, | 38 | * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL, |
37 | * CM_CLKSEL2_PLL, CM_CLKSEL_MDM | 39 | * CM_CLKSEL2_PLL, CM_CLKSEL_MDM |
38 | * | 40 | * |
39 | * Filling in table based on H4 boards and 2430-SDPs variants available. | 41 | * Filling in table based on H4 boards available. There are quite a |
40 | * There are quite a few more rates combinations which could be defined. | 42 | * few more rate combinations which could be defined. |
41 | * | 43 | * |
42 | * When multiple values are defined the start up will try and choose the | 44 | * When multiple values are defined the start up will try and choose |
43 | * fastest one. If a 'fast' value is defined, then automatically, the /2 | 45 | * the fastest one. If a 'fast' value is defined, then automatically, |
44 | * one should be included as it can be used. Generally having more that | 46 | * the /2 one should be included as it can be used. Generally having |
45 | * one fast set does not make sense, as static timings need to be changed | 47 | * more than one fast set does not make sense, as static timings need |
46 | * to change the set. The exception is the bypass setting which is | 48 | * to be changed to change the set. The exception is the bypass |
47 | * availble for low power bypass. | 49 | * setting which is available for low power bypass. |
48 | * | 50 | * |
49 | * Note: This table needs to be sorted, fastest to slowest. | 51 | * Note: This table needs to be sorted, fastest to slowest. |
50 | *-------------------------------------------------------------------------*/ | 52 | **/ |
51 | const struct prcm_config omap2420_rate_table[] = { | 53 | const struct prcm_config omap2420_rate_table[] = { |
52 | /* PRCM I - FAST */ | 54 | /* PRCM I - FAST */ |
53 | {S12M, S660M, S330M, RI_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */ | 55 | {S12M, S660M, S330M, RI_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */ |
diff --git a/arch/arm/mach-omap2/opp2430_data.c b/arch/arm/mach-omap2/opp2430_data.c index edb81672c844..1b9596ae201e 100644 --- a/arch/arm/mach-omap2/opp2430_data.c +++ b/arch/arm/mach-omap2/opp2430_data.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * opp2420_data.c - old-style "OPP" table for OMAP2420 | 2 | * opp2430_data.c - old-style "OPP" table for OMAP2430 |
3 | * | 3 | * |
4 | * Copyright (C) 2005-2009 Texas Instruments, Inc. | 4 | * Copyright (C) 2005-2009 Texas Instruments, Inc. |
5 | * Copyright (C) 2004-2009 Nokia Corporation | 5 | * Copyright (C) 2004-2009 Nokia Corporation |
@@ -9,16 +9,16 @@ | |||
9 | * The OMAP2 processor can be run at several discrete 'PRCM configurations'. | 9 | * The OMAP2 processor can be run at several discrete 'PRCM configurations'. |
10 | * These configurations are characterized by voltage and speed for clocks. | 10 | * These configurations are characterized by voltage and speed for clocks. |
11 | * The device is only validated for certain combinations. One way to express | 11 | * The device is only validated for certain combinations. One way to express |
12 | * these combinations is via the 'ratio's' which the clocks operate with | 12 | * these combinations is via the 'ratios' which the clocks operate with |
13 | * respect to each other. These ratio sets are for a given voltage/DPLL | 13 | * respect to each other. These ratio sets are for a given voltage/DPLL |
14 | * setting. All configurations can be described by a DPLL setting and a ratio | 14 | * setting. All configurations can be described by a DPLL setting and a ratio. |
15 | * There are 3 ratio sets for the 2430 and X ratio sets for 2420. | ||
16 | * | 15 | * |
17 | * 2430 differs from 2420 in that there are no more phase synchronizers used. | 16 | * 2430 differs from 2420 in that there are no more phase synchronizers used. |
18 | * They both have a slightly different clock domain setup. 2420(iva1,dsp) vs | 17 | * They both have a slightly different clock domain setup. 2420(iva1,dsp) vs |
19 | * 2430 (iva2.1, NOdsp, mdm) | 18 | * 2430 (iva2.1, NOdsp, mdm) |
20 | * | 19 | * |
21 | * XXX Missing voltage data. | 20 | * XXX Missing voltage data. |
21 | * XXX Missing 19.2MHz sys_clk rate sets. | ||
22 | * | 22 | * |
23 | * THe format described in this file is deprecated. Once a reasonable | 23 | * THe format described in this file is deprecated. Once a reasonable |
24 | * OPP API exists, the data in this file should be converted to use it. | 24 | * OPP API exists, the data in this file should be converted to use it. |
@@ -30,24 +30,24 @@ | |||
30 | #include "sdrc.h" | 30 | #include "sdrc.h" |
31 | #include "clock.h" | 31 | #include "clock.h" |
32 | 32 | ||
33 | /*------------------------------------------------------------------------- | 33 | /* |
34 | * Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated. | 34 | * Key dividers which make up a PRCM set. Ratios for a PRCM are mandated. |
35 | * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU, | 35 | * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU, |
36 | * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL, | 36 | * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL, |
37 | * CM_CLKSEL2_PLL, CM_CLKSEL_MDM | 37 | * CM_CLKSEL2_PLL, CM_CLKSEL_MDM |
38 | * | 38 | * |
39 | * Filling in table based on H4 boards and 2430-SDPs variants available. | 39 | * Filling in table based on 2430-SDPs variants available. There are |
40 | * There are quite a few more rates combinations which could be defined. | 40 | * quite a few more rate combinations which could be defined. |
41 | * | 41 | * |
42 | * When multiple values are defined the start up will try and choose the | 42 | * When multiple values are defined the start up will try and choose |
43 | * fastest one. If a 'fast' value is defined, then automatically, the /2 | 43 | * the fastest one. If a 'fast' value is defined, then automatically, |
44 | * one should be included as it can be used. Generally having more that | 44 | * the /2 one should be included as it can be used. Generally having |
45 | * one fast set does not make sense, as static timings need to be changed | 45 | * more than one fast set does not make sense, as static timings need |
46 | * to change the set. The exception is the bypass setting which is | 46 | * to be changed to change the set. The exception is the bypass |
47 | * availble for low power bypass. | 47 | * setting which is available for low power bypass. |
48 | * | 48 | * |
49 | * Note: This table needs to be sorted, fastest to slowest. | 49 | * Note: This table needs to be sorted, fastest to slowest. |
50 | *-------------------------------------------------------------------------*/ | 50 | */ |
51 | const struct prcm_config omap2430_rate_table[] = { | 51 | const struct prcm_config omap2430_rate_table[] = { |
52 | /* PRCM #4 - ratio2 (ES2.1) - FAST */ | 52 | /* PRCM #4 - ratio2 (ES2.1) - FAST */ |
53 | {S13M, S798M, S399M, R2_CM_CLKSEL_MPU_VAL, /* 399MHz ARM */ | 53 | {S13M, S798M, S399M, R2_CM_CLKSEL_MPU_VAL, /* 399MHz ARM */ |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 81ed252a0f8a..c6cc809afb79 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -124,8 +124,8 @@ static void omap3_core_save_context(void) | |||
124 | control_padconf_off |= START_PADCONF_SAVE; | 124 | control_padconf_off |= START_PADCONF_SAVE; |
125 | omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF); | 125 | omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF); |
126 | /* wait for the save to complete */ | 126 | /* wait for the save to complete */ |
127 | while (!omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS) | 127 | while (!(omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS) |
128 | & PADCONF_SAVE_DONE) | 128 | & PADCONF_SAVE_DONE)) |
129 | ; | 129 | ; |
130 | /* Save the Interrupt controller context */ | 130 | /* Save the Interrupt controller context */ |
131 | omap_intc_save_context(); | 131 | omap_intc_save_context(); |
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 19805a7de06c..8c964bec8159 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
@@ -125,6 +125,13 @@ static struct plat_serial8250_port serial_platform_data3[] = { | |||
125 | } | 125 | } |
126 | }; | 126 | }; |
127 | #endif | 127 | #endif |
128 | static inline unsigned int __serial_read_reg(struct uart_port *up, | ||
129 | int offset) | ||
130 | { | ||
131 | offset <<= up->regshift; | ||
132 | return (unsigned int)__raw_readb(up->membase + offset); | ||
133 | } | ||
134 | |||
128 | static inline unsigned int serial_read_reg(struct plat_serial8250_port *up, | 135 | static inline unsigned int serial_read_reg(struct plat_serial8250_port *up, |
129 | int offset) | 136 | int offset) |
130 | { | 137 | { |
@@ -583,11 +590,12 @@ static unsigned int serial_in_override(struct uart_port *up, int offset) | |||
583 | { | 590 | { |
584 | if (UART_RX == offset) { | 591 | if (UART_RX == offset) { |
585 | unsigned int lsr; | 592 | unsigned int lsr; |
586 | lsr = serial_read_reg(omap_uart[up->line].p, UART_LSR); | 593 | lsr = __serial_read_reg(up, UART_LSR); |
587 | if (!(lsr & UART_LSR_DR)) | 594 | if (!(lsr & UART_LSR_DR)) |
588 | return -EPERM; | 595 | return -EPERM; |
589 | } | 596 | } |
590 | return serial_read_reg(omap_uart[up->line].p, offset); | 597 | |
598 | return __serial_read_reg(up, offset); | ||
591 | } | 599 | } |
592 | 600 | ||
593 | void __init omap_serial_early_init(void) | 601 | void __init omap_serial_early_init(void) |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 52c40d155672..a04ffbbbe253 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -616,7 +616,7 @@ void __init mem_init(void) | |||
616 | "%dK data, %dK init, %luK highmem)\n", | 616 | "%dK data, %dK init, %luK highmem)\n", |
617 | nr_free_pages() << (PAGE_SHIFT-10), codesize >> 10, | 617 | nr_free_pages() << (PAGE_SHIFT-10), codesize >> 10, |
618 | datasize >> 10, initsize >> 10, | 618 | datasize >> 10, initsize >> 10, |
619 | (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))); | 619 | totalhigh_pages << (PAGE_SHIFT-10)); |
620 | 620 | ||
621 | if (PAGE_SIZE >= 16384 && num_physpages <= 128) { | 621 | if (PAGE_SIZE >= 16384 && num_physpages <= 128) { |
622 | extern int sysctl_overcommit_memory; | 622 | extern int sysctl_overcommit_memory; |
diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index 89cafc937249..d9f8c844c385 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c | |||
@@ -36,10 +36,6 @@ static struct clk_functions *arch_clock; | |||
36 | * Standard clock functions defined in include/linux/clk.h | 36 | * Standard clock functions defined in include/linux/clk.h |
37 | *-------------------------------------------------------------------------*/ | 37 | *-------------------------------------------------------------------------*/ |
38 | 38 | ||
39 | /* This functions is moved to arch/arm/common/clkdev.c. For OMAP4 since | ||
40 | * clock framework is not up , it is defined here to avoid rework in | ||
41 | * every driver. Also dummy prcm reset function is added */ | ||
42 | |||
43 | int clk_enable(struct clk *clk) | 39 | int clk_enable(struct clk *clk) |
44 | { | 40 | { |
45 | unsigned long flags; | 41 | unsigned long flags; |
@@ -305,7 +301,6 @@ void clk_enable_init_clocks(void) | |||
305 | clk_enable(clkp); | 301 | clk_enable(clkp); |
306 | } | 302 | } |
307 | } | 303 | } |
308 | EXPORT_SYMBOL(clk_enable_init_clocks); | ||
309 | 304 | ||
310 | /* | 305 | /* |
311 | * Low level helpers | 306 | * Low level helpers |
@@ -334,7 +329,16 @@ void clk_init_cpufreq_table(struct cpufreq_frequency_table **table) | |||
334 | arch_clock->clk_init_cpufreq_table(table); | 329 | arch_clock->clk_init_cpufreq_table(table); |
335 | spin_unlock_irqrestore(&clockfw_lock, flags); | 330 | spin_unlock_irqrestore(&clockfw_lock, flags); |
336 | } | 331 | } |
337 | EXPORT_SYMBOL(clk_init_cpufreq_table); | 332 | |
333 | void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table) | ||
334 | { | ||
335 | unsigned long flags; | ||
336 | |||
337 | spin_lock_irqsave(&clockfw_lock, flags); | ||
338 | if (arch_clock->clk_exit_cpufreq_table) | ||
339 | arch_clock->clk_exit_cpufreq_table(table); | ||
340 | spin_unlock_irqrestore(&clockfw_lock, flags); | ||
341 | } | ||
338 | #endif | 342 | #endif |
339 | 343 | ||
340 | /*-------------------------------------------------------------------------*/ | 344 | /*-------------------------------------------------------------------------*/ |
diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c index f8ddbdd8b076..6d3d33360056 100644 --- a/arch/arm/plat-omap/cpu-omap.c +++ b/arch/arm/plat-omap/cpu-omap.c | |||
@@ -134,6 +134,7 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy) | |||
134 | 134 | ||
135 | static int omap_cpu_exit(struct cpufreq_policy *policy) | 135 | static int omap_cpu_exit(struct cpufreq_policy *policy) |
136 | { | 136 | { |
137 | clk_exit_cpufreq_table(&freq_table); | ||
137 | clk_put(mpu_clk); | 138 | clk_put(mpu_clk); |
138 | return 0; | 139 | return 0; |
139 | } | 140 | } |
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index 04846811d0aa..d17620c50c28 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
@@ -192,6 +192,7 @@ struct gpio_bank { | |||
192 | u32 saved_risingdetect; | 192 | u32 saved_risingdetect; |
193 | #endif | 193 | #endif |
194 | u32 level_mask; | 194 | u32 level_mask; |
195 | u32 toggle_mask; | ||
195 | spinlock_t lock; | 196 | spinlock_t lock; |
196 | struct gpio_chip chip; | 197 | struct gpio_chip chip; |
197 | struct clk *dbck; | 198 | struct clk *dbck; |
@@ -749,6 +750,44 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | |||
749 | } | 750 | } |
750 | #endif | 751 | #endif |
751 | 752 | ||
753 | /* | ||
754 | * This only applies to chips that can't do both rising and falling edge | ||
755 | * detection at once. For all other chips, this function is a noop. | ||
756 | */ | ||
757 | static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) | ||
758 | { | ||
759 | void __iomem *reg = bank->base; | ||
760 | u32 l = 0; | ||
761 | |||
762 | switch (bank->method) { | ||
763 | #ifdef CONFIG_ARCH_OMAP1 | ||
764 | case METHOD_MPUIO: | ||
765 | reg += OMAP_MPUIO_GPIO_INT_EDGE; | ||
766 | break; | ||
767 | #endif | ||
768 | #ifdef CONFIG_ARCH_OMAP15XX | ||
769 | case METHOD_GPIO_1510: | ||
770 | reg += OMAP1510_GPIO_INT_CONTROL; | ||
771 | break; | ||
772 | #endif | ||
773 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
774 | case METHOD_GPIO_7XX: | ||
775 | reg += OMAP7XX_GPIO_INT_CONTROL; | ||
776 | break; | ||
777 | #endif | ||
778 | default: | ||
779 | return; | ||
780 | } | ||
781 | |||
782 | l = __raw_readl(reg); | ||
783 | if ((l >> gpio) & 1) | ||
784 | l &= ~(1 << gpio); | ||
785 | else | ||
786 | l |= 1 << gpio; | ||
787 | |||
788 | __raw_writel(l, reg); | ||
789 | } | ||
790 | |||
752 | static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) | 791 | static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) |
753 | { | 792 | { |
754 | void __iomem *reg = bank->base; | 793 | void __iomem *reg = bank->base; |
@@ -759,6 +798,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) | |||
759 | case METHOD_MPUIO: | 798 | case METHOD_MPUIO: |
760 | reg += OMAP_MPUIO_GPIO_INT_EDGE; | 799 | reg += OMAP_MPUIO_GPIO_INT_EDGE; |
761 | l = __raw_readl(reg); | 800 | l = __raw_readl(reg); |
801 | if (trigger & IRQ_TYPE_EDGE_BOTH) | ||
802 | bank->toggle_mask |= 1 << gpio; | ||
762 | if (trigger & IRQ_TYPE_EDGE_RISING) | 803 | if (trigger & IRQ_TYPE_EDGE_RISING) |
763 | l |= 1 << gpio; | 804 | l |= 1 << gpio; |
764 | else if (trigger & IRQ_TYPE_EDGE_FALLING) | 805 | else if (trigger & IRQ_TYPE_EDGE_FALLING) |
@@ -771,6 +812,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) | |||
771 | case METHOD_GPIO_1510: | 812 | case METHOD_GPIO_1510: |
772 | reg += OMAP1510_GPIO_INT_CONTROL; | 813 | reg += OMAP1510_GPIO_INT_CONTROL; |
773 | l = __raw_readl(reg); | 814 | l = __raw_readl(reg); |
815 | if (trigger & IRQ_TYPE_EDGE_BOTH) | ||
816 | bank->toggle_mask |= 1 << gpio; | ||
774 | if (trigger & IRQ_TYPE_EDGE_RISING) | 817 | if (trigger & IRQ_TYPE_EDGE_RISING) |
775 | l |= 1 << gpio; | 818 | l |= 1 << gpio; |
776 | else if (trigger & IRQ_TYPE_EDGE_FALLING) | 819 | else if (trigger & IRQ_TYPE_EDGE_FALLING) |
@@ -803,6 +846,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) | |||
803 | case METHOD_GPIO_7XX: | 846 | case METHOD_GPIO_7XX: |
804 | reg += OMAP7XX_GPIO_INT_CONTROL; | 847 | reg += OMAP7XX_GPIO_INT_CONTROL; |
805 | l = __raw_readl(reg); | 848 | l = __raw_readl(reg); |
849 | if (trigger & IRQ_TYPE_EDGE_BOTH) | ||
850 | bank->toggle_mask |= 1 << gpio; | ||
806 | if (trigger & IRQ_TYPE_EDGE_RISING) | 851 | if (trigger & IRQ_TYPE_EDGE_RISING) |
807 | l |= 1 << gpio; | 852 | l |= 1 << gpio; |
808 | else if (trigger & IRQ_TYPE_EDGE_FALLING) | 853 | else if (trigger & IRQ_TYPE_EDGE_FALLING) |
@@ -1072,7 +1117,7 @@ static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int ena | |||
1072 | */ | 1117 | */ |
1073 | static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) | 1118 | static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) |
1074 | { | 1119 | { |
1075 | unsigned long flags; | 1120 | unsigned long uninitialized_var(flags); |
1076 | 1121 | ||
1077 | switch (bank->method) { | 1122 | switch (bank->method) { |
1078 | #ifdef CONFIG_ARCH_OMAP16XX | 1123 | #ifdef CONFIG_ARCH_OMAP16XX |
@@ -1217,7 +1262,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
1217 | { | 1262 | { |
1218 | void __iomem *isr_reg = NULL; | 1263 | void __iomem *isr_reg = NULL; |
1219 | u32 isr; | 1264 | u32 isr; |
1220 | unsigned int gpio_irq; | 1265 | unsigned int gpio_irq, gpio_index; |
1221 | struct gpio_bank *bank; | 1266 | struct gpio_bank *bank; |
1222 | u32 retrigger = 0; | 1267 | u32 retrigger = 0; |
1223 | int unmasked = 0; | 1268 | int unmasked = 0; |
@@ -1284,9 +1329,23 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
1284 | 1329 | ||
1285 | gpio_irq = bank->virtual_irq_start; | 1330 | gpio_irq = bank->virtual_irq_start; |
1286 | for (; isr != 0; isr >>= 1, gpio_irq++) { | 1331 | for (; isr != 0; isr >>= 1, gpio_irq++) { |
1332 | gpio_index = get_gpio_index(irq_to_gpio(gpio_irq)); | ||
1333 | |||
1287 | if (!(isr & 1)) | 1334 | if (!(isr & 1)) |
1288 | continue; | 1335 | continue; |
1289 | 1336 | ||
1337 | #ifdef CONFIG_ARCH_OMAP1 | ||
1338 | /* | ||
1339 | * Some chips can't respond to both rising and falling | ||
1340 | * at the same time. If this irq was requested with | ||
1341 | * both flags, we need to flip the ICR data for the IRQ | ||
1342 | * to respond to the IRQ for the opposite direction. | ||
1343 | * This will be indicated in the bank toggle_mask. | ||
1344 | */ | ||
1345 | if (bank->toggle_mask & (1 << gpio_index)) | ||
1346 | _toggle_gpio_edge_triggering(bank, gpio_index); | ||
1347 | #endif | ||
1348 | |||
1290 | generic_handle_irq(gpio_irq); | 1349 | generic_handle_irq(gpio_irq); |
1291 | } | 1350 | } |
1292 | } | 1351 | } |
diff --git a/arch/arm/plat-omap/include/plat/board.h b/arch/arm/plat-omap/include/plat/board.h index 376ce18216ff..5cd622039da0 100644 --- a/arch/arm/plat-omap/include/plat/board.h +++ b/arch/arm/plat-omap/include/plat/board.h | |||
@@ -99,7 +99,6 @@ struct fb_info; | |||
99 | struct omap_backlight_config { | 99 | struct omap_backlight_config { |
100 | int default_intensity; | 100 | int default_intensity; |
101 | int (*set_power)(struct device *dev, int state); | 101 | int (*set_power)(struct device *dev, int state); |
102 | int (*check_fb)(struct fb_info *fb); | ||
103 | }; | 102 | }; |
104 | 103 | ||
105 | struct omap_fbmem_config { | 104 | struct omap_fbmem_config { |
diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h index 309b6d1dccdb..94fe2a0ce40a 100644 --- a/arch/arm/plat-omap/include/plat/clock.h +++ b/arch/arm/plat-omap/include/plat/clock.h | |||
@@ -119,6 +119,7 @@ struct clk_functions { | |||
119 | void (*clk_disable_unused)(struct clk *clk); | 119 | void (*clk_disable_unused)(struct clk *clk); |
120 | #ifdef CONFIG_CPU_FREQ | 120 | #ifdef CONFIG_CPU_FREQ |
121 | void (*clk_init_cpufreq_table)(struct cpufreq_frequency_table **); | 121 | void (*clk_init_cpufreq_table)(struct cpufreq_frequency_table **); |
122 | void (*clk_exit_cpufreq_table)(struct cpufreq_frequency_table **); | ||
122 | #endif | 123 | #endif |
123 | }; | 124 | }; |
124 | 125 | ||
@@ -135,6 +136,7 @@ extern unsigned long followparent_recalc(struct clk *clk); | |||
135 | extern void clk_enable_init_clocks(void); | 136 | extern void clk_enable_init_clocks(void); |
136 | #ifdef CONFIG_CPU_FREQ | 137 | #ifdef CONFIG_CPU_FREQ |
137 | extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table); | 138 | extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table); |
139 | extern void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table); | ||
138 | #endif | 140 | #endif |
139 | 141 | ||
140 | extern const struct clkops clkops_null; | 142 | extern const struct clkops clkops_null; |
diff --git a/arch/arm/plat-omap/include/plat/control.h b/arch/arm/plat-omap/include/plat/control.h index 2ae884378638..a745d62fad0d 100644 --- a/arch/arm/plat-omap/include/plat/control.h +++ b/arch/arm/plat-omap/include/plat/control.h | |||
@@ -147,7 +147,7 @@ | |||
147 | #define OMAP343X_CONTROL_IVA2_BOOTADDR (OMAP2_CONTROL_GENERAL + 0x0190) | 147 | #define OMAP343X_CONTROL_IVA2_BOOTADDR (OMAP2_CONTROL_GENERAL + 0x0190) |
148 | #define OMAP343X_CONTROL_IVA2_BOOTMOD (OMAP2_CONTROL_GENERAL + 0x0194) | 148 | #define OMAP343X_CONTROL_IVA2_BOOTMOD (OMAP2_CONTROL_GENERAL + 0x0194) |
149 | #define OMAP343X_CONTROL_DEBOBS(i) (OMAP2_CONTROL_GENERAL + 0x01B0 \ | 149 | #define OMAP343X_CONTROL_DEBOBS(i) (OMAP2_CONTROL_GENERAL + 0x01B0 \ |
150 | + ((i) >> 1) * 4 + (!(i) & 1) * 2) | 150 | + ((i) >> 1) * 4 + (!((i) & 1)) * 2) |
151 | #define OMAP343X_CONTROL_PROG_IO0 (OMAP2_CONTROL_GENERAL + 0x01D4) | 151 | #define OMAP343X_CONTROL_PROG_IO0 (OMAP2_CONTROL_GENERAL + 0x01D4) |
152 | #define OMAP343X_CONTROL_PROG_IO1 (OMAP2_CONTROL_GENERAL + 0x01D8) | 152 | #define OMAP343X_CONTROL_PROG_IO1 (OMAP2_CONTROL_GENERAL + 0x01D8) |
153 | #define OMAP343X_CONTROL_DSS_DPLL_SPREADING (OMAP2_CONTROL_GENERAL + 0x01E0) | 153 | #define OMAP343X_CONTROL_DSS_DPLL_SPREADING (OMAP2_CONTROL_GENERAL + 0x01E0) |
diff --git a/arch/arm/plat-omap/include/plat/io.h b/arch/arm/plat-omap/include/plat/io.h index 7e5319f907d1..a3e7b471bcba 100644 --- a/arch/arm/plat-omap/include/plat/io.h +++ b/arch/arm/plat-omap/include/plat/io.h | |||
@@ -122,16 +122,21 @@ | |||
122 | #define OMAP243X_SMS_VIRT (OMAP243X_SMS_PHYS + OMAP2_L3_IO_OFFSET) | 122 | #define OMAP243X_SMS_VIRT (OMAP243X_SMS_PHYS + OMAP2_L3_IO_OFFSET) |
123 | #define OMAP243X_SMS_SIZE SZ_1M | 123 | #define OMAP243X_SMS_SIZE SZ_1M |
124 | 124 | ||
125 | /* DSP */ | 125 | /* 2420 IVA */ |
126 | #define DSP_MEM_24XX_PHYS OMAP2420_DSP_MEM_BASE /* 0x58000000 */ | 126 | #define DSP_MEM_2420_PHYS OMAP2420_DSP_MEM_BASE |
127 | #define DSP_MEM_24XX_VIRT 0xe0000000 | 127 | /* 0x58000000 --> 0xfc100000 */ |
128 | #define DSP_MEM_24XX_SIZE 0x28000 | 128 | #define DSP_MEM_2420_VIRT 0xfc100000 |
129 | #define DSP_IPI_24XX_PHYS OMAP2420_DSP_IPI_BASE /* 0x59000000 */ | 129 | #define DSP_MEM_2420_SIZE 0x28000 |
130 | #define DSP_IPI_24XX_VIRT 0xe1000000 | 130 | #define DSP_IPI_2420_PHYS OMAP2420_DSP_IPI_BASE |
131 | #define DSP_IPI_24XX_SIZE SZ_4K | 131 | /* 0x59000000 --> 0xfc128000 */ |
132 | #define DSP_MMU_24XX_PHYS OMAP2420_DSP_MMU_BASE /* 0x5a000000 */ | 132 | #define DSP_IPI_2420_VIRT 0xfc128000 |
133 | #define DSP_MMU_24XX_VIRT 0xe2000000 | 133 | #define DSP_IPI_2420_SIZE SZ_4K |
134 | #define DSP_MMU_24XX_SIZE SZ_4K | 134 | #define DSP_MMU_2420_PHYS OMAP2420_DSP_MMU_BASE |
135 | /* 0x5a000000 --> 0xfc129000 */ | ||
136 | #define DSP_MMU_2420_VIRT 0xfc129000 | ||
137 | #define DSP_MMU_2420_SIZE SZ_4K | ||
138 | |||
139 | /* 2430 IVA2.1 - currently unmapped */ | ||
135 | 140 | ||
136 | /* | 141 | /* |
137 | * ---------------------------------------------------------------------------- | 142 | * ---------------------------------------------------------------------------- |
@@ -182,16 +187,7 @@ | |||
182 | #define OMAP343X_SDRC_VIRT (OMAP343X_SDRC_PHYS + OMAP2_L3_IO_OFFSET) | 187 | #define OMAP343X_SDRC_VIRT (OMAP343X_SDRC_PHYS + OMAP2_L3_IO_OFFSET) |
183 | #define OMAP343X_SDRC_SIZE SZ_1M | 188 | #define OMAP343X_SDRC_SIZE SZ_1M |
184 | 189 | ||
185 | /* DSP */ | 190 | /* 3430 IVA - currently unmapped */ |
186 | #define DSP_MEM_34XX_PHYS OMAP34XX_DSP_MEM_BASE /* 0x58000000 */ | ||
187 | #define DSP_MEM_34XX_VIRT 0xe0000000 | ||
188 | #define DSP_MEM_34XX_SIZE 0x28000 | ||
189 | #define DSP_IPI_34XX_PHYS OMAP34XX_DSP_IPI_BASE /* 0x59000000 */ | ||
190 | #define DSP_IPI_34XX_VIRT 0xe1000000 | ||
191 | #define DSP_IPI_34XX_SIZE SZ_4K | ||
192 | #define DSP_MMU_34XX_PHYS OMAP34XX_DSP_MMU_BASE /* 0x5a000000 */ | ||
193 | #define DSP_MMU_34XX_VIRT 0xe2000000 | ||
194 | #define DSP_MMU_34XX_SIZE SZ_4K | ||
195 | 191 | ||
196 | /* | 192 | /* |
197 | * ---------------------------------------------------------------------------- | 193 | * ---------------------------------------------------------------------------- |
diff --git a/arch/arm/plat-omap/include/plat/mux.h b/arch/arm/plat-omap/include/plat/mux.h index 8f069cc80350..692c90e89ac3 100644 --- a/arch/arm/plat-omap/include/plat/mux.h +++ b/arch/arm/plat-omap/include/plat/mux.h | |||
@@ -183,6 +183,14 @@ enum omap7xx_index { | |||
183 | /* I2C */ | 183 | /* I2C */ |
184 | I2C_7XX_SCL, | 184 | I2C_7XX_SCL, |
185 | I2C_7XX_SDA, | 185 | I2C_7XX_SDA, |
186 | |||
187 | /* SPI */ | ||
188 | SPI_7XX_1, | ||
189 | SPI_7XX_2, | ||
190 | SPI_7XX_3, | ||
191 | SPI_7XX_4, | ||
192 | SPI_7XX_5, | ||
193 | SPI_7XX_6, | ||
186 | }; | 194 | }; |
187 | 195 | ||
188 | enum omap1xxx_index { | 196 | enum omap1xxx_index { |
diff --git a/arch/arm/plat-omap/include/plat/omap7xx.h b/arch/arm/plat-omap/include/plat/omap7xx.h index 53f52414b0e9..48e4757e1e30 100644 --- a/arch/arm/plat-omap/include/plat/omap7xx.h +++ b/arch/arm/plat-omap/include/plat/omap7xx.h | |||
@@ -46,6 +46,9 @@ | |||
46 | #define OMAP7XX_DSPREG_SIZE SZ_128K | 46 | #define OMAP7XX_DSPREG_SIZE SZ_128K |
47 | #define OMAP7XX_DSPREG_START 0xE1000000 | 47 | #define OMAP7XX_DSPREG_START 0xE1000000 |
48 | 48 | ||
49 | #define OMAP7XX_SPI1_BASE 0xfffc0800 | ||
50 | #define OMAP7XX_SPI2_BASE 0xfffc1000 | ||
51 | |||
49 | /* | 52 | /* |
50 | * ---------------------------------------------------------------------------- | 53 | * ---------------------------------------------------------------------------- |
51 | * OMAP7XX specific configuration registers | 54 | * OMAP7XX specific configuration registers |
diff --git a/arch/arm/plat-omap/io.c b/arch/arm/plat-omap/io.c index 11f5d7961c73..0cfd54f519c4 100644 --- a/arch/arm/plat-omap/io.c +++ b/arch/arm/plat-omap/io.c | |||
@@ -66,12 +66,12 @@ void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type) | |||
66 | return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT); | 66 | return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT); |
67 | } | 67 | } |
68 | if (cpu_is_omap2420()) { | 68 | if (cpu_is_omap2420()) { |
69 | if (BETWEEN(p, DSP_MEM_24XX_PHYS, DSP_MEM_24XX_SIZE)) | 69 | if (BETWEEN(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_SIZE)) |
70 | return XLATE(p, DSP_MEM_24XX_PHYS, DSP_MEM_24XX_VIRT); | 70 | return XLATE(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_VIRT); |
71 | if (BETWEEN(p, DSP_IPI_24XX_PHYS, DSP_IPI_24XX_SIZE)) | 71 | if (BETWEEN(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE)) |
72 | return XLATE(p, DSP_IPI_24XX_PHYS, DSP_IPI_24XX_SIZE); | 72 | return XLATE(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE); |
73 | if (BETWEEN(p, DSP_MMU_24XX_PHYS, DSP_MMU_24XX_SIZE)) | 73 | if (BETWEEN(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_SIZE)) |
74 | return XLATE(p, DSP_MMU_24XX_PHYS, DSP_MMU_24XX_VIRT); | 74 | return XLATE(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_VIRT); |
75 | } | 75 | } |
76 | if (cpu_is_omap2430()) { | 76 | if (cpu_is_omap2430()) { |
77 | if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE)) | 77 | if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE)) |
diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c index c0ff1e39d893..463d6386aff2 100644 --- a/arch/arm/plat-omap/iommu.c +++ b/arch/arm/plat-omap/iommu.c | |||
@@ -827,7 +827,7 @@ EXPORT_SYMBOL_GPL(iommu_get); | |||
827 | **/ | 827 | **/ |
828 | void iommu_put(struct iommu *obj) | 828 | void iommu_put(struct iommu *obj) |
829 | { | 829 | { |
830 | if (!obj && IS_ERR(obj)) | 830 | if (!obj || IS_ERR(obj)) |
831 | return; | 831 | return; |
832 | 832 | ||
833 | mutex_lock(&obj->iommu_lock); | 833 | mutex_lock(&obj->iommu_lock); |
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index 2cc1cc328bac..f75767278fc3 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c | |||
@@ -436,7 +436,7 @@ int omap_mcbsp_request(unsigned int id) | |||
436 | dev_err(mcbsp->dev, "Unable to request TX IRQ %d " | 436 | dev_err(mcbsp->dev, "Unable to request TX IRQ %d " |
437 | "for McBSP%d\n", mcbsp->tx_irq, | 437 | "for McBSP%d\n", mcbsp->tx_irq, |
438 | mcbsp->id); | 438 | mcbsp->id); |
439 | return err; | 439 | goto error; |
440 | } | 440 | } |
441 | 441 | ||
442 | init_completion(&mcbsp->rx_irq_completion); | 442 | init_completion(&mcbsp->rx_irq_completion); |
@@ -446,12 +446,26 @@ int omap_mcbsp_request(unsigned int id) | |||
446 | dev_err(mcbsp->dev, "Unable to request RX IRQ %d " | 446 | dev_err(mcbsp->dev, "Unable to request RX IRQ %d " |
447 | "for McBSP%d\n", mcbsp->rx_irq, | 447 | "for McBSP%d\n", mcbsp->rx_irq, |
448 | mcbsp->id); | 448 | mcbsp->id); |
449 | free_irq(mcbsp->tx_irq, (void *)mcbsp); | 449 | goto tx_irq; |
450 | return err; | ||
451 | } | 450 | } |
452 | } | 451 | } |
453 | 452 | ||
454 | return 0; | 453 | return 0; |
454 | tx_irq: | ||
455 | free_irq(mcbsp->tx_irq, (void *)mcbsp); | ||
456 | error: | ||
457 | if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free) | ||
458 | mcbsp->pdata->ops->free(id); | ||
459 | |||
460 | /* Do procedure specific to omap34xx arch, if applicable */ | ||
461 | omap34xx_mcbsp_free(mcbsp); | ||
462 | |||
463 | clk_disable(mcbsp->fclk); | ||
464 | clk_disable(mcbsp->iclk); | ||
465 | |||
466 | mcbsp->free = 1; | ||
467 | |||
468 | return err; | ||
455 | } | 469 | } |
456 | EXPORT_SYMBOL(omap_mcbsp_request); | 470 | EXPORT_SYMBOL(omap_mcbsp_request); |
457 | 471 | ||
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c index 9e8d00389eef..1651942f7feb 100644 --- a/arch/mips/mm/init.c +++ b/arch/mips/mm/init.c | |||
@@ -424,7 +424,7 @@ void __init mem_init(void) | |||
424 | reservedpages << (PAGE_SHIFT-10), | 424 | reservedpages << (PAGE_SHIFT-10), |
425 | datasize >> 10, | 425 | datasize >> 10, |
426 | initsize >> 10, | 426 | initsize >> 10, |
427 | (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))); | 427 | totalhigh_pages << (PAGE_SHIFT-10)); |
428 | } | 428 | } |
429 | #endif /* !CONFIG_NEED_MULTIPLE_NODES */ | 429 | #endif /* !CONFIG_NEED_MULTIPLE_NODES */ |
430 | 430 | ||
diff --git a/arch/mips/sgi-ip27/ip27-memory.c b/arch/mips/sgi-ip27/ip27-memory.c index f61c164d1e67..bc1297109cc5 100644 --- a/arch/mips/sgi-ip27/ip27-memory.c +++ b/arch/mips/sgi-ip27/ip27-memory.c | |||
@@ -505,5 +505,5 @@ void __init mem_init(void) | |||
505 | (num_physpages - tmp) << (PAGE_SHIFT-10), | 505 | (num_physpages - tmp) << (PAGE_SHIFT-10), |
506 | datasize >> 10, | 506 | datasize >> 10, |
507 | initsize >> 10, | 507 | initsize >> 10, |
508 | (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))); | 508 | totalhigh_pages << (PAGE_SHIFT-10)); |
509 | } | 509 | } |
diff --git a/arch/mn10300/Makefile b/arch/mn10300/Makefile index dd0c8ff52a68..ac5c6bdb2f05 100644 --- a/arch/mn10300/Makefile +++ b/arch/mn10300/Makefile | |||
@@ -19,7 +19,7 @@ CCDIR := $(strip $(patsubst %/specs,%,$(CCSPECS))) | |||
19 | KBUILD_CPPFLAGS += -nostdinc -I$(CCDIR)/include | 19 | KBUILD_CPPFLAGS += -nostdinc -I$(CCDIR)/include |
20 | 20 | ||
21 | LDFLAGS := | 21 | LDFLAGS := |
22 | OBJCOPYFLAGS := -O binary -R .note -R .comment -S | 22 | OBJCOPYFLAGS := -O binary -R .note -R .comment -R .GCC-command-line -R .note.gnu.build-id -S |
23 | #LDFLAGS_vmlinux := -Map linkmap.txt | 23 | #LDFLAGS_vmlinux := -Map linkmap.txt |
24 | CHECKFLAGS += | 24 | CHECKFLAGS += |
25 | 25 | ||
diff --git a/arch/mn10300/configs/asb2303_defconfig b/arch/mn10300/configs/asb2303_defconfig index 3acce23708b0..441920d8ff58 100644 --- a/arch/mn10300/configs/asb2303_defconfig +++ b/arch/mn10300/configs/asb2303_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.30-rc2 | 3 | # Linux kernel version: 2.6.33-rc1 |
4 | # Sat Apr 18 11:13:22 2009 | 4 | # Tue Dec 22 19:26:25 2009 |
5 | # | 5 | # |
6 | CONFIG_MN10300=y | 6 | CONFIG_MN10300=y |
7 | CONFIG_AM33=y | 7 | CONFIG_AM33=y |
@@ -22,6 +22,7 @@ CONFIG_GENERIC_HARDIRQS=y | |||
22 | # CONFIG_HOTPLUG_CPU is not set | 22 | # CONFIG_HOTPLUG_CPU is not set |
23 | CONFIG_HZ=1000 | 23 | CONFIG_HZ=1000 |
24 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 24 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
25 | CONFIG_CONSTRUCTORS=y | ||
25 | 26 | ||
26 | # | 27 | # |
27 | # General setup | 28 | # General setup |
@@ -43,11 +44,10 @@ CONFIG_BSD_PROCESS_ACCT=y | |||
43 | # | 44 | # |
44 | # RCU Subsystem | 45 | # RCU Subsystem |
45 | # | 46 | # |
46 | CONFIG_CLASSIC_RCU=y | ||
47 | # CONFIG_TREE_RCU is not set | 47 | # CONFIG_TREE_RCU is not set |
48 | # CONFIG_PREEMPT_RCU is not set | 48 | # CONFIG_TREE_PREEMPT_RCU is not set |
49 | CONFIG_TINY_RCU=y | ||
49 | # CONFIG_TREE_RCU_TRACE is not set | 50 | # CONFIG_TREE_RCU_TRACE is not set |
50 | # CONFIG_PREEMPT_RCU_TRACE is not set | ||
51 | # CONFIG_IKCONFIG is not set | 51 | # CONFIG_IKCONFIG is not set |
52 | CONFIG_LOG_BUF_SHIFT=14 | 52 | CONFIG_LOG_BUF_SHIFT=14 |
53 | # CONFIG_GROUP_SCHED is not set | 53 | # CONFIG_GROUP_SCHED is not set |
@@ -62,7 +62,6 @@ CONFIG_ANON_INODES=y | |||
62 | CONFIG_EMBEDDED=y | 62 | CONFIG_EMBEDDED=y |
63 | CONFIG_SYSCTL_SYSCALL=y | 63 | CONFIG_SYSCTL_SYSCALL=y |
64 | # CONFIG_KALLSYMS is not set | 64 | # CONFIG_KALLSYMS is not set |
65 | CONFIG_STRIP_ASM_SYMS=y | ||
66 | # CONFIG_HOTPLUG is not set | 65 | # CONFIG_HOTPLUG is not set |
67 | CONFIG_PRINTK=y | 66 | CONFIG_PRINTK=y |
68 | CONFIG_BUG=y | 67 | CONFIG_BUG=y |
@@ -75,14 +74,22 @@ CONFIG_TIMERFD=y | |||
75 | CONFIG_EVENTFD=y | 74 | CONFIG_EVENTFD=y |
76 | CONFIG_SHMEM=y | 75 | CONFIG_SHMEM=y |
77 | CONFIG_AIO=y | 76 | CONFIG_AIO=y |
77 | |||
78 | # | ||
79 | # Kernel Performance Events And Counters | ||
80 | # | ||
78 | # CONFIG_VM_EVENT_COUNTERS is not set | 81 | # CONFIG_VM_EVENT_COUNTERS is not set |
79 | CONFIG_COMPAT_BRK=y | 82 | CONFIG_COMPAT_BRK=y |
80 | CONFIG_SLAB=y | 83 | CONFIG_SLAB=y |
81 | # CONFIG_SLUB is not set | 84 | # CONFIG_SLUB is not set |
82 | # CONFIG_SLOB is not set | 85 | # CONFIG_SLOB is not set |
83 | CONFIG_PROFILING=y | 86 | CONFIG_PROFILING=y |
84 | # CONFIG_MARKERS is not set | ||
85 | CONFIG_HAVE_OPROFILE=y | 87 | CONFIG_HAVE_OPROFILE=y |
88 | CONFIG_HAVE_ARCH_TRACEHOOK=y | ||
89 | |||
90 | # | ||
91 | # GCOV-based kernel profiling | ||
92 | # | ||
86 | # CONFIG_SLOW_WORK is not set | 93 | # CONFIG_SLOW_WORK is not set |
87 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 94 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
88 | CONFIG_SLABINFO=y | 95 | CONFIG_SLABINFO=y |
@@ -90,6 +97,35 @@ CONFIG_RT_MUTEXES=y | |||
90 | CONFIG_BASE_SMALL=0 | 97 | CONFIG_BASE_SMALL=0 |
91 | # CONFIG_MODULES is not set | 98 | # CONFIG_MODULES is not set |
92 | # CONFIG_BLOCK is not set | 99 | # CONFIG_BLOCK is not set |
100 | # CONFIG_INLINE_SPIN_TRYLOCK is not set | ||
101 | # CONFIG_INLINE_SPIN_TRYLOCK_BH is not set | ||
102 | # CONFIG_INLINE_SPIN_LOCK is not set | ||
103 | # CONFIG_INLINE_SPIN_LOCK_BH is not set | ||
104 | # CONFIG_INLINE_SPIN_LOCK_IRQ is not set | ||
105 | # CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set | ||
106 | # CONFIG_INLINE_SPIN_UNLOCK is not set | ||
107 | # CONFIG_INLINE_SPIN_UNLOCK_BH is not set | ||
108 | # CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set | ||
109 | # CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set | ||
110 | # CONFIG_INLINE_READ_TRYLOCK is not set | ||
111 | # CONFIG_INLINE_READ_LOCK is not set | ||
112 | # CONFIG_INLINE_READ_LOCK_BH is not set | ||
113 | # CONFIG_INLINE_READ_LOCK_IRQ is not set | ||
114 | # CONFIG_INLINE_READ_LOCK_IRQSAVE is not set | ||
115 | # CONFIG_INLINE_READ_UNLOCK is not set | ||
116 | # CONFIG_INLINE_READ_UNLOCK_BH is not set | ||
117 | # CONFIG_INLINE_READ_UNLOCK_IRQ is not set | ||
118 | # CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set | ||
119 | # CONFIG_INLINE_WRITE_TRYLOCK is not set | ||
120 | # CONFIG_INLINE_WRITE_LOCK is not set | ||
121 | # CONFIG_INLINE_WRITE_LOCK_BH is not set | ||
122 | # CONFIG_INLINE_WRITE_LOCK_IRQ is not set | ||
123 | # CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set | ||
124 | # CONFIG_INLINE_WRITE_UNLOCK is not set | ||
125 | # CONFIG_INLINE_WRITE_UNLOCK_BH is not set | ||
126 | # CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set | ||
127 | # CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set | ||
128 | # CONFIG_MUTEX_SPIN_ON_OWNER is not set | ||
93 | # CONFIG_FREEZER is not set | 129 | # CONFIG_FREEZER is not set |
94 | 130 | ||
95 | # | 131 | # |
@@ -145,9 +181,8 @@ CONFIG_SPLIT_PTLOCK_CPUS=4 | |||
145 | CONFIG_ZONE_DMA_FLAG=0 | 181 | CONFIG_ZONE_DMA_FLAG=0 |
146 | CONFIG_NR_QUICK=1 | 182 | CONFIG_NR_QUICK=1 |
147 | CONFIG_VIRT_TO_BUS=y | 183 | CONFIG_VIRT_TO_BUS=y |
148 | CONFIG_UNEVICTABLE_LRU=y | 184 | # CONFIG_KSM is not set |
149 | CONFIG_HAVE_MLOCK=y | 185 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 |
150 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | ||
151 | 186 | ||
152 | # | 187 | # |
153 | # Power management options | 188 | # Power management options |
@@ -202,6 +237,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
202 | # CONFIG_NETFILTER is not set | 237 | # CONFIG_NETFILTER is not set |
203 | # CONFIG_IP_DCCP is not set | 238 | # CONFIG_IP_DCCP is not set |
204 | # CONFIG_IP_SCTP is not set | 239 | # CONFIG_IP_SCTP is not set |
240 | # CONFIG_RDS is not set | ||
205 | # CONFIG_TIPC is not set | 241 | # CONFIG_TIPC is not set |
206 | # CONFIG_ATM is not set | 242 | # CONFIG_ATM is not set |
207 | # CONFIG_BRIDGE is not set | 243 | # CONFIG_BRIDGE is not set |
@@ -216,6 +252,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
216 | # CONFIG_ECONET is not set | 252 | # CONFIG_ECONET is not set |
217 | # CONFIG_WAN_ROUTER is not set | 253 | # CONFIG_WAN_ROUTER is not set |
218 | # CONFIG_PHONET is not set | 254 | # CONFIG_PHONET is not set |
255 | # CONFIG_IEEE802154 is not set | ||
219 | # CONFIG_NET_SCHED is not set | 256 | # CONFIG_NET_SCHED is not set |
220 | # CONFIG_DCB is not set | 257 | # CONFIG_DCB is not set |
221 | 258 | ||
@@ -341,7 +378,6 @@ CONFIG_MISC_DEVICES=y | |||
341 | # CONFIG_SCSI_DMA is not set | 378 | # CONFIG_SCSI_DMA is not set |
342 | # CONFIG_SCSI_NETLINK is not set | 379 | # CONFIG_SCSI_NETLINK is not set |
343 | CONFIG_NETDEVICES=y | 380 | CONFIG_NETDEVICES=y |
344 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
345 | # CONFIG_DUMMY is not set | 381 | # CONFIG_DUMMY is not set |
346 | # CONFIG_BONDING is not set | 382 | # CONFIG_BONDING is not set |
347 | # CONFIG_MACVLAN is not set | 383 | # CONFIG_MACVLAN is not set |
@@ -362,14 +398,11 @@ CONFIG_SMC91X=y | |||
362 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | 398 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set |
363 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | 399 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set |
364 | # CONFIG_B44 is not set | 400 | # CONFIG_B44 is not set |
401 | # CONFIG_KS8842 is not set | ||
402 | # CONFIG_KS8851_MLL is not set | ||
365 | # CONFIG_NETDEV_1000 is not set | 403 | # CONFIG_NETDEV_1000 is not set |
366 | # CONFIG_NETDEV_10000 is not set | 404 | # CONFIG_NETDEV_10000 is not set |
367 | 405 | # CONFIG_WLAN is not set | |
368 | # | ||
369 | # Wireless LAN | ||
370 | # | ||
371 | # CONFIG_WLAN_PRE80211 is not set | ||
372 | # CONFIG_WLAN_80211 is not set | ||
373 | 406 | ||
374 | # | 407 | # |
375 | # Enable WiMAX (Networking options) to see the WiMAX drivers | 408 | # Enable WiMAX (Networking options) to see the WiMAX drivers |
@@ -430,11 +463,15 @@ CONFIG_RTC=y | |||
430 | # CONFIG_TCG_TPM is not set | 463 | # CONFIG_TCG_TPM is not set |
431 | # CONFIG_I2C is not set | 464 | # CONFIG_I2C is not set |
432 | # CONFIG_SPI is not set | 465 | # CONFIG_SPI is not set |
466 | |||
467 | # | ||
468 | # PPS support | ||
469 | # | ||
470 | # CONFIG_PPS is not set | ||
433 | # CONFIG_W1 is not set | 471 | # CONFIG_W1 is not set |
434 | # CONFIG_POWER_SUPPLY is not set | 472 | # CONFIG_POWER_SUPPLY is not set |
435 | # CONFIG_HWMON is not set | 473 | # CONFIG_HWMON is not set |
436 | # CONFIG_THERMAL is not set | 474 | # CONFIG_THERMAL is not set |
437 | # CONFIG_THERMAL_HWMON is not set | ||
438 | # CONFIG_WATCHDOG is not set | 475 | # CONFIG_WATCHDOG is not set |
439 | CONFIG_SSB_POSSIBLE=y | 476 | CONFIG_SSB_POSSIBLE=y |
440 | 477 | ||
@@ -451,22 +488,7 @@ CONFIG_SSB_POSSIBLE=y | |||
451 | # CONFIG_HTC_PASIC3 is not set | 488 | # CONFIG_HTC_PASIC3 is not set |
452 | # CONFIG_MFD_TMIO is not set | 489 | # CONFIG_MFD_TMIO is not set |
453 | # CONFIG_REGULATOR is not set | 490 | # CONFIG_REGULATOR is not set |
454 | 491 | # CONFIG_MEDIA_SUPPORT is not set | |
455 | # | ||
456 | # Multimedia devices | ||
457 | # | ||
458 | |||
459 | # | ||
460 | # Multimedia core support | ||
461 | # | ||
462 | # CONFIG_VIDEO_DEV is not set | ||
463 | # CONFIG_DVB_CORE is not set | ||
464 | # CONFIG_VIDEO_MEDIA is not set | ||
465 | |||
466 | # | ||
467 | # Multimedia drivers | ||
468 | # | ||
469 | # CONFIG_DAB is not set | ||
470 | 492 | ||
471 | # | 493 | # |
472 | # Graphics support | 494 | # Graphics support |
@@ -490,11 +512,17 @@ CONFIG_SSB_POSSIBLE=y | |||
490 | # CONFIG_DMADEVICES is not set | 512 | # CONFIG_DMADEVICES is not set |
491 | # CONFIG_AUXDISPLAY is not set | 513 | # CONFIG_AUXDISPLAY is not set |
492 | # CONFIG_UIO is not set | 514 | # CONFIG_UIO is not set |
515 | |||
516 | # | ||
517 | # TI VLYNQ | ||
518 | # | ||
493 | # CONFIG_STAGING is not set | 519 | # CONFIG_STAGING is not set |
494 | 520 | ||
495 | # | 521 | # |
496 | # File systems | 522 | # File systems |
497 | # | 523 | # |
524 | CONFIG_FILE_LOCKING=y | ||
525 | CONFIG_FSNOTIFY=y | ||
498 | CONFIG_DNOTIFY=y | 526 | CONFIG_DNOTIFY=y |
499 | CONFIG_INOTIFY=y | 527 | CONFIG_INOTIFY=y |
500 | CONFIG_INOTIFY_USER=y | 528 | CONFIG_INOTIFY_USER=y |
@@ -539,6 +567,7 @@ CONFIG_NFS_V3=y | |||
539 | # CONFIG_NFS_V3_ACL is not set | 567 | # CONFIG_NFS_V3_ACL is not set |
540 | # CONFIG_NFS_V4 is not set | 568 | # CONFIG_NFS_V4 is not set |
541 | CONFIG_ROOT_NFS=y | 569 | CONFIG_ROOT_NFS=y |
570 | # CONFIG_NFSD is not set | ||
542 | CONFIG_LOCKD=y | 571 | CONFIG_LOCKD=y |
543 | CONFIG_LOCKD_V4=y | 572 | CONFIG_LOCKD_V4=y |
544 | CONFIG_NFS_COMMON=y | 573 | CONFIG_NFS_COMMON=y |
@@ -561,13 +590,13 @@ CONFIG_ENABLE_WARN_DEPRECATED=y | |||
561 | CONFIG_ENABLE_MUST_CHECK=y | 590 | CONFIG_ENABLE_MUST_CHECK=y |
562 | CONFIG_FRAME_WARN=1024 | 591 | CONFIG_FRAME_WARN=1024 |
563 | CONFIG_MAGIC_SYSRQ=y | 592 | CONFIG_MAGIC_SYSRQ=y |
593 | CONFIG_STRIP_ASM_SYMS=y | ||
564 | # CONFIG_UNUSED_SYMBOLS is not set | 594 | # CONFIG_UNUSED_SYMBOLS is not set |
565 | # CONFIG_DEBUG_FS is not set | 595 | # CONFIG_DEBUG_FS is not set |
566 | # CONFIG_HEADERS_CHECK is not set | 596 | # CONFIG_HEADERS_CHECK is not set |
567 | # CONFIG_DEBUG_KERNEL is not set | 597 | # CONFIG_DEBUG_KERNEL is not set |
568 | # CONFIG_DEBUG_BUGVERBOSE is not set | 598 | CONFIG_DEBUG_BUGVERBOSE=y |
569 | # CONFIG_DEBUG_MEMORY_INIT is not set | 599 | # CONFIG_DEBUG_MEMORY_INIT is not set |
570 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
571 | # CONFIG_SYSCTL_SYSCALL_CHECK is not set | 600 | # CONFIG_SYSCTL_SYSCALL_CHECK is not set |
572 | # CONFIG_SAMPLES is not set | 601 | # CONFIG_SAMPLES is not set |
573 | 602 | ||
@@ -577,7 +606,11 @@ CONFIG_MAGIC_SYSRQ=y | |||
577 | # CONFIG_KEYS is not set | 606 | # CONFIG_KEYS is not set |
578 | # CONFIG_SECURITY is not set | 607 | # CONFIG_SECURITY is not set |
579 | # CONFIG_SECURITYFS is not set | 608 | # CONFIG_SECURITYFS is not set |
580 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 609 | # CONFIG_DEFAULT_SECURITY_SELINUX is not set |
610 | # CONFIG_DEFAULT_SECURITY_SMACK is not set | ||
611 | # CONFIG_DEFAULT_SECURITY_TOMOYO is not set | ||
612 | CONFIG_DEFAULT_SECURITY_DAC=y | ||
613 | CONFIG_DEFAULT_SECURITY="" | ||
581 | # CONFIG_CRYPTO is not set | 614 | # CONFIG_CRYPTO is not set |
582 | # CONFIG_BINARY_PRINTF is not set | 615 | # CONFIG_BINARY_PRINTF is not set |
583 | 616 | ||
diff --git a/arch/mn10300/include/asm/bitops.h b/arch/mn10300/include/asm/bitops.h index 0b610f482abb..f49ac49e09ad 100644 --- a/arch/mn10300/include/asm/bitops.h +++ b/arch/mn10300/include/asm/bitops.h | |||
@@ -165,7 +165,7 @@ static inline __attribute__((const)) | |||
165 | unsigned long __ffs(unsigned long x) | 165 | unsigned long __ffs(unsigned long x) |
166 | { | 166 | { |
167 | int bit; | 167 | int bit; |
168 | asm("bsch %2,%0" : "=r"(bit) : "0"(0), "r"(x & -x)); | 168 | asm("bsch %2,%0" : "=r"(bit) : "0"(0), "r"(x & -x) : "cc"); |
169 | return bit; | 169 | return bit; |
170 | } | 170 | } |
171 | 171 | ||
@@ -177,7 +177,7 @@ static inline __attribute__((const)) | |||
177 | int __ilog2_u32(u32 n) | 177 | int __ilog2_u32(u32 n) |
178 | { | 178 | { |
179 | int bit; | 179 | int bit; |
180 | asm("bsch %2,%0" : "=r"(bit) : "0"(0), "r"(n)); | 180 | asm("bsch %2,%0" : "=r"(bit) : "0"(0), "r"(n) : "cc"); |
181 | return bit; | 181 | return bit; |
182 | } | 182 | } |
183 | 183 | ||
diff --git a/arch/mn10300/include/asm/div64.h b/arch/mn10300/include/asm/div64.h index 3a8329b3e869..34dcb8e68309 100644 --- a/arch/mn10300/include/asm/div64.h +++ b/arch/mn10300/include/asm/div64.h | |||
@@ -72,6 +72,7 @@ unsigned __muldiv64u(unsigned val, unsigned mult, unsigned div) | |||
72 | * MDR = MDR:val%div */ | 72 | * MDR = MDR:val%div */ |
73 | : "=r"(result) | 73 | : "=r"(result) |
74 | : "0"(val), "ir"(mult), "r"(div) | 74 | : "0"(val), "ir"(mult), "r"(div) |
75 | : "cc" | ||
75 | ); | 76 | ); |
76 | 77 | ||
77 | return result; | 78 | return result; |
@@ -92,6 +93,7 @@ signed __muldiv64s(signed val, signed mult, signed div) | |||
92 | * MDR = MDR:val%div */ | 93 | * MDR = MDR:val%div */ |
93 | : "=r"(result) | 94 | : "=r"(result) |
94 | : "0"(val), "ir"(mult), "r"(div) | 95 | : "0"(val), "ir"(mult), "r"(div) |
96 | : "cc" | ||
95 | ); | 97 | ); |
96 | 98 | ||
97 | return result; | 99 | return result; |
diff --git a/arch/mn10300/include/asm/system.h b/arch/mn10300/include/asm/system.h index 8214fb7e7fe4..3636c054dcd5 100644 --- a/arch/mn10300/include/asm/system.h +++ b/arch/mn10300/include/asm/system.h | |||
@@ -143,6 +143,7 @@ do { \ | |||
143 | " mov %0,epsw \n" \ | 143 | " mov %0,epsw \n" \ |
144 | : "=&d"(tmp) \ | 144 | : "=&d"(tmp) \ |
145 | : "i"(~EPSW_IM), "r"(__mn10300_irq_enabled_epsw) \ | 145 | : "i"(~EPSW_IM), "r"(__mn10300_irq_enabled_epsw) \ |
146 | : "cc" \ | ||
146 | ); \ | 147 | ); \ |
147 | } while (0) | 148 | } while (0) |
148 | 149 | ||
diff --git a/arch/mn10300/include/asm/tlbflush.h b/arch/mn10300/include/asm/tlbflush.h index e0239865abcb..1a7e29281c5d 100644 --- a/arch/mn10300/include/asm/tlbflush.h +++ b/arch/mn10300/include/asm/tlbflush.h | |||
@@ -22,7 +22,7 @@ do { \ | |||
22 | " mov %0,%1 \n" \ | 22 | " mov %0,%1 \n" \ |
23 | : "=d"(w) \ | 23 | : "=d"(w) \ |
24 | : "m"(MMUCTR), "i"(MMUCTR_IIV|MMUCTR_DIV) \ | 24 | : "m"(MMUCTR), "i"(MMUCTR_IIV|MMUCTR_DIV) \ |
25 | : "memory" \ | 25 | : "cc", "memory" \ |
26 | ); \ | 26 | ); \ |
27 | } while (0) | 27 | } while (0) |
28 | 28 | ||
diff --git a/arch/mn10300/include/asm/uaccess.h b/arch/mn10300/include/asm/uaccess.h index 167e10ff06d9..197a7af3dd8a 100644 --- a/arch/mn10300/include/asm/uaccess.h +++ b/arch/mn10300/include/asm/uaccess.h | |||
@@ -316,7 +316,7 @@ do { \ | |||
316 | " .previous\n" \ | 316 | " .previous\n" \ |
317 | : "=a"(__from), "=a"(__to), "=r"(size), "=&r"(w)\ | 317 | : "=a"(__from), "=a"(__to), "=r"(size), "=&r"(w)\ |
318 | : "0"(__from), "1"(__to), "2"(size) \ | 318 | : "0"(__from), "1"(__to), "2"(size) \ |
319 | : "memory"); \ | 319 | : "cc", "memory"); \ |
320 | } \ | 320 | } \ |
321 | } while (0) | 321 | } while (0) |
322 | 322 | ||
@@ -352,7 +352,7 @@ do { \ | |||
352 | " .previous\n" \ | 352 | " .previous\n" \ |
353 | : "=a"(__from), "=a"(__to), "=r"(size), "=&r"(w)\ | 353 | : "=a"(__from), "=a"(__to), "=r"(size), "=&r"(w)\ |
354 | : "0"(__from), "1"(__to), "2"(size) \ | 354 | : "0"(__from), "1"(__to), "2"(size) \ |
355 | : "memory"); \ | 355 | : "cc", "memory"); \ |
356 | } \ | 356 | } \ |
357 | } while (0) | 357 | } while (0) |
358 | 358 | ||
diff --git a/arch/mn10300/include/asm/unistd.h b/arch/mn10300/include/asm/unistd.h index 2a983931c11f..c05acb95c2a9 100644 --- a/arch/mn10300/include/asm/unistd.h +++ b/arch/mn10300/include/asm/unistd.h | |||
@@ -348,10 +348,11 @@ | |||
348 | #define __NR_pwritev 335 | 348 | #define __NR_pwritev 335 |
349 | #define __NR_rt_tgsigqueueinfo 336 | 349 | #define __NR_rt_tgsigqueueinfo 336 |
350 | #define __NR_perf_event_open 337 | 350 | #define __NR_perf_event_open 337 |
351 | #define __NR_recvmmsg 338 | ||
351 | 352 | ||
352 | #ifdef __KERNEL__ | 353 | #ifdef __KERNEL__ |
353 | 354 | ||
354 | #define NR_syscalls 338 | 355 | #define NR_syscalls 339 |
355 | 356 | ||
356 | /* | 357 | /* |
357 | * specify the deprecated syscalls we want to support on this arch | 358 | * specify the deprecated syscalls we want to support on this arch |
diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S index c9ee6c009d79..88e3e1c3cc21 100644 --- a/arch/mn10300/kernel/entry.S +++ b/arch/mn10300/kernel/entry.S | |||
@@ -724,6 +724,7 @@ ENTRY(sys_call_table) | |||
724 | .long sys_pwritev /* 335 */ | 724 | .long sys_pwritev /* 335 */ |
725 | .long sys_rt_tgsigqueueinfo | 725 | .long sys_rt_tgsigqueueinfo |
726 | .long sys_perf_event_open | 726 | .long sys_perf_event_open |
727 | .long sys_recvmmsg | ||
727 | 728 | ||
728 | 729 | ||
729 | nr_syscalls=(.-sys_call_table)/4 | 730 | nr_syscalls=(.-sys_call_table)/4 |
diff --git a/arch/mn10300/kernel/mn10300-serial.c b/arch/mn10300/kernel/mn10300-serial.c index 229b710fc5d5..ef34d5a0f8bd 100644 --- a/arch/mn10300/kernel/mn10300-serial.c +++ b/arch/mn10300/kernel/mn10300-serial.c | |||
@@ -380,7 +380,8 @@ static int mask_test_and_clear(volatile u8 *ptr, u8 mask) | |||
380 | u32 epsw; | 380 | u32 epsw; |
381 | asm volatile(" bclr %1,(%2) \n" | 381 | asm volatile(" bclr %1,(%2) \n" |
382 | " mov epsw,%0 \n" | 382 | " mov epsw,%0 \n" |
383 | : "=d"(epsw) : "d"(mask), "a"(ptr)); | 383 | : "=d"(epsw) : "d"(mask), "a"(ptr) |
384 | : "cc", "memory"); | ||
384 | return !(epsw & EPSW_FLAG_Z); | 385 | return !(epsw & EPSW_FLAG_Z); |
385 | } | 386 | } |
386 | 387 | ||
diff --git a/arch/mn10300/kernel/signal.c b/arch/mn10300/kernel/signal.c index a21f43bc68e2..717db14c2cc3 100644 --- a/arch/mn10300/kernel/signal.c +++ b/arch/mn10300/kernel/signal.c | |||
@@ -264,7 +264,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, | |||
264 | 264 | ||
265 | /* this is the X/Open sanctioned signal stack switching. */ | 265 | /* this is the X/Open sanctioned signal stack switching. */ |
266 | if (ka->sa.sa_flags & SA_ONSTACK) { | 266 | if (ka->sa.sa_flags & SA_ONSTACK) { |
267 | if (!on_sig_stack(sp)) | 267 | if (sas_ss_flags(sp) == 0) |
268 | sp = current->sas_ss_sp + current->sas_ss_size; | 268 | sp = current->sas_ss_sp + current->sas_ss_size; |
269 | } | 269 | } |
270 | 270 | ||
diff --git a/arch/mn10300/lib/checksum.c b/arch/mn10300/lib/checksum.c index 274f29ec33c1..b6580f5d89ee 100644 --- a/arch/mn10300/lib/checksum.c +++ b/arch/mn10300/lib/checksum.c | |||
@@ -22,6 +22,7 @@ static inline unsigned short from32to16(__wsum sum) | |||
22 | " addc 0xffff,%0 \n" | 22 | " addc 0xffff,%0 \n" |
23 | : "=r" (sum) | 23 | : "=r" (sum) |
24 | : "r" (sum << 16), "0" (sum & 0xffff0000) | 24 | : "r" (sum << 16), "0" (sum & 0xffff0000) |
25 | : "cc" | ||
25 | ); | 26 | ); |
26 | return sum >> 16; | 27 | return sum >> 16; |
27 | } | 28 | } |
diff --git a/arch/mn10300/lib/delay.c b/arch/mn10300/lib/delay.c index cce66bc0822d..fdf6f710f94e 100644 --- a/arch/mn10300/lib/delay.c +++ b/arch/mn10300/lib/delay.c | |||
@@ -28,7 +28,8 @@ void __delay(unsigned long loops) | |||
28 | "2: add -1,%0 \n" | 28 | "2: add -1,%0 \n" |
29 | " bne 2b \n" | 29 | " bne 2b \n" |
30 | : "=&d" (d0) | 30 | : "=&d" (d0) |
31 | : "0" (loops)); | 31 | : "0" (loops) |
32 | : "cc"); | ||
32 | } | 33 | } |
33 | EXPORT_SYMBOL(__delay); | 34 | EXPORT_SYMBOL(__delay); |
34 | 35 | ||
diff --git a/arch/mn10300/lib/usercopy.c b/arch/mn10300/lib/usercopy.c index a75b203059c1..7826e6c364e7 100644 --- a/arch/mn10300/lib/usercopy.c +++ b/arch/mn10300/lib/usercopy.c | |||
@@ -62,7 +62,7 @@ do { \ | |||
62 | " .previous" \ | 62 | " .previous" \ |
63 | :"=&r"(res), "=r"(count), "=&r"(w) \ | 63 | :"=&r"(res), "=r"(count), "=&r"(w) \ |
64 | :"i"(-EFAULT), "1"(count), "a"(src), "a"(dst) \ | 64 | :"i"(-EFAULT), "1"(count), "a"(src), "a"(dst) \ |
65 | :"memory"); \ | 65 | : "memory", "cc"); \ |
66 | } while (0) | 66 | } while (0) |
67 | 67 | ||
68 | long | 68 | long |
@@ -109,7 +109,7 @@ do { \ | |||
109 | ".previous\n" \ | 109 | ".previous\n" \ |
110 | : "+r"(size), "=&r"(w) \ | 110 | : "+r"(size), "=&r"(w) \ |
111 | : "a"(addr), "d"(0) \ | 111 | : "a"(addr), "d"(0) \ |
112 | : "memory"); \ | 112 | : "memory", "cc"); \ |
113 | } while (0) | 113 | } while (0) |
114 | 114 | ||
115 | unsigned long | 115 | unsigned long |
@@ -161,6 +161,6 @@ long strnlen_user(const char *s, long n) | |||
161 | ".previous\n" | 161 | ".previous\n" |
162 | :"=d"(res), "=&r"(w) | 162 | :"=d"(res), "=&r"(w) |
163 | :"0"(0), "a"(s), "r"(n) | 163 | :"0"(0), "a"(s), "r"(n) |
164 | :"memory"); | 164 | : "memory", "cc"); |
165 | return res; | 165 | return res; |
166 | } | 166 | } |
diff --git a/arch/mn10300/mm/dma-alloc.c b/arch/mn10300/mm/dma-alloc.c index f3649d8f50e3..ee82d624b3c6 100644 --- a/arch/mn10300/mm/dma-alloc.c +++ b/arch/mn10300/mm/dma-alloc.c | |||
@@ -16,12 +16,24 @@ | |||
16 | #include <linux/pci.h> | 16 | #include <linux/pci.h> |
17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
18 | 18 | ||
19 | static unsigned long pci_sram_allocated = 0xbc000000; | ||
20 | |||
19 | void *dma_alloc_coherent(struct device *dev, size_t size, | 21 | void *dma_alloc_coherent(struct device *dev, size_t size, |
20 | dma_addr_t *dma_handle, int gfp) | 22 | dma_addr_t *dma_handle, int gfp) |
21 | { | 23 | { |
22 | unsigned long addr; | 24 | unsigned long addr; |
23 | void *ret; | 25 | void *ret; |
24 | 26 | ||
27 | printk("dma_alloc_coherent(%s,%zu,,%x)\n", dev_name(dev), size, gfp); | ||
28 | |||
29 | if (0xbe000000 - pci_sram_allocated >= size) { | ||
30 | size = (size + 255) & ~255; | ||
31 | addr = pci_sram_allocated; | ||
32 | pci_sram_allocated += size; | ||
33 | ret = (void *) addr; | ||
34 | goto done; | ||
35 | } | ||
36 | |||
25 | /* ignore region specifiers */ | 37 | /* ignore region specifiers */ |
26 | gfp &= ~(__GFP_DMA | __GFP_HIGHMEM); | 38 | gfp &= ~(__GFP_DMA | __GFP_HIGHMEM); |
27 | 39 | ||
@@ -41,7 +53,9 @@ void *dma_alloc_coherent(struct device *dev, size_t size, | |||
41 | /* write back and evict all cache lines covering this region */ | 53 | /* write back and evict all cache lines covering this region */ |
42 | mn10300_dcache_flush_inv_range2(virt_to_phys((void *) addr), PAGE_SIZE); | 54 | mn10300_dcache_flush_inv_range2(virt_to_phys((void *) addr), PAGE_SIZE); |
43 | 55 | ||
56 | done: | ||
44 | *dma_handle = virt_to_bus((void *) addr); | 57 | *dma_handle = virt_to_bus((void *) addr); |
58 | printk("dma_alloc_coherent() = %p [%x]\n", ret, *dma_handle); | ||
45 | return ret; | 59 | return ret; |
46 | } | 60 | } |
47 | EXPORT_SYMBOL(dma_alloc_coherent); | 61 | EXPORT_SYMBOL(dma_alloc_coherent); |
@@ -51,6 +65,9 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr, | |||
51 | { | 65 | { |
52 | unsigned long addr = (unsigned long) vaddr & ~0x20000000; | 66 | unsigned long addr = (unsigned long) vaddr & ~0x20000000; |
53 | 67 | ||
68 | if (addr >= 0x9c000000) | ||
69 | return; | ||
70 | |||
54 | free_pages(addr, get_order(size)); | 71 | free_pages(addr, get_order(size)); |
55 | } | 72 | } |
56 | EXPORT_SYMBOL(dma_free_coherent); | 73 | EXPORT_SYMBOL(dma_free_coherent); |
diff --git a/arch/mn10300/mm/init.c b/arch/mn10300/mm/init.c index ec1420562dc7..dd27a9a35152 100644 --- a/arch/mn10300/mm/init.c +++ b/arch/mn10300/mm/init.c | |||
@@ -118,8 +118,7 @@ void __init mem_init(void) | |||
118 | reservedpages << (PAGE_SHIFT - 10), | 118 | reservedpages << (PAGE_SHIFT - 10), |
119 | datasize >> 10, | 119 | datasize >> 10, |
120 | initsize >> 10, | 120 | initsize >> 10, |
121 | (unsigned long) (totalhigh_pages << (PAGE_SHIFT - 10)) | 121 | totalhigh_pages << (PAGE_SHIFT - 10)); |
122 | ); | ||
123 | } | 122 | } |
124 | 123 | ||
125 | /* | 124 | /* |
diff --git a/arch/mn10300/mm/misalignment.c b/arch/mn10300/mm/misalignment.c index 30016251f658..6dffbf97ac26 100644 --- a/arch/mn10300/mm/misalignment.c +++ b/arch/mn10300/mm/misalignment.c | |||
@@ -633,13 +633,13 @@ static int misalignment_addr(unsigned long *registers, unsigned long sp, | |||
633 | goto displace_or_inc; | 633 | goto displace_or_inc; |
634 | case SD24: | 634 | case SD24: |
635 | tmp = disp << 8; | 635 | tmp = disp << 8; |
636 | asm("asr 8,%0" : "=r"(tmp) : "0"(tmp)); | 636 | asm("asr 8,%0" : "=r"(tmp) : "0"(tmp) : "cc"); |
637 | disp = (long) tmp; | 637 | disp = (long) tmp; |
638 | goto displace_or_inc; | 638 | goto displace_or_inc; |
639 | case SIMM4_2: | 639 | case SIMM4_2: |
640 | tmp = opcode >> 4 & 0x0f; | 640 | tmp = opcode >> 4 & 0x0f; |
641 | tmp <<= 28; | 641 | tmp <<= 28; |
642 | asm("asr 28,%0" : "=r"(tmp) : "0"(tmp)); | 642 | asm("asr 28,%0" : "=r"(tmp) : "0"(tmp) : "cc"); |
643 | disp = (long) tmp; | 643 | disp = (long) tmp; |
644 | goto displace_or_inc; | 644 | goto displace_or_inc; |
645 | case IMM8: | 645 | case IMM8: |
diff --git a/arch/mn10300/unit-asb2305/include/unit/serial.h b/arch/mn10300/unit-asb2305/include/unit/serial.h index 3bfc90938787..8086cc092cec 100644 --- a/arch/mn10300/unit-asb2305/include/unit/serial.h +++ b/arch/mn10300/unit-asb2305/include/unit/serial.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #ifndef _ASM_UNIT_SERIAL_H | 11 | #ifndef _ASM_UNIT_SERIAL_H |
12 | #define _ASM_UNIT_SERIAL_H | 12 | #define _ASM_UNIT_SERIAL_H |
13 | 13 | ||
14 | #include <asm/cpu/cpu-regs.h> | 14 | #include <asm/cpu-regs.h> |
15 | #include <proc/irq.h> | 15 | #include <proc/irq.h> |
16 | #include <linux/serial_reg.h> | 16 | #include <linux/serial_reg.h> |
17 | 17 | ||
diff --git a/arch/mn10300/unit-asb2305/include/unit/timex.h b/arch/mn10300/unit-asb2305/include/unit/timex.h index a71c49aa85eb..d1c72d59fa9f 100644 --- a/arch/mn10300/unit-asb2305/include/unit/timex.h +++ b/arch/mn10300/unit-asb2305/include/unit/timex.h | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/irq.h> | 15 | #include <linux/irq.h> |
16 | #endif /* __ASSEMBLY__ */ | 16 | #endif /* __ASSEMBLY__ */ |
17 | 17 | ||
18 | #include <asm/cpu/timer-regs.h> | 18 | #include <asm/timer-regs.h> |
19 | #include <unit/clock.h> | 19 | #include <unit/clock.h> |
20 | 20 | ||
21 | /* | 21 | /* |
diff --git a/arch/mn10300/unit-asb2305/leds.c b/arch/mn10300/unit-asb2305/leds.c index d345ff9042d5..6f8de9954026 100644 --- a/arch/mn10300/unit-asb2305/leds.c +++ b/arch/mn10300/unit-asb2305/leds.c | |||
@@ -13,8 +13,8 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <asm/io.h> | 14 | #include <asm/io.h> |
15 | #include <asm/processor.h> | 15 | #include <asm/processor.h> |
16 | #include <asm/cpu/intctl-regs.h> | 16 | #include <asm/intctl-regs.h> |
17 | #include <asm/cpu/rtc-regs.h> | 17 | #include <asm/rtc-regs.h> |
18 | #include <unit/leds.h> | 18 | #include <unit/leds.h> |
19 | 19 | ||
20 | static const u8 asb2305_led_hex_tbl[16] = { | 20 | static const u8 asb2305_led_hex_tbl[16] = { |
diff --git a/arch/mn10300/unit-asb2305/pci-asb2305.c b/arch/mn10300/unit-asb2305/pci-asb2305.c index d100ca788468..78cd134ddf7d 100644 --- a/arch/mn10300/unit-asb2305/pci-asb2305.c +++ b/arch/mn10300/unit-asb2305/pci-asb2305.c | |||
@@ -218,45 +218,6 @@ void __init pcibios_resource_survey(void) | |||
218 | pcibios_allocate_resources(1); | 218 | pcibios_allocate_resources(1); |
219 | } | 219 | } |
220 | 220 | ||
221 | int pcibios_enable_resources(struct pci_dev *dev, int mask) | ||
222 | { | ||
223 | u16 cmd, old_cmd; | ||
224 | int idx; | ||
225 | struct resource *r; | ||
226 | |||
227 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||
228 | old_cmd = cmd; | ||
229 | |||
230 | for (idx = 0; idx < 6; idx++) { | ||
231 | /* Only set up the requested stuff */ | ||
232 | if (!(mask & (1 << idx))) | ||
233 | continue; | ||
234 | |||
235 | r = &dev->resource[idx]; | ||
236 | |||
237 | if (!r->start && r->end) { | ||
238 | printk(KERN_ERR | ||
239 | "PCI: Device %s not available because of" | ||
240 | " resource collisions\n", | ||
241 | pci_name(dev)); | ||
242 | return -EINVAL; | ||
243 | } | ||
244 | |||
245 | if (r->flags & IORESOURCE_IO) | ||
246 | cmd |= PCI_COMMAND_IO; | ||
247 | if (r->flags & IORESOURCE_MEM) | ||
248 | cmd |= PCI_COMMAND_MEMORY; | ||
249 | } | ||
250 | |||
251 | if (dev->resource[PCI_ROM_RESOURCE].start) | ||
252 | cmd |= PCI_COMMAND_MEMORY; | ||
253 | |||
254 | if (cmd != old_cmd) | ||
255 | pci_write_config_word(dev, PCI_COMMAND, cmd); | ||
256 | |||
257 | return 0; | ||
258 | } | ||
259 | |||
260 | /* | 221 | /* |
261 | * If we set up a device for bus mastering, we need to check the latency | 222 | * If we set up a device for bus mastering, we need to check the latency |
262 | * timer as certain crappy BIOSes forget to set it properly. | 223 | * timer as certain crappy BIOSes forget to set it properly. |
diff --git a/arch/mn10300/unit-asb2305/pci-asb2305.h b/arch/mn10300/unit-asb2305/pci-asb2305.h index 9763d1ce343a..c3fa294b6e28 100644 --- a/arch/mn10300/unit-asb2305/pci-asb2305.h +++ b/arch/mn10300/unit-asb2305/pci-asb2305.h | |||
@@ -34,7 +34,6 @@ extern unsigned int pci_probe; | |||
34 | extern unsigned int pcibios_max_latency; | 34 | extern unsigned int pcibios_max_latency; |
35 | 35 | ||
36 | extern void pcibios_resource_survey(void); | 36 | extern void pcibios_resource_survey(void); |
37 | extern int pcibios_enable_resources(struct pci_dev *dev, int mask); | ||
38 | 37 | ||
39 | /* pci.c */ | 38 | /* pci.c */ |
40 | 39 | ||
diff --git a/arch/mn10300/unit-asb2305/pci.c b/arch/mn10300/unit-asb2305/pci.c index 07dbbcda3b2e..2cb7e75ba1c0 100644 --- a/arch/mn10300/unit-asb2305/pci.c +++ b/arch/mn10300/unit-asb2305/pci.c | |||
@@ -27,6 +27,29 @@ struct pci_bus *pci_root_bus; | |||
27 | struct pci_ops *pci_root_ops; | 27 | struct pci_ops *pci_root_ops; |
28 | 28 | ||
29 | /* | 29 | /* |
30 | * The accessible PCI window does not cover the entire CPU address space, but | ||
31 | * there are devices we want to access outside of that window, so we need to | ||
32 | * insert specific PCI bus resources instead of using the platform-level bus | ||
33 | * resources directly for the PCI root bus. | ||
34 | * | ||
35 | * These are configured and inserted by pcibios_init() and are attached to the | ||
36 | * root bus by pcibios_fixup_bus(). | ||
37 | */ | ||
38 | static struct resource pci_ioport_resource = { | ||
39 | .name = "PCI IO", | ||
40 | .start = 0xbe000000, | ||
41 | .end = 0xbe03ffff, | ||
42 | .flags = IORESOURCE_IO, | ||
43 | }; | ||
44 | |||
45 | static struct resource pci_iomem_resource = { | ||
46 | .name = "PCI mem", | ||
47 | .start = 0xb8000000, | ||
48 | .end = 0xbbffffff, | ||
49 | .flags = IORESOURCE_MEM, | ||
50 | }; | ||
51 | |||
52 | /* | ||
30 | * Functions for accessing PCI configuration space | 53 | * Functions for accessing PCI configuration space |
31 | */ | 54 | */ |
32 | 55 | ||
@@ -279,7 +302,7 @@ static int __init pci_sanity_check(struct pci_ops *o) | |||
279 | (x == PCI_VENDOR_ID_INTEL || x == PCI_VENDOR_ID_COMPAQ))) | 302 | (x == PCI_VENDOR_ID_INTEL || x == PCI_VENDOR_ID_COMPAQ))) |
280 | return 1; | 303 | return 1; |
281 | 304 | ||
282 | printk(KERN_ERROR "PCI: Sanity check failed\n"); | 305 | printk(KERN_ERR "PCI: Sanity check failed\n"); |
283 | return 0; | 306 | return 0; |
284 | } | 307 | } |
285 | 308 | ||
@@ -297,6 +320,7 @@ static int __init pci_check_direct(void) | |||
297 | printk(KERN_INFO "PCI: Using configuration ampci\n"); | 320 | printk(KERN_INFO "PCI: Using configuration ampci\n"); |
298 | request_mem_region(0xBE040000, 256, "AMPCI bridge"); | 321 | request_mem_region(0xBE040000, 256, "AMPCI bridge"); |
299 | request_mem_region(0xBFFFFFF4, 12, "PCI ampci"); | 322 | request_mem_region(0xBFFFFFF4, 12, "PCI ampci"); |
323 | request_mem_region(0xBC000000, 32 * 1024 * 1024, "PCI SRAM"); | ||
300 | return 0; | 324 | return 0; |
301 | } | 325 | } |
302 | 326 | ||
@@ -358,6 +382,11 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus) | |||
358 | { | 382 | { |
359 | struct pci_dev *dev; | 383 | struct pci_dev *dev; |
360 | 384 | ||
385 | if (bus->number == 0) { | ||
386 | bus->resource[0] = &pci_ioport_resource; | ||
387 | bus->resource[1] = &pci_iomem_resource; | ||
388 | } | ||
389 | |||
361 | if (bus->self) { | 390 | if (bus->self) { |
362 | pci_read_bridge_bases(bus); | 391 | pci_read_bridge_bases(bus); |
363 | pcibios_fixup_device_resources(bus->self); | 392 | pcibios_fixup_device_resources(bus->self); |
@@ -380,6 +409,11 @@ static int __init pcibios_init(void) | |||
380 | iomem_resource.start = 0xA0000000; | 409 | iomem_resource.start = 0xA0000000; |
381 | iomem_resource.end = 0xDFFFFFFF; | 410 | iomem_resource.end = 0xDFFFFFFF; |
382 | 411 | ||
412 | if (insert_resource(&iomem_resource, &pci_iomem_resource) < 0) | ||
413 | panic("Unable to insert PCI IOMEM resource\n"); | ||
414 | if (insert_resource(&ioport_resource, &pci_ioport_resource) < 0) | ||
415 | panic("Unable to insert PCI IOPORT resource\n"); | ||
416 | |||
383 | if (!pci_probe) | 417 | if (!pci_probe) |
384 | return 0; | 418 | return 0; |
385 | 419 | ||
@@ -391,32 +425,11 @@ static int __init pcibios_init(void) | |||
391 | printk(KERN_INFO "PCI: Probing PCI hardware [mempage %08x]\n", | 425 | printk(KERN_INFO "PCI: Probing PCI hardware [mempage %08x]\n", |
392 | MEM_PAGING_REG); | 426 | MEM_PAGING_REG); |
393 | 427 | ||
394 | { | 428 | pci_root_bus = pci_scan_bus(0, &pci_direct_ampci, NULL); |
395 | #if 0 | ||
396 | static struct pci_bus am33_root_bus = { | ||
397 | .children = LIST_HEAD_INIT(am33_root_bus.children), | ||
398 | .devices = LIST_HEAD_INIT(am33_root_bus.devices), | ||
399 | .number = 0, | ||
400 | .secondary = 0, | ||
401 | .resource = { &ioport_resource, &iomem_resource }, | ||
402 | }; | ||
403 | |||
404 | am33_root_bus.ops = pci_root_ops; | ||
405 | list_add_tail(&am33_root_bus.node, &pci_root_buses); | ||
406 | |||
407 | am33_root_bus.subordinate = pci_do_scan_bus(0); | ||
408 | |||
409 | pci_root_bus = &am33_root_bus; | ||
410 | #else | ||
411 | pci_root_bus = pci_scan_bus(0, &pci_direct_ampci, NULL); | ||
412 | #endif | ||
413 | } | ||
414 | 429 | ||
415 | pcibios_irq_init(); | 430 | pcibios_irq_init(); |
416 | pcibios_fixup_irqs(); | 431 | pcibios_fixup_irqs(); |
417 | #if 0 | ||
418 | pcibios_resource_survey(); | 432 | pcibios_resource_survey(); |
419 | #endif | ||
420 | return 0; | 433 | return 0; |
421 | } | 434 | } |
422 | 435 | ||
@@ -440,7 +453,7 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) | |||
440 | { | 453 | { |
441 | int err; | 454 | int err; |
442 | 455 | ||
443 | err = pcibios_enable_resources(dev, mask); | 456 | err = pci_enable_resources(dev, mask); |
444 | if (err == 0) | 457 | if (err == 0) |
445 | pcibios_enable_irq(dev); | 458 | pcibios_enable_irq(dev); |
446 | return err; | 459 | return err; |
@@ -455,6 +468,7 @@ static void __init unit_disable_pcnet(struct pci_bus *bus, struct pci_ops *o) | |||
455 | 468 | ||
456 | bus->number = 0; | 469 | bus->number = 0; |
457 | 470 | ||
471 | o->read (bus, PCI_DEVFN(2, 0), PCI_VENDOR_ID, 4, &x); | ||
458 | o->read (bus, PCI_DEVFN(2, 0), PCI_COMMAND, 2, &x); | 472 | o->read (bus, PCI_DEVFN(2, 0), PCI_COMMAND, 2, &x); |
459 | x |= PCI_COMMAND_MASTER | | 473 | x |= PCI_COMMAND_MASTER | |
460 | PCI_COMMAND_IO | PCI_COMMAND_MEMORY | | 474 | PCI_COMMAND_IO | PCI_COMMAND_MEMORY | |
diff --git a/arch/mn10300/unit-asb2305/unit-init.c b/arch/mn10300/unit-asb2305/unit-init.c index 1c452cc3f6e9..a76c8e0ab90f 100644 --- a/arch/mn10300/unit-asb2305/unit-init.c +++ b/arch/mn10300/unit-asb2305/unit-init.c | |||
@@ -15,9 +15,8 @@ | |||
15 | #include <asm/io.h> | 15 | #include <asm/io.h> |
16 | #include <asm/setup.h> | 16 | #include <asm/setup.h> |
17 | #include <asm/processor.h> | 17 | #include <asm/processor.h> |
18 | #include <asm/cpu/intctl-regs.h> | 18 | #include <asm/intctl-regs.h> |
19 | #include <asm/cpu/rtc-regs.h> | 19 | #include <asm/serial-regs.h> |
20 | #include <asm/cpu/serial-regs.h> | ||
21 | #include <unit/serial.h> | 20 | #include <unit/serial.h> |
22 | 21 | ||
23 | /* | 22 | /* |
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index bb2465bcb327..826a30a00f59 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
@@ -20,7 +20,7 @@ | |||
20 | all: $(obj)/zImage | 20 | all: $(obj)/zImage |
21 | 21 | ||
22 | BOOTCFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ | 22 | BOOTCFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ |
23 | -fno-strict-aliasing -Os -msoft-float -pipe \ | 23 | -fno-strict-aliasing -Os -msoft-float -pipe -D__KERNEL__\ |
24 | -fomit-frame-pointer -fno-builtin -fPIC -nostdinc \ | 24 | -fomit-frame-pointer -fno-builtin -fPIC -nostdinc \ |
25 | -isystem $(shell $(CROSS32CC) -print-file-name=include) | 25 | -isystem $(shell $(CROSS32CC) -print-file-name=include) |
26 | BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc | 26 | BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc |
@@ -34,6 +34,8 @@ BOOTCFLAGS += -fno-stack-protector | |||
34 | endif | 34 | endif |
35 | 35 | ||
36 | BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj) | 36 | BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj) |
37 | BOOTCFLAGS += -include include/linux/autoconf.h -Iarch/powerpc/include | ||
38 | BOOTCFLAGS += -Iinclude | ||
37 | 39 | ||
38 | DTS_FLAGS ?= -p 1024 | 40 | DTS_FLAGS ?= -p 1024 |
39 | 41 | ||
diff --git a/arch/score/mm/init.c b/arch/score/mm/init.c index 8c15b2c85d5a..dfaf458d6702 100644 --- a/arch/score/mm/init.c +++ b/arch/score/mm/init.c | |||
@@ -106,7 +106,7 @@ void __init mem_init(void) | |||
106 | ram << (PAGE_SHIFT-10), codesize >> 10, | 106 | ram << (PAGE_SHIFT-10), codesize >> 10, |
107 | reservedpages << (PAGE_SHIFT-10), datasize >> 10, | 107 | reservedpages << (PAGE_SHIFT-10), datasize >> 10, |
108 | initsize >> 10, | 108 | initsize >> 10, |
109 | (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))); | 109 | totalhigh_pages << (PAGE_SHIFT-10)); |
110 | } | 110 | } |
111 | #endif /* !CONFIG_NEED_MULTIPLE_NODES */ | 111 | #endif /* !CONFIG_NEED_MULTIPLE_NODES */ |
112 | 112 | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 55298e891571..cbcbfdee3ee0 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -49,6 +49,7 @@ config X86 | |||
49 | select HAVE_KERNEL_GZIP | 49 | select HAVE_KERNEL_GZIP |
50 | select HAVE_KERNEL_BZIP2 | 50 | select HAVE_KERNEL_BZIP2 |
51 | select HAVE_KERNEL_LZMA | 51 | select HAVE_KERNEL_LZMA |
52 | select HAVE_KERNEL_LZO | ||
52 | select HAVE_HW_BREAKPOINT | 53 | select HAVE_HW_BREAKPOINT |
53 | select PERF_EVENTS | 54 | select PERF_EVENTS |
54 | select ANON_INODES | 55 | select ANON_INODES |
@@ -1246,6 +1247,11 @@ config ARCH_MEMORY_PROBE | |||
1246 | def_bool X86_64 | 1247 | def_bool X86_64 |
1247 | depends on MEMORY_HOTPLUG | 1248 | depends on MEMORY_HOTPLUG |
1248 | 1249 | ||
1250 | config ILLEGAL_POINTER_VALUE | ||
1251 | hex | ||
1252 | default 0 if X86_32 | ||
1253 | default 0xdead000000000000 if X86_64 | ||
1254 | |||
1249 | source "mm/Kconfig" | 1255 | source "mm/Kconfig" |
1250 | 1256 | ||
1251 | config HIGHPTE | 1257 | config HIGHPTE |
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index f25bbd37765a..fbb47daf2459 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | # create a compressed vmlinux image from the original vmlinux | 4 | # create a compressed vmlinux image from the original vmlinux |
5 | # | 5 | # |
6 | 6 | ||
7 | targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma head_$(BITS).o misc.o piggy.o | 7 | targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma vmlinux.bin.lzo head_$(BITS).o misc.o piggy.o |
8 | 8 | ||
9 | KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 | 9 | KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 |
10 | KBUILD_CFLAGS += -fno-strict-aliasing -fPIC | 10 | KBUILD_CFLAGS += -fno-strict-aliasing -fPIC |
@@ -49,10 +49,13 @@ $(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y) FORCE | |||
49 | $(call if_changed,bzip2) | 49 | $(call if_changed,bzip2) |
50 | $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE | 50 | $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE |
51 | $(call if_changed,lzma) | 51 | $(call if_changed,lzma) |
52 | $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE | ||
53 | $(call if_changed,lzo) | ||
52 | 54 | ||
53 | suffix-$(CONFIG_KERNEL_GZIP) := gz | 55 | suffix-$(CONFIG_KERNEL_GZIP) := gz |
54 | suffix-$(CONFIG_KERNEL_BZIP2) := bz2 | 56 | suffix-$(CONFIG_KERNEL_BZIP2) := bz2 |
55 | suffix-$(CONFIG_KERNEL_LZMA) := lzma | 57 | suffix-$(CONFIG_KERNEL_LZMA) := lzma |
58 | suffix-$(CONFIG_KERNEL_LZO) := lzo | ||
56 | 59 | ||
57 | quiet_cmd_mkpiggy = MKPIGGY $@ | 60 | quiet_cmd_mkpiggy = MKPIGGY $@ |
58 | cmd_mkpiggy = $(obj)/mkpiggy $< > $@ || ( rm -f $@ ; false ) | 61 | cmd_mkpiggy = $(obj)/mkpiggy $< > $@ || ( rm -f $@ ; false ) |
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 842b2a36174a..3b22fe8ab91b 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
@@ -162,6 +162,10 @@ static int lines, cols; | |||
162 | #include "../../../../lib/decompress_unlzma.c" | 162 | #include "../../../../lib/decompress_unlzma.c" |
163 | #endif | 163 | #endif |
164 | 164 | ||
165 | #ifdef CONFIG_KERNEL_LZO | ||
166 | #include "../../../../lib/decompress_unlzo.c" | ||
167 | #endif | ||
168 | |||
165 | static void scroll(void) | 169 | static void scroll(void) |
166 | { | 170 | { |
167 | int i; | 171 | int i; |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index c973f8e2a6cf..9a0c258a86be 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -892,8 +892,7 @@ void __init mem_init(void) | |||
892 | reservedpages << (PAGE_SHIFT-10), | 892 | reservedpages << (PAGE_SHIFT-10), |
893 | datasize >> 10, | 893 | datasize >> 10, |
894 | initsize >> 10, | 894 | initsize >> 10, |
895 | (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10)) | 895 | totalhigh_pages << (PAGE_SHIFT-10)); |
896 | ); | ||
897 | 896 | ||
898 | printk(KERN_INFO "virtual kernel memory layout:\n" | 897 | printk(KERN_INFO "virtual kernel memory layout:\n" |
899 | " fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n" | 898 | " fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n" |
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 48adf80926a0..a5142bddef41 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
@@ -446,8 +446,8 @@ EXPORT_SYMBOL_GPL(dpm_resume_noirq); | |||
446 | 446 | ||
447 | /** | 447 | /** |
448 | * legacy_resume - Execute a legacy (bus or class) resume callback for device. | 448 | * legacy_resume - Execute a legacy (bus or class) resume callback for device. |
449 | * dev: Device to resume. | 449 | * @dev: Device to resume. |
450 | * cb: Resume callback to execute. | 450 | * @cb: Resume callback to execute. |
451 | */ | 451 | */ |
452 | static int legacy_resume(struct device *dev, int (*cb)(struct device *dev)) | 452 | static int legacy_resume(struct device *dev, int (*cb)(struct device *dev)) |
453 | { | 453 | { |
@@ -711,8 +711,9 @@ EXPORT_SYMBOL_GPL(dpm_suspend_noirq); | |||
711 | 711 | ||
712 | /** | 712 | /** |
713 | * legacy_suspend - Execute a legacy (bus or class) suspend callback for device. | 713 | * legacy_suspend - Execute a legacy (bus or class) suspend callback for device. |
714 | * dev: Device to suspend. | 714 | * @dev: Device to suspend. |
715 | * cb: Suspend callback to execute. | 715 | * @state: PM transition of the system being carried out. |
716 | * @cb: Suspend callback to execute. | ||
716 | */ | 717 | */ |
717 | static int legacy_suspend(struct device *dev, pm_message_t state, | 718 | static int legacy_suspend(struct device *dev, pm_message_t state, |
718 | int (*cb)(struct device *dev, pm_message_t state)) | 719 | int (*cb)(struct device *dev, pm_message_t state)) |
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index 68104434ebb5..73655aeb3a60 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/hrtimer.h> | 18 | #include <linux/hrtimer.h> |
19 | #include <linux/tick.h> | 19 | #include <linux/tick.h> |
20 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
21 | #include <linux/math64.h> | ||
21 | 22 | ||
22 | #define BUCKETS 12 | 23 | #define BUCKETS 12 |
23 | #define RESOLUTION 1024 | 24 | #define RESOLUTION 1024 |
@@ -169,6 +170,12 @@ static DEFINE_PER_CPU(struct menu_device, menu_devices); | |||
169 | 170 | ||
170 | static void menu_update(struct cpuidle_device *dev); | 171 | static void menu_update(struct cpuidle_device *dev); |
171 | 172 | ||
173 | /* This implements DIV_ROUND_CLOSEST but avoids 64 bit division */ | ||
174 | static u64 div_round64(u64 dividend, u32 divisor) | ||
175 | { | ||
176 | return div_u64(dividend + (divisor / 2), divisor); | ||
177 | } | ||
178 | |||
172 | /** | 179 | /** |
173 | * menu_select - selects the next idle state to enter | 180 | * menu_select - selects the next idle state to enter |
174 | * @dev: the CPU | 181 | * @dev: the CPU |
@@ -209,9 +216,8 @@ static int menu_select(struct cpuidle_device *dev) | |||
209 | data->correction_factor[data->bucket] = RESOLUTION * DECAY; | 216 | data->correction_factor[data->bucket] = RESOLUTION * DECAY; |
210 | 217 | ||
211 | /* Make sure to round up for half microseconds */ | 218 | /* Make sure to round up for half microseconds */ |
212 | data->predicted_us = DIV_ROUND_CLOSEST( | 219 | data->predicted_us = div_round64(data->expected_us * data->correction_factor[data->bucket], |
213 | data->expected_us * data->correction_factor[data->bucket], | 220 | RESOLUTION * DECAY); |
214 | RESOLUTION * DECAY); | ||
215 | 221 | ||
216 | /* | 222 | /* |
217 | * We want to default to C1 (hlt), not to busy polling | 223 | * We want to default to C1 (hlt), not to busy polling |
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index a019b49ecc9b..1f1d88ae68d6 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
@@ -172,6 +172,15 @@ config GPIO_ADP5520 | |||
172 | To compile this driver as a module, choose M here: the module will | 172 | To compile this driver as a module, choose M here: the module will |
173 | be called adp5520-gpio. | 173 | be called adp5520-gpio. |
174 | 174 | ||
175 | config GPIO_ADP5588 | ||
176 | tristate "ADP5588 I2C GPIO expander" | ||
177 | depends on I2C | ||
178 | help | ||
179 | This option enables support for 18 GPIOs found | ||
180 | on Analog Devices ADP5588 GPIO Expanders. | ||
181 | To compile this driver as a module, choose M here: the module will be | ||
182 | called adp5588-gpio. | ||
183 | |||
175 | comment "PCI GPIO expanders:" | 184 | comment "PCI GPIO expanders:" |
176 | 185 | ||
177 | config GPIO_CS5535 | 186 | config GPIO_CS5535 |
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 52fe4cf734c7..48687238edb1 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile | |||
@@ -5,6 +5,7 @@ ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG | |||
5 | obj-$(CONFIG_GPIOLIB) += gpiolib.o | 5 | obj-$(CONFIG_GPIOLIB) += gpiolib.o |
6 | 6 | ||
7 | obj-$(CONFIG_GPIO_ADP5520) += adp5520-gpio.o | 7 | obj-$(CONFIG_GPIO_ADP5520) += adp5520-gpio.o |
8 | obj-$(CONFIG_GPIO_ADP5588) += adp5588-gpio.o | ||
8 | obj-$(CONFIG_GPIO_LANGWELL) += langwell_gpio.o | 9 | obj-$(CONFIG_GPIO_LANGWELL) += langwell_gpio.o |
9 | obj-$(CONFIG_GPIO_MAX7301) += max7301.o | 10 | obj-$(CONFIG_GPIO_MAX7301) += max7301.o |
10 | obj-$(CONFIG_GPIO_MAX732X) += max732x.o | 11 | obj-$(CONFIG_GPIO_MAX732X) += max732x.o |
diff --git a/drivers/gpio/adp5588-gpio.c b/drivers/gpio/adp5588-gpio.c new file mode 100644 index 000000000000..afc097a16b33 --- /dev/null +++ b/drivers/gpio/adp5588-gpio.c | |||
@@ -0,0 +1,266 @@ | |||
1 | /* | ||
2 | * GPIO Chip driver for Analog Devices | ||
3 | * ADP5588 I/O Expander and QWERTY Keypad Controller | ||
4 | * | ||
5 | * Copyright 2009 Analog Devices Inc. | ||
6 | * | ||
7 | * Licensed under the GPL-2 or later. | ||
8 | */ | ||
9 | |||
10 | #include <linux/module.h> | ||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/i2c.h> | ||
14 | #include <linux/gpio.h> | ||
15 | |||
16 | #include <linux/i2c/adp5588.h> | ||
17 | |||
18 | #define DRV_NAME "adp5588-gpio" | ||
19 | #define MAXGPIO 18 | ||
20 | #define ADP_BANK(offs) ((offs) >> 3) | ||
21 | #define ADP_BIT(offs) (1u << ((offs) & 0x7)) | ||
22 | |||
23 | struct adp5588_gpio { | ||
24 | struct i2c_client *client; | ||
25 | struct gpio_chip gpio_chip; | ||
26 | struct mutex lock; /* protect cached dir, dat_out */ | ||
27 | unsigned gpio_start; | ||
28 | uint8_t dat_out[3]; | ||
29 | uint8_t dir[3]; | ||
30 | }; | ||
31 | |||
32 | static int adp5588_gpio_read(struct i2c_client *client, u8 reg) | ||
33 | { | ||
34 | int ret = i2c_smbus_read_byte_data(client, reg); | ||
35 | |||
36 | if (ret < 0) | ||
37 | dev_err(&client->dev, "Read Error\n"); | ||
38 | |||
39 | return ret; | ||
40 | } | ||
41 | |||
42 | static int adp5588_gpio_write(struct i2c_client *client, u8 reg, u8 val) | ||
43 | { | ||
44 | int ret = i2c_smbus_write_byte_data(client, reg, val); | ||
45 | |||
46 | if (ret < 0) | ||
47 | dev_err(&client->dev, "Write Error\n"); | ||
48 | |||
49 | return ret; | ||
50 | } | ||
51 | |||
52 | static int adp5588_gpio_get_value(struct gpio_chip *chip, unsigned off) | ||
53 | { | ||
54 | struct adp5588_gpio *dev = | ||
55 | container_of(chip, struct adp5588_gpio, gpio_chip); | ||
56 | |||
57 | return !!(adp5588_gpio_read(dev->client, GPIO_DAT_STAT1 + ADP_BANK(off)) | ||
58 | & ADP_BIT(off)); | ||
59 | } | ||
60 | |||
61 | static void adp5588_gpio_set_value(struct gpio_chip *chip, | ||
62 | unsigned off, int val) | ||
63 | { | ||
64 | unsigned bank, bit; | ||
65 | struct adp5588_gpio *dev = | ||
66 | container_of(chip, struct adp5588_gpio, gpio_chip); | ||
67 | |||
68 | bank = ADP_BANK(off); | ||
69 | bit = ADP_BIT(off); | ||
70 | |||
71 | mutex_lock(&dev->lock); | ||
72 | if (val) | ||
73 | dev->dat_out[bank] |= bit; | ||
74 | else | ||
75 | dev->dat_out[bank] &= ~bit; | ||
76 | |||
77 | adp5588_gpio_write(dev->client, GPIO_DAT_OUT1 + bank, | ||
78 | dev->dat_out[bank]); | ||
79 | mutex_unlock(&dev->lock); | ||
80 | } | ||
81 | |||
82 | static int adp5588_gpio_direction_input(struct gpio_chip *chip, unsigned off) | ||
83 | { | ||
84 | int ret; | ||
85 | unsigned bank; | ||
86 | struct adp5588_gpio *dev = | ||
87 | container_of(chip, struct adp5588_gpio, gpio_chip); | ||
88 | |||
89 | bank = ADP_BANK(off); | ||
90 | |||
91 | mutex_lock(&dev->lock); | ||
92 | dev->dir[bank] &= ~ADP_BIT(off); | ||
93 | ret = adp5588_gpio_write(dev->client, GPIO_DIR1 + bank, dev->dir[bank]); | ||
94 | mutex_unlock(&dev->lock); | ||
95 | |||
96 | return ret; | ||
97 | } | ||
98 | |||
99 | static int adp5588_gpio_direction_output(struct gpio_chip *chip, | ||
100 | unsigned off, int val) | ||
101 | { | ||
102 | int ret; | ||
103 | unsigned bank, bit; | ||
104 | struct adp5588_gpio *dev = | ||
105 | container_of(chip, struct adp5588_gpio, gpio_chip); | ||
106 | |||
107 | bank = ADP_BANK(off); | ||
108 | bit = ADP_BIT(off); | ||
109 | |||
110 | mutex_lock(&dev->lock); | ||
111 | dev->dir[bank] |= bit; | ||
112 | |||
113 | if (val) | ||
114 | dev->dat_out[bank] |= bit; | ||
115 | else | ||
116 | dev->dat_out[bank] &= ~bit; | ||
117 | |||
118 | ret = adp5588_gpio_write(dev->client, GPIO_DAT_OUT1 + bank, | ||
119 | dev->dat_out[bank]); | ||
120 | ret |= adp5588_gpio_write(dev->client, GPIO_DIR1 + bank, | ||
121 | dev->dir[bank]); | ||
122 | mutex_unlock(&dev->lock); | ||
123 | |||
124 | return ret; | ||
125 | } | ||
126 | |||
127 | static int __devinit adp5588_gpio_probe(struct i2c_client *client, | ||
128 | const struct i2c_device_id *id) | ||
129 | { | ||
130 | struct adp5588_gpio_platform_data *pdata = client->dev.platform_data; | ||
131 | struct adp5588_gpio *dev; | ||
132 | struct gpio_chip *gc; | ||
133 | int ret, i, revid; | ||
134 | |||
135 | if (pdata == NULL) { | ||
136 | dev_err(&client->dev, "missing platform data\n"); | ||
137 | return -ENODEV; | ||
138 | } | ||
139 | |||
140 | if (!i2c_check_functionality(client->adapter, | ||
141 | I2C_FUNC_SMBUS_BYTE_DATA)) { | ||
142 | dev_err(&client->dev, "SMBUS Byte Data not Supported\n"); | ||
143 | return -EIO; | ||
144 | } | ||
145 | |||
146 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | ||
147 | if (dev == NULL) { | ||
148 | dev_err(&client->dev, "failed to alloc memory\n"); | ||
149 | return -ENOMEM; | ||
150 | } | ||
151 | |||
152 | dev->client = client; | ||
153 | |||
154 | gc = &dev->gpio_chip; | ||
155 | gc->direction_input = adp5588_gpio_direction_input; | ||
156 | gc->direction_output = adp5588_gpio_direction_output; | ||
157 | gc->get = adp5588_gpio_get_value; | ||
158 | gc->set = adp5588_gpio_set_value; | ||
159 | gc->can_sleep = 1; | ||
160 | |||
161 | gc->base = pdata->gpio_start; | ||
162 | gc->ngpio = MAXGPIO; | ||
163 | gc->label = client->name; | ||
164 | gc->owner = THIS_MODULE; | ||
165 | |||
166 | mutex_init(&dev->lock); | ||
167 | |||
168 | |||
169 | ret = adp5588_gpio_read(dev->client, DEV_ID); | ||
170 | if (ret < 0) | ||
171 | goto err; | ||
172 | |||
173 | revid = ret & ADP5588_DEVICE_ID_MASK; | ||
174 | |||
175 | for (i = 0, ret = 0; i <= ADP_BANK(MAXGPIO); i++) { | ||
176 | dev->dat_out[i] = adp5588_gpio_read(client, GPIO_DAT_OUT1 + i); | ||
177 | dev->dir[i] = adp5588_gpio_read(client, GPIO_DIR1 + i); | ||
178 | ret |= adp5588_gpio_write(client, KP_GPIO1 + i, 0); | ||
179 | ret |= adp5588_gpio_write(client, GPIO_PULL1 + i, | ||
180 | (pdata->pullup_dis_mask >> (8 * i)) & 0xFF); | ||
181 | |||
182 | if (ret) | ||
183 | goto err; | ||
184 | } | ||
185 | |||
186 | ret = gpiochip_add(&dev->gpio_chip); | ||
187 | if (ret) | ||
188 | goto err; | ||
189 | |||
190 | dev_info(&client->dev, "gpios %d..%d on a %s Rev. %d\n", | ||
191 | gc->base, gc->base + gc->ngpio - 1, | ||
192 | client->name, revid); | ||
193 | |||
194 | if (pdata->setup) { | ||
195 | ret = pdata->setup(client, gc->base, gc->ngpio, pdata->context); | ||
196 | if (ret < 0) | ||
197 | dev_warn(&client->dev, "setup failed, %d\n", ret); | ||
198 | } | ||
199 | |||
200 | i2c_set_clientdata(client, dev); | ||
201 | return 0; | ||
202 | |||
203 | err: | ||
204 | kfree(dev); | ||
205 | return ret; | ||
206 | } | ||
207 | |||
208 | static int __devexit adp5588_gpio_remove(struct i2c_client *client) | ||
209 | { | ||
210 | struct adp5588_gpio_platform_data *pdata = client->dev.platform_data; | ||
211 | struct adp5588_gpio *dev = i2c_get_clientdata(client); | ||
212 | int ret; | ||
213 | |||
214 | if (pdata->teardown) { | ||
215 | ret = pdata->teardown(client, | ||
216 | dev->gpio_chip.base, dev->gpio_chip.ngpio, | ||
217 | pdata->context); | ||
218 | if (ret < 0) { | ||
219 | dev_err(&client->dev, "teardown failed %d\n", ret); | ||
220 | return ret; | ||
221 | } | ||
222 | } | ||
223 | |||
224 | ret = gpiochip_remove(&dev->gpio_chip); | ||
225 | if (ret) { | ||
226 | dev_err(&client->dev, "gpiochip_remove failed %d\n", ret); | ||
227 | return ret; | ||
228 | } | ||
229 | |||
230 | kfree(dev); | ||
231 | return 0; | ||
232 | } | ||
233 | |||
234 | static const struct i2c_device_id adp5588_gpio_id[] = { | ||
235 | {DRV_NAME, 0}, | ||
236 | {} | ||
237 | }; | ||
238 | |||
239 | MODULE_DEVICE_TABLE(i2c, adp5588_gpio_id); | ||
240 | |||
241 | static struct i2c_driver adp5588_gpio_driver = { | ||
242 | .driver = { | ||
243 | .name = DRV_NAME, | ||
244 | }, | ||
245 | .probe = adp5588_gpio_probe, | ||
246 | .remove = __devexit_p(adp5588_gpio_remove), | ||
247 | .id_table = adp5588_gpio_id, | ||
248 | }; | ||
249 | |||
250 | static int __init adp5588_gpio_init(void) | ||
251 | { | ||
252 | return i2c_add_driver(&adp5588_gpio_driver); | ||
253 | } | ||
254 | |||
255 | module_init(adp5588_gpio_init); | ||
256 | |||
257 | static void __exit adp5588_gpio_exit(void) | ||
258 | { | ||
259 | i2c_del_driver(&adp5588_gpio_driver); | ||
260 | } | ||
261 | |||
262 | module_exit(adp5588_gpio_exit); | ||
263 | |||
264 | MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); | ||
265 | MODULE_DESCRIPTION("GPIO ADP5588 Driver"); | ||
266 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index a25ad284a272..350842ad3632 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -858,8 +858,6 @@ int gpio_sysfs_set_active_low(unsigned gpio, int value) | |||
858 | desc = &gpio_desc[gpio]; | 858 | desc = &gpio_desc[gpio]; |
859 | 859 | ||
860 | if (test_bit(FLAG_EXPORT, &desc->flags)) { | 860 | if (test_bit(FLAG_EXPORT, &desc->flags)) { |
861 | struct device *dev; | ||
862 | |||
863 | dev = class_find_device(&gpio_class, NULL, desc, match_export); | 861 | dev = class_find_device(&gpio_class, NULL, desc, match_export); |
864 | if (dev == NULL) { | 862 | if (dev == NULL) { |
865 | status = -ENODEV; | 863 | status = -ENODEV; |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 2ffffd7ae09a..be631cc3e4dc 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -464,6 +464,8 @@ static struct drm_driver driver = { | |||
464 | .lastclose = i915_driver_lastclose, | 464 | .lastclose = i915_driver_lastclose, |
465 | .preclose = i915_driver_preclose, | 465 | .preclose = i915_driver_preclose, |
466 | .postclose = i915_driver_postclose, | 466 | .postclose = i915_driver_postclose, |
467 | .suspend = i915_suspend, | ||
468 | .resume = i915_resume, | ||
467 | .device_is_agp = i915_driver_device_is_agp, | 469 | .device_is_agp = i915_driver_device_is_agp, |
468 | .enable_vblank = i915_enable_vblank, | 470 | .enable_vblank = i915_enable_vblank, |
469 | .disable_vblank = i915_disable_vblank, | 471 | .disable_vblank = i915_disable_vblank, |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 435ae72fc47a..68cf87749a42 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
@@ -792,6 +792,16 @@ config SENSORS_ADS7828 | |||
792 | This driver can also be built as a module. If so, the module | 792 | This driver can also be built as a module. If so, the module |
793 | will be called ads7828. | 793 | will be called ads7828. |
794 | 794 | ||
795 | config SENSORS_AMC6821 | ||
796 | tristate "Texas Instruments AMC6821" | ||
797 | depends on I2C && EXPERIMENTAL | ||
798 | help | ||
799 | If you say yes here you get support for the Texas Instruments | ||
800 | AMC6821 hardware monitoring chips. | ||
801 | |||
802 | This driver can also be build as a module. If so, the module | ||
803 | will be called amc6821. | ||
804 | |||
795 | config SENSORS_THMC50 | 805 | config SENSORS_THMC50 |
796 | tristate "Texas Instruments THMC50 / Analog Devices ADM1022" | 806 | tristate "Texas Instruments THMC50 / Analog Devices ADM1022" |
797 | depends on I2C && EXPERIMENTAL | 807 | depends on I2C && EXPERIMENTAL |
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 450c8e894277..4bc215c0953f 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile | |||
@@ -86,6 +86,7 @@ obj-$(CONFIG_SENSORS_SIS5595) += sis5595.o | |||
86 | obj-$(CONFIG_SENSORS_SMSC47B397)+= smsc47b397.o | 86 | obj-$(CONFIG_SENSORS_SMSC47B397)+= smsc47b397.o |
87 | obj-$(CONFIG_SENSORS_SMSC47M1) += smsc47m1.o | 87 | obj-$(CONFIG_SENSORS_SMSC47M1) += smsc47m1.o |
88 | obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o | 88 | obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o |
89 | obj-$(CONFIG_SENSORS_AMC6821) += amc6821.o | ||
89 | obj-$(CONFIG_SENSORS_THMC50) += thmc50.o | 90 | obj-$(CONFIG_SENSORS_THMC50) += thmc50.o |
90 | obj-$(CONFIG_SENSORS_TMP401) += tmp401.o | 91 | obj-$(CONFIG_SENSORS_TMP401) += tmp401.o |
91 | obj-$(CONFIG_SENSORS_TMP421) += tmp421.o | 92 | obj-$(CONFIG_SENSORS_TMP421) += tmp421.o |
diff --git a/drivers/hwmon/amc6821.c b/drivers/hwmon/amc6821.c new file mode 100644 index 000000000000..1c89d922d619 --- /dev/null +++ b/drivers/hwmon/amc6821.c | |||
@@ -0,0 +1,1116 @@ | |||
1 | /* | ||
2 | amc6821.c - Part of lm_sensors, Linux kernel modules for hardware | ||
3 | monitoring | ||
4 | Copyright (C) 2009 T. Mertelj <tomaz.mertelj@guest.arnes.si> | ||
5 | |||
6 | Based on max6650.c: | ||
7 | Copyright (C) 2007 Hans J. Koch <hjk@linutronix.de> | ||
8 | |||
9 | This program is free software; you can redistribute it and/or modify | ||
10 | it under the terms of the GNU General Public License as published by | ||
11 | the Free Software Foundation; either version 2 of the License, or | ||
12 | (at your option) any later version. | ||
13 | |||
14 | This program is distributed in the hope that it will be useful, | ||
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | GNU General Public License for more details. | ||
18 | |||
19 | You should have received a copy of the GNU General Public License | ||
20 | along with this program; if not, write to the Free Software | ||
21 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | ||
23 | |||
24 | |||
25 | #include <linux/kernel.h> /* Needed for KERN_INFO */ | ||
26 | #include <linux/module.h> | ||
27 | #include <linux/init.h> | ||
28 | #include <linux/slab.h> | ||
29 | #include <linux/jiffies.h> | ||
30 | #include <linux/i2c.h> | ||
31 | #include <linux/hwmon.h> | ||
32 | #include <linux/hwmon-sysfs.h> | ||
33 | #include <linux/err.h> | ||
34 | #include <linux/mutex.h> | ||
35 | |||
36 | |||
37 | /* | ||
38 | * Addresses to scan. | ||
39 | */ | ||
40 | |||
41 | static const unsigned short normal_i2c[] = {0x18, 0x19, 0x1a, 0x2c, 0x2d, 0x2e, | ||
42 | 0x4c, 0x4d, 0x4e, I2C_CLIENT_END}; | ||
43 | |||
44 | |||
45 | |||
46 | /* | ||
47 | * Insmod parameters | ||
48 | */ | ||
49 | |||
50 | static int pwminv = 0; /*Inverted PWM output. */ | ||
51 | module_param(pwminv, int, S_IRUGO); | ||
52 | |||
53 | static int init = 1; /*Power-on initialization.*/ | ||
54 | module_param(init, int, S_IRUGO); | ||
55 | |||
56 | |||
57 | enum chips { amc6821 }; | ||
58 | |||
59 | #define AMC6821_REG_DEV_ID 0x3D | ||
60 | #define AMC6821_REG_COMP_ID 0x3E | ||
61 | #define AMC6821_REG_CONF1 0x00 | ||
62 | #define AMC6821_REG_CONF2 0x01 | ||
63 | #define AMC6821_REG_CONF3 0x3F | ||
64 | #define AMC6821_REG_CONF4 0x04 | ||
65 | #define AMC6821_REG_STAT1 0x02 | ||
66 | #define AMC6821_REG_STAT2 0x03 | ||
67 | #define AMC6821_REG_TDATA_LOW 0x08 | ||
68 | #define AMC6821_REG_TDATA_HI 0x09 | ||
69 | #define AMC6821_REG_LTEMP_HI 0x0A | ||
70 | #define AMC6821_REG_RTEMP_HI 0x0B | ||
71 | #define AMC6821_REG_LTEMP_LIMIT_MIN 0x15 | ||
72 | #define AMC6821_REG_LTEMP_LIMIT_MAX 0x14 | ||
73 | #define AMC6821_REG_RTEMP_LIMIT_MIN 0x19 | ||
74 | #define AMC6821_REG_RTEMP_LIMIT_MAX 0x18 | ||
75 | #define AMC6821_REG_LTEMP_CRIT 0x1B | ||
76 | #define AMC6821_REG_RTEMP_CRIT 0x1D | ||
77 | #define AMC6821_REG_PSV_TEMP 0x1C | ||
78 | #define AMC6821_REG_DCY 0x22 | ||
79 | #define AMC6821_REG_LTEMP_FAN_CTRL 0x24 | ||
80 | #define AMC6821_REG_RTEMP_FAN_CTRL 0x25 | ||
81 | #define AMC6821_REG_DCY_LOW_TEMP 0x21 | ||
82 | |||
83 | #define AMC6821_REG_TACH_LLIMITL 0x10 | ||
84 | #define AMC6821_REG_TACH_LLIMITH 0x11 | ||
85 | #define AMC6821_REG_TACH_HLIMITL 0x12 | ||
86 | #define AMC6821_REG_TACH_HLIMITH 0x13 | ||
87 | |||
88 | #define AMC6821_CONF1_START 0x01 | ||
89 | #define AMC6821_CONF1_FAN_INT_EN 0x02 | ||
90 | #define AMC6821_CONF1_FANIE 0x04 | ||
91 | #define AMC6821_CONF1_PWMINV 0x08 | ||
92 | #define AMC6821_CONF1_FAN_FAULT_EN 0x10 | ||
93 | #define AMC6821_CONF1_FDRC0 0x20 | ||
94 | #define AMC6821_CONF1_FDRC1 0x40 | ||
95 | #define AMC6821_CONF1_THERMOVIE 0x80 | ||
96 | |||
97 | #define AMC6821_CONF2_PWM_EN 0x01 | ||
98 | #define AMC6821_CONF2_TACH_MODE 0x02 | ||
99 | #define AMC6821_CONF2_TACH_EN 0x04 | ||
100 | #define AMC6821_CONF2_RTFIE 0x08 | ||
101 | #define AMC6821_CONF2_LTOIE 0x10 | ||
102 | #define AMC6821_CONF2_RTOIE 0x20 | ||
103 | #define AMC6821_CONF2_PSVIE 0x40 | ||
104 | #define AMC6821_CONF2_RST 0x80 | ||
105 | |||
106 | #define AMC6821_CONF3_THERM_FAN_EN 0x80 | ||
107 | #define AMC6821_CONF3_REV_MASK 0x0F | ||
108 | |||
109 | #define AMC6821_CONF4_OVREN 0x10 | ||
110 | #define AMC6821_CONF4_TACH_FAST 0x20 | ||
111 | #define AMC6821_CONF4_PSPR 0x40 | ||
112 | #define AMC6821_CONF4_MODE 0x80 | ||
113 | |||
114 | #define AMC6821_STAT1_RPM_ALARM 0x01 | ||
115 | #define AMC6821_STAT1_FANS 0x02 | ||
116 | #define AMC6821_STAT1_RTH 0x04 | ||
117 | #define AMC6821_STAT1_RTL 0x08 | ||
118 | #define AMC6821_STAT1_R_THERM 0x10 | ||
119 | #define AMC6821_STAT1_RTF 0x20 | ||
120 | #define AMC6821_STAT1_LTH 0x40 | ||
121 | #define AMC6821_STAT1_LTL 0x80 | ||
122 | |||
123 | #define AMC6821_STAT2_RTC 0x08 | ||
124 | #define AMC6821_STAT2_LTC 0x10 | ||
125 | #define AMC6821_STAT2_LPSV 0x20 | ||
126 | #define AMC6821_STAT2_L_THERM 0x40 | ||
127 | #define AMC6821_STAT2_THERM_IN 0x80 | ||
128 | |||
129 | enum {IDX_TEMP1_INPUT = 0, IDX_TEMP1_MIN, IDX_TEMP1_MAX, | ||
130 | IDX_TEMP1_CRIT, IDX_TEMP2_INPUT, IDX_TEMP2_MIN, | ||
131 | IDX_TEMP2_MAX, IDX_TEMP2_CRIT, | ||
132 | TEMP_IDX_LEN, }; | ||
133 | |||
134 | static const u8 temp_reg[] = {AMC6821_REG_LTEMP_HI, | ||
135 | AMC6821_REG_LTEMP_LIMIT_MIN, | ||
136 | AMC6821_REG_LTEMP_LIMIT_MAX, | ||
137 | AMC6821_REG_LTEMP_CRIT, | ||
138 | AMC6821_REG_RTEMP_HI, | ||
139 | AMC6821_REG_RTEMP_LIMIT_MIN, | ||
140 | AMC6821_REG_RTEMP_LIMIT_MAX, | ||
141 | AMC6821_REG_RTEMP_CRIT, }; | ||
142 | |||
143 | enum {IDX_FAN1_INPUT = 0, IDX_FAN1_MIN, IDX_FAN1_MAX, | ||
144 | FAN1_IDX_LEN, }; | ||
145 | |||
146 | static const u8 fan_reg_low[] = {AMC6821_REG_TDATA_LOW, | ||
147 | AMC6821_REG_TACH_LLIMITL, | ||
148 | AMC6821_REG_TACH_HLIMITL, }; | ||
149 | |||
150 | |||
151 | static const u8 fan_reg_hi[] = {AMC6821_REG_TDATA_HI, | ||
152 | AMC6821_REG_TACH_LLIMITH, | ||
153 | AMC6821_REG_TACH_HLIMITH, }; | ||
154 | |||
155 | static int amc6821_probe( | ||
156 | struct i2c_client *client, | ||
157 | const struct i2c_device_id *id); | ||
158 | static int amc6821_detect( | ||
159 | struct i2c_client *client, | ||
160 | struct i2c_board_info *info); | ||
161 | static int amc6821_init_client(struct i2c_client *client); | ||
162 | static int amc6821_remove(struct i2c_client *client); | ||
163 | static struct amc6821_data *amc6821_update_device(struct device *dev); | ||
164 | |||
165 | /* | ||
166 | * Driver data (common to all clients) | ||
167 | */ | ||
168 | |||
169 | static const struct i2c_device_id amc6821_id[] = { | ||
170 | { "amc6821", amc6821 }, | ||
171 | { } | ||
172 | }; | ||
173 | |||
174 | MODULE_DEVICE_TABLE(i2c, amc6821_id); | ||
175 | |||
176 | static struct i2c_driver amc6821_driver = { | ||
177 | .class = I2C_CLASS_HWMON, | ||
178 | .driver = { | ||
179 | .name = "amc6821", | ||
180 | }, | ||
181 | .probe = amc6821_probe, | ||
182 | .remove = amc6821_remove, | ||
183 | .id_table = amc6821_id, | ||
184 | .detect = amc6821_detect, | ||
185 | .address_list = normal_i2c, | ||
186 | }; | ||
187 | |||
188 | |||
189 | /* | ||
190 | * Client data (each client gets its own) | ||
191 | */ | ||
192 | |||
193 | struct amc6821_data { | ||
194 | struct device *hwmon_dev; | ||
195 | struct mutex update_lock; | ||
196 | char valid; /* zero until following fields are valid */ | ||
197 | unsigned long last_updated; /* in jiffies */ | ||
198 | |||
199 | /* register values */ | ||
200 | int temp[TEMP_IDX_LEN]; | ||
201 | |||
202 | u16 fan[FAN1_IDX_LEN]; | ||
203 | u8 fan1_div; | ||
204 | |||
205 | u8 pwm1; | ||
206 | u8 temp1_auto_point_temp[3]; | ||
207 | u8 temp2_auto_point_temp[3]; | ||
208 | u8 pwm1_auto_point_pwm[3]; | ||
209 | u8 pwm1_enable; | ||
210 | u8 pwm1_auto_channels_temp; | ||
211 | |||
212 | u8 stat1; | ||
213 | u8 stat2; | ||
214 | }; | ||
215 | |||
216 | |||
217 | static ssize_t get_temp( | ||
218 | struct device *dev, | ||
219 | struct device_attribute *devattr, | ||
220 | char *buf) | ||
221 | { | ||
222 | struct amc6821_data *data = amc6821_update_device(dev); | ||
223 | int ix = to_sensor_dev_attr(devattr)->index; | ||
224 | |||
225 | return sprintf(buf, "%d\n", data->temp[ix] * 1000); | ||
226 | } | ||
227 | |||
228 | |||
229 | |||
230 | static ssize_t set_temp( | ||
231 | struct device *dev, | ||
232 | struct device_attribute *attr, | ||
233 | const char *buf, | ||
234 | size_t count) | ||
235 | { | ||
236 | struct i2c_client *client = to_i2c_client(dev); | ||
237 | struct amc6821_data *data = i2c_get_clientdata(client); | ||
238 | int ix = to_sensor_dev_attr(attr)->index; | ||
239 | long val; | ||
240 | |||
241 | int ret = strict_strtol(buf, 10, &val); | ||
242 | if (ret) | ||
243 | return ret; | ||
244 | val = SENSORS_LIMIT(val / 1000, -128, 127); | ||
245 | |||
246 | mutex_lock(&data->update_lock); | ||
247 | data->temp[ix] = val; | ||
248 | if (i2c_smbus_write_byte_data(client, temp_reg[ix], data->temp[ix])) { | ||
249 | dev_err(&client->dev, "Register write error, aborting.\n"); | ||
250 | count = -EIO; | ||
251 | } | ||
252 | mutex_unlock(&data->update_lock); | ||
253 | return count; | ||
254 | } | ||
255 | |||
256 | |||
257 | |||
258 | |||
259 | static ssize_t get_temp_alarm( | ||
260 | struct device *dev, | ||
261 | struct device_attribute *devattr, | ||
262 | char *buf) | ||
263 | { | ||
264 | struct amc6821_data *data = amc6821_update_device(dev); | ||
265 | int ix = to_sensor_dev_attr(devattr)->index; | ||
266 | u8 flag; | ||
267 | |||
268 | switch (ix) { | ||
269 | case IDX_TEMP1_MIN: | ||
270 | flag = data->stat1 & AMC6821_STAT1_LTL; | ||
271 | break; | ||
272 | case IDX_TEMP1_MAX: | ||
273 | flag = data->stat1 & AMC6821_STAT1_LTH; | ||
274 | break; | ||
275 | case IDX_TEMP1_CRIT: | ||
276 | flag = data->stat2 & AMC6821_STAT2_LTC; | ||
277 | break; | ||
278 | case IDX_TEMP2_MIN: | ||
279 | flag = data->stat1 & AMC6821_STAT1_RTL; | ||
280 | break; | ||
281 | case IDX_TEMP2_MAX: | ||
282 | flag = data->stat1 & AMC6821_STAT1_RTH; | ||
283 | break; | ||
284 | case IDX_TEMP2_CRIT: | ||
285 | flag = data->stat2 & AMC6821_STAT2_RTC; | ||
286 | break; | ||
287 | default: | ||
288 | dev_dbg(dev, "Unknown attr->index (%d).\n", ix); | ||
289 | return -EINVAL; | ||
290 | } | ||
291 | if (flag) | ||
292 | return sprintf(buf, "1"); | ||
293 | else | ||
294 | return sprintf(buf, "0"); | ||
295 | } | ||
296 | |||
297 | |||
298 | |||
299 | |||
300 | static ssize_t get_temp2_fault( | ||
301 | struct device *dev, | ||
302 | struct device_attribute *devattr, | ||
303 | char *buf) | ||
304 | { | ||
305 | struct amc6821_data *data = amc6821_update_device(dev); | ||
306 | if (data->stat1 & AMC6821_STAT1_RTF) | ||
307 | return sprintf(buf, "1"); | ||
308 | else | ||
309 | return sprintf(buf, "0"); | ||
310 | } | ||
311 | |||
312 | static ssize_t get_pwm1( | ||
313 | struct device *dev, | ||
314 | struct device_attribute *devattr, | ||
315 | char *buf) | ||
316 | { | ||
317 | struct amc6821_data *data = amc6821_update_device(dev); | ||
318 | return sprintf(buf, "%d\n", data->pwm1); | ||
319 | } | ||
320 | |||
321 | static ssize_t set_pwm1( | ||
322 | struct device *dev, | ||
323 | struct device_attribute *devattr, | ||
324 | const char *buf, | ||
325 | size_t count) | ||
326 | { | ||
327 | struct i2c_client *client = to_i2c_client(dev); | ||
328 | struct amc6821_data *data = i2c_get_clientdata(client); | ||
329 | long val; | ||
330 | int ret = strict_strtol(buf, 10, &val); | ||
331 | if (ret) | ||
332 | return ret; | ||
333 | |||
334 | mutex_lock(&data->update_lock); | ||
335 | data->pwm1 = SENSORS_LIMIT(val , 0, 255); | ||
336 | i2c_smbus_write_byte_data(client, AMC6821_REG_DCY, data->pwm1); | ||
337 | mutex_unlock(&data->update_lock); | ||
338 | return count; | ||
339 | } | ||
340 | |||
341 | static ssize_t get_pwm1_enable( | ||
342 | struct device *dev, | ||
343 | struct device_attribute *devattr, | ||
344 | char *buf) | ||
345 | { | ||
346 | struct amc6821_data *data = amc6821_update_device(dev); | ||
347 | return sprintf(buf, "%d\n", data->pwm1_enable); | ||
348 | } | ||
349 | |||
350 | static ssize_t set_pwm1_enable( | ||
351 | struct device *dev, | ||
352 | struct device_attribute *attr, | ||
353 | const char *buf, | ||
354 | size_t count) | ||
355 | { | ||
356 | struct i2c_client *client = to_i2c_client(dev); | ||
357 | struct amc6821_data *data = i2c_get_clientdata(client); | ||
358 | long val; | ||
359 | int config = strict_strtol(buf, 10, &val); | ||
360 | if (config) | ||
361 | return config; | ||
362 | |||
363 | config = i2c_smbus_read_byte_data(client, AMC6821_REG_CONF1); | ||
364 | if (config < 0) { | ||
365 | dev_err(&client->dev, | ||
366 | "Error reading configuration register, aborting.\n"); | ||
367 | return -EIO; | ||
368 | } | ||
369 | |||
370 | switch (val) { | ||
371 | case 1: | ||
372 | config &= ~AMC6821_CONF1_FDRC0; | ||
373 | config &= ~AMC6821_CONF1_FDRC1; | ||
374 | break; | ||
375 | case 2: | ||
376 | config &= ~AMC6821_CONF1_FDRC0; | ||
377 | config |= AMC6821_CONF1_FDRC1; | ||
378 | break; | ||
379 | case 3: | ||
380 | config |= AMC6821_CONF1_FDRC0; | ||
381 | config |= AMC6821_CONF1_FDRC1; | ||
382 | break; | ||
383 | default: | ||
384 | return -EINVAL; | ||
385 | } | ||
386 | mutex_lock(&data->update_lock); | ||
387 | if (i2c_smbus_write_byte_data(client, AMC6821_REG_CONF1, config)) { | ||
388 | dev_err(&client->dev, | ||
389 | "Configuration register write error, aborting.\n"); | ||
390 | count = -EIO; | ||
391 | } | ||
392 | mutex_unlock(&data->update_lock); | ||
393 | return count; | ||
394 | } | ||
395 | |||
396 | |||
397 | static ssize_t get_pwm1_auto_channels_temp( | ||
398 | struct device *dev, | ||
399 | struct device_attribute *devattr, | ||
400 | char *buf) | ||
401 | { | ||
402 | struct amc6821_data *data = amc6821_update_device(dev); | ||
403 | return sprintf(buf, "%d\n", data->pwm1_auto_channels_temp); | ||
404 | } | ||
405 | |||
406 | |||
407 | static ssize_t get_temp_auto_point_temp( | ||
408 | struct device *dev, | ||
409 | struct device_attribute *devattr, | ||
410 | char *buf) | ||
411 | { | ||
412 | int ix = to_sensor_dev_attr_2(devattr)->index; | ||
413 | int nr = to_sensor_dev_attr_2(devattr)->nr; | ||
414 | struct amc6821_data *data = amc6821_update_device(dev); | ||
415 | switch (nr) { | ||
416 | case 1: | ||
417 | return sprintf(buf, "%d\n", | ||
418 | data->temp1_auto_point_temp[ix] * 1000); | ||
419 | break; | ||
420 | case 2: | ||
421 | return sprintf(buf, "%d\n", | ||
422 | data->temp2_auto_point_temp[ix] * 1000); | ||
423 | break; | ||
424 | default: | ||
425 | dev_dbg(dev, "Unknown attr->nr (%d).\n", nr); | ||
426 | return -EINVAL; | ||
427 | } | ||
428 | } | ||
429 | |||
430 | |||
431 | static ssize_t get_pwm1_auto_point_pwm( | ||
432 | struct device *dev, | ||
433 | struct device_attribute *devattr, | ||
434 | char *buf) | ||
435 | { | ||
436 | int ix = to_sensor_dev_attr(devattr)->index; | ||
437 | struct amc6821_data *data = amc6821_update_device(dev); | ||
438 | return sprintf(buf, "%d\n", data->pwm1_auto_point_pwm[ix]); | ||
439 | } | ||
440 | |||
441 | |||
442 | static inline ssize_t set_slope_register(struct i2c_client *client, | ||
443 | u8 reg, | ||
444 | u8 dpwm, | ||
445 | u8 *ptemp) | ||
446 | { | ||
447 | int dt; | ||
448 | u8 tmp; | ||
449 | |||
450 | dt = ptemp[2]-ptemp[1]; | ||
451 | for (tmp = 4; tmp > 0; tmp--) { | ||
452 | if (dt * (0x20 >> tmp) >= dpwm) | ||
453 | break; | ||
454 | } | ||
455 | tmp |= (ptemp[1] & 0x7C) << 1; | ||
456 | if (i2c_smbus_write_byte_data(client, | ||
457 | reg, tmp)) { | ||
458 | dev_err(&client->dev, "Register write error, aborting.\n"); | ||
459 | return -EIO; | ||
460 | } | ||
461 | return 0; | ||
462 | } | ||
463 | |||
464 | |||
465 | |||
466 | static ssize_t set_temp_auto_point_temp( | ||
467 | struct device *dev, | ||
468 | struct device_attribute *attr, | ||
469 | const char *buf, | ||
470 | size_t count) | ||
471 | { | ||
472 | struct i2c_client *client = to_i2c_client(dev); | ||
473 | struct amc6821_data *data = amc6821_update_device(dev); | ||
474 | int ix = to_sensor_dev_attr_2(attr)->index; | ||
475 | int nr = to_sensor_dev_attr_2(attr)->nr; | ||
476 | u8 *ptemp; | ||
477 | u8 reg; | ||
478 | int dpwm; | ||
479 | long val; | ||
480 | int ret = strict_strtol(buf, 10, &val); | ||
481 | if (ret) | ||
482 | return ret; | ||
483 | |||
484 | switch (nr) { | ||
485 | case 1: | ||
486 | ptemp = data->temp1_auto_point_temp; | ||
487 | reg = AMC6821_REG_LTEMP_FAN_CTRL; | ||
488 | break; | ||
489 | case 2: | ||
490 | ptemp = data->temp2_auto_point_temp; | ||
491 | reg = AMC6821_REG_RTEMP_FAN_CTRL; | ||
492 | break; | ||
493 | default: | ||
494 | dev_dbg(dev, "Unknown attr->nr (%d).\n", nr); | ||
495 | return -EINVAL; | ||
496 | } | ||
497 | |||
498 | data->valid = 0; | ||
499 | mutex_lock(&data->update_lock); | ||
500 | switch (ix) { | ||
501 | case 0: | ||
502 | ptemp[0] = SENSORS_LIMIT(val / 1000, 0, | ||
503 | data->temp1_auto_point_temp[1]); | ||
504 | ptemp[0] = SENSORS_LIMIT(ptemp[0], 0, | ||
505 | data->temp2_auto_point_temp[1]); | ||
506 | ptemp[0] = SENSORS_LIMIT(ptemp[0], 0, 63); | ||
507 | if (i2c_smbus_write_byte_data( | ||
508 | client, | ||
509 | AMC6821_REG_PSV_TEMP, | ||
510 | ptemp[0])) { | ||
511 | dev_err(&client->dev, | ||
512 | "Register write error, aborting.\n"); | ||
513 | count = -EIO; | ||
514 | } | ||
515 | goto EXIT; | ||
516 | break; | ||
517 | case 1: | ||
518 | ptemp[1] = SENSORS_LIMIT( | ||
519 | val / 1000, | ||
520 | (ptemp[0] & 0x7C) + 4, | ||
521 | 124); | ||
522 | ptemp[1] &= 0x7C; | ||
523 | ptemp[2] = SENSORS_LIMIT( | ||
524 | ptemp[2], ptemp[1] + 1, | ||
525 | 255); | ||
526 | break; | ||
527 | case 2: | ||
528 | ptemp[2] = SENSORS_LIMIT( | ||
529 | val / 1000, | ||
530 | ptemp[1]+1, | ||
531 | 255); | ||
532 | break; | ||
533 | default: | ||
534 | dev_dbg(dev, "Unknown attr->index (%d).\n", ix); | ||
535 | count = -EINVAL; | ||
536 | goto EXIT; | ||
537 | } | ||
538 | dpwm = data->pwm1_auto_point_pwm[2] - data->pwm1_auto_point_pwm[1]; | ||
539 | if (set_slope_register(client, reg, dpwm, ptemp)) | ||
540 | count = -EIO; | ||
541 | |||
542 | EXIT: | ||
543 | mutex_unlock(&data->update_lock); | ||
544 | return count; | ||
545 | } | ||
546 | |||
547 | |||
548 | |||
549 | static ssize_t set_pwm1_auto_point_pwm( | ||
550 | struct device *dev, | ||
551 | struct device_attribute *attr, | ||
552 | const char *buf, | ||
553 | size_t count) | ||
554 | { | ||
555 | struct i2c_client *client = to_i2c_client(dev); | ||
556 | struct amc6821_data *data = i2c_get_clientdata(client); | ||
557 | int dpwm; | ||
558 | long val; | ||
559 | int ret = strict_strtol(buf, 10, &val); | ||
560 | if (ret) | ||
561 | return ret; | ||
562 | |||
563 | mutex_lock(&data->update_lock); | ||
564 | data->pwm1_auto_point_pwm[1] = SENSORS_LIMIT(val, 0, 254); | ||
565 | if (i2c_smbus_write_byte_data(client, AMC6821_REG_DCY_LOW_TEMP, | ||
566 | data->pwm1_auto_point_pwm[1])) { | ||
567 | dev_err(&client->dev, "Register write error, aborting.\n"); | ||
568 | count = -EIO; | ||
569 | goto EXIT; | ||
570 | } | ||
571 | dpwm = data->pwm1_auto_point_pwm[2] - data->pwm1_auto_point_pwm[1]; | ||
572 | if (set_slope_register(client, AMC6821_REG_LTEMP_FAN_CTRL, dpwm, | ||
573 | data->temp1_auto_point_temp)) { | ||
574 | count = -EIO; | ||
575 | goto EXIT; | ||
576 | } | ||
577 | if (set_slope_register(client, AMC6821_REG_RTEMP_FAN_CTRL, dpwm, | ||
578 | data->temp2_auto_point_temp)) { | ||
579 | count = -EIO; | ||
580 | goto EXIT; | ||
581 | } | ||
582 | |||
583 | EXIT: | ||
584 | data->valid = 0; | ||
585 | mutex_unlock(&data->update_lock); | ||
586 | return count; | ||
587 | } | ||
588 | |||
589 | static ssize_t get_fan( | ||
590 | struct device *dev, | ||
591 | struct device_attribute *devattr, | ||
592 | char *buf) | ||
593 | { | ||
594 | struct amc6821_data *data = amc6821_update_device(dev); | ||
595 | int ix = to_sensor_dev_attr(devattr)->index; | ||
596 | if (0 == data->fan[ix]) | ||
597 | return sprintf(buf, "0"); | ||
598 | return sprintf(buf, "%d\n", (int)(6000000 / data->fan[ix])); | ||
599 | } | ||
600 | |||
601 | |||
602 | |||
603 | static ssize_t get_fan1_fault( | ||
604 | struct device *dev, | ||
605 | struct device_attribute *devattr, | ||
606 | char *buf) | ||
607 | { | ||
608 | struct amc6821_data *data = amc6821_update_device(dev); | ||
609 | if (data->stat1 & AMC6821_STAT1_FANS) | ||
610 | return sprintf(buf, "1"); | ||
611 | else | ||
612 | return sprintf(buf, "0"); | ||
613 | } | ||
614 | |||
615 | |||
616 | |||
617 | static ssize_t set_fan( | ||
618 | struct device *dev, | ||
619 | struct device_attribute *attr, | ||
620 | const char *buf, size_t count) | ||
621 | { | ||
622 | struct i2c_client *client = to_i2c_client(dev); | ||
623 | struct amc6821_data *data = i2c_get_clientdata(client); | ||
624 | long val; | ||
625 | int ix = to_sensor_dev_attr(attr)->index; | ||
626 | int ret = strict_strtol(buf, 10, &val); | ||
627 | if (ret) | ||
628 | return ret; | ||
629 | val = 1 > val ? 0xFFFF : 6000000/val; | ||
630 | |||
631 | mutex_lock(&data->update_lock); | ||
632 | data->fan[ix] = (u16) SENSORS_LIMIT(val, 1, 0xFFFF); | ||
633 | if (i2c_smbus_write_byte_data(client, fan_reg_low[ix], | ||
634 | data->fan[ix] & 0xFF)) { | ||
635 | dev_err(&client->dev, "Register write error, aborting.\n"); | ||
636 | count = -EIO; | ||
637 | goto EXIT; | ||
638 | } | ||
639 | if (i2c_smbus_write_byte_data(client, | ||
640 | fan_reg_hi[ix], data->fan[ix] >> 8)) { | ||
641 | dev_err(&client->dev, "Register write error, aborting.\n"); | ||
642 | count = -EIO; | ||
643 | } | ||
644 | EXIT: | ||
645 | mutex_unlock(&data->update_lock); | ||
646 | return count; | ||
647 | } | ||
648 | |||
649 | |||
650 | |||
651 | static ssize_t get_fan1_div( | ||
652 | struct device *dev, | ||
653 | struct device_attribute *devattr, | ||
654 | char *buf) | ||
655 | { | ||
656 | struct amc6821_data *data = amc6821_update_device(dev); | ||
657 | return sprintf(buf, "%d\n", data->fan1_div); | ||
658 | } | ||
659 | |||
660 | static ssize_t set_fan1_div( | ||
661 | struct device *dev, | ||
662 | struct device_attribute *attr, | ||
663 | const char *buf, size_t count) | ||
664 | { | ||
665 | struct i2c_client *client = to_i2c_client(dev); | ||
666 | struct amc6821_data *data = i2c_get_clientdata(client); | ||
667 | long val; | ||
668 | int config = strict_strtol(buf, 10, &val); | ||
669 | if (config) | ||
670 | return config; | ||
671 | |||
672 | config = i2c_smbus_read_byte_data(client, AMC6821_REG_CONF4); | ||
673 | if (config < 0) { | ||
674 | dev_err(&client->dev, | ||
675 | "Error reading configuration register, aborting.\n"); | ||
676 | return -EIO; | ||
677 | } | ||
678 | mutex_lock(&data->update_lock); | ||
679 | switch (val) { | ||
680 | case 2: | ||
681 | config &= ~AMC6821_CONF4_PSPR; | ||
682 | data->fan1_div = 2; | ||
683 | break; | ||
684 | case 4: | ||
685 | config |= AMC6821_CONF4_PSPR; | ||
686 | data->fan1_div = 4; | ||
687 | break; | ||
688 | default: | ||
689 | mutex_unlock(&data->update_lock); | ||
690 | count = -EINVAL; | ||
691 | goto EXIT; | ||
692 | } | ||
693 | if (i2c_smbus_write_byte_data(client, AMC6821_REG_CONF4, config)) { | ||
694 | dev_err(&client->dev, | ||
695 | "Configuration register write error, aborting.\n"); | ||
696 | count = -EIO; | ||
697 | } | ||
698 | EXIT: | ||
699 | mutex_unlock(&data->update_lock); | ||
700 | return count; | ||
701 | } | ||
702 | |||
703 | |||
704 | |||
705 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, | ||
706 | get_temp, NULL, IDX_TEMP1_INPUT); | ||
707 | static SENSOR_DEVICE_ATTR(temp1_min, S_IRUGO | S_IWUSR, get_temp, | ||
708 | set_temp, IDX_TEMP1_MIN); | ||
709 | static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, get_temp, | ||
710 | set_temp, IDX_TEMP1_MAX); | ||
711 | static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO | S_IWUSR, get_temp, | ||
712 | set_temp, IDX_TEMP1_CRIT); | ||
713 | static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, | ||
714 | get_temp_alarm, NULL, IDX_TEMP1_MIN); | ||
715 | static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, | ||
716 | get_temp_alarm, NULL, IDX_TEMP1_MAX); | ||
717 | static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, | ||
718 | get_temp_alarm, NULL, IDX_TEMP1_CRIT); | ||
719 | static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO | S_IWUSR, | ||
720 | get_temp, NULL, IDX_TEMP2_INPUT); | ||
721 | static SENSOR_DEVICE_ATTR(temp2_min, S_IRUGO | S_IWUSR, get_temp, | ||
722 | set_temp, IDX_TEMP2_MIN); | ||
723 | static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO | S_IWUSR, get_temp, | ||
724 | set_temp, IDX_TEMP2_MAX); | ||
725 | static SENSOR_DEVICE_ATTR(temp2_crit, S_IRUGO | S_IWUSR, get_temp, | ||
726 | set_temp, IDX_TEMP2_CRIT); | ||
727 | static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, | ||
728 | get_temp2_fault, NULL, 0); | ||
729 | static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, | ||
730 | get_temp_alarm, NULL, IDX_TEMP2_MIN); | ||
731 | static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, | ||
732 | get_temp_alarm, NULL, IDX_TEMP2_MAX); | ||
733 | static SENSOR_DEVICE_ATTR(temp2_crit_alarm, S_IRUGO, | ||
734 | get_temp_alarm, NULL, IDX_TEMP2_CRIT); | ||
735 | static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, get_fan, NULL, IDX_FAN1_INPUT); | ||
736 | static SENSOR_DEVICE_ATTR(fan1_min, S_IRUGO | S_IWUSR, | ||
737 | get_fan, set_fan, IDX_FAN1_MIN); | ||
738 | static SENSOR_DEVICE_ATTR(fan1_max, S_IRUGO | S_IWUSR, | ||
739 | get_fan, set_fan, IDX_FAN1_MAX); | ||
740 | static SENSOR_DEVICE_ATTR(fan1_fault, S_IRUGO, get_fan1_fault, NULL, 0); | ||
741 | static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR, | ||
742 | get_fan1_div, set_fan1_div, 0); | ||
743 | |||
744 | static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, get_pwm1, set_pwm1, 0); | ||
745 | static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, | ||
746 | get_pwm1_enable, set_pwm1_enable, 0); | ||
747 | static SENSOR_DEVICE_ATTR(pwm1_auto_point1_pwm, S_IRUGO, | ||
748 | get_pwm1_auto_point_pwm, NULL, 0); | ||
749 | static SENSOR_DEVICE_ATTR(pwm1_auto_point2_pwm, S_IWUSR | S_IRUGO, | ||
750 | get_pwm1_auto_point_pwm, set_pwm1_auto_point_pwm, 1); | ||
751 | static SENSOR_DEVICE_ATTR(pwm1_auto_point3_pwm, S_IRUGO, | ||
752 | get_pwm1_auto_point_pwm, NULL, 2); | ||
753 | static SENSOR_DEVICE_ATTR(pwm1_auto_channels_temp, S_IRUGO, | ||
754 | get_pwm1_auto_channels_temp, NULL, 0); | ||
755 | static SENSOR_DEVICE_ATTR_2(temp1_auto_point1_temp, S_IRUGO, | ||
756 | get_temp_auto_point_temp, NULL, 1, 0); | ||
757 | static SENSOR_DEVICE_ATTR_2(temp1_auto_point2_temp, S_IWUSR | S_IRUGO, | ||
758 | get_temp_auto_point_temp, set_temp_auto_point_temp, 1, 1); | ||
759 | static SENSOR_DEVICE_ATTR_2(temp1_auto_point3_temp, S_IWUSR | S_IRUGO, | ||
760 | get_temp_auto_point_temp, set_temp_auto_point_temp, 1, 2); | ||
761 | |||
762 | static SENSOR_DEVICE_ATTR_2(temp2_auto_point1_temp, S_IWUSR | S_IRUGO, | ||
763 | get_temp_auto_point_temp, set_temp_auto_point_temp, 2, 0); | ||
764 | static SENSOR_DEVICE_ATTR_2(temp2_auto_point2_temp, S_IWUSR | S_IRUGO, | ||
765 | get_temp_auto_point_temp, set_temp_auto_point_temp, 2, 1); | ||
766 | static SENSOR_DEVICE_ATTR_2(temp2_auto_point3_temp, S_IWUSR | S_IRUGO, | ||
767 | get_temp_auto_point_temp, set_temp_auto_point_temp, 2, 2); | ||
768 | |||
769 | |||
770 | |||
771 | static struct attribute *amc6821_attrs[] = { | ||
772 | &sensor_dev_attr_temp1_input.dev_attr.attr, | ||
773 | &sensor_dev_attr_temp1_min.dev_attr.attr, | ||
774 | &sensor_dev_attr_temp1_max.dev_attr.attr, | ||
775 | &sensor_dev_attr_temp1_crit.dev_attr.attr, | ||
776 | &sensor_dev_attr_temp1_min_alarm.dev_attr.attr, | ||
777 | &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, | ||
778 | &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, | ||
779 | &sensor_dev_attr_temp2_input.dev_attr.attr, | ||
780 | &sensor_dev_attr_temp2_min.dev_attr.attr, | ||
781 | &sensor_dev_attr_temp2_max.dev_attr.attr, | ||
782 | &sensor_dev_attr_temp2_crit.dev_attr.attr, | ||
783 | &sensor_dev_attr_temp2_min_alarm.dev_attr.attr, | ||
784 | &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, | ||
785 | &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr, | ||
786 | &sensor_dev_attr_temp2_fault.dev_attr.attr, | ||
787 | &sensor_dev_attr_fan1_input.dev_attr.attr, | ||
788 | &sensor_dev_attr_fan1_min.dev_attr.attr, | ||
789 | &sensor_dev_attr_fan1_max.dev_attr.attr, | ||
790 | &sensor_dev_attr_fan1_fault.dev_attr.attr, | ||
791 | &sensor_dev_attr_fan1_div.dev_attr.attr, | ||
792 | &sensor_dev_attr_pwm1.dev_attr.attr, | ||
793 | &sensor_dev_attr_pwm1_enable.dev_attr.attr, | ||
794 | &sensor_dev_attr_pwm1_auto_channels_temp.dev_attr.attr, | ||
795 | &sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr, | ||
796 | &sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr, | ||
797 | &sensor_dev_attr_pwm1_auto_point3_pwm.dev_attr.attr, | ||
798 | &sensor_dev_attr_temp1_auto_point1_temp.dev_attr.attr, | ||
799 | &sensor_dev_attr_temp1_auto_point2_temp.dev_attr.attr, | ||
800 | &sensor_dev_attr_temp1_auto_point3_temp.dev_attr.attr, | ||
801 | &sensor_dev_attr_temp2_auto_point1_temp.dev_attr.attr, | ||
802 | &sensor_dev_attr_temp2_auto_point2_temp.dev_attr.attr, | ||
803 | &sensor_dev_attr_temp2_auto_point3_temp.dev_attr.attr, | ||
804 | NULL | ||
805 | }; | ||
806 | |||
807 | static struct attribute_group amc6821_attr_grp = { | ||
808 | .attrs = amc6821_attrs, | ||
809 | }; | ||
810 | |||
811 | |||
812 | |||
813 | /* Return 0 if detection is successful, -ENODEV otherwise */ | ||
814 | static int amc6821_detect( | ||
815 | struct i2c_client *client, | ||
816 | struct i2c_board_info *info) | ||
817 | { | ||
818 | struct i2c_adapter *adapter = client->adapter; | ||
819 | int address = client->addr; | ||
820 | int dev_id, comp_id; | ||
821 | |||
822 | dev_dbg(&adapter->dev, "amc6821_detect called.\n"); | ||
823 | |||
824 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { | ||
825 | dev_dbg(&adapter->dev, | ||
826 | "amc6821: I2C bus doesn't support byte mode, " | ||
827 | "skipping.\n"); | ||
828 | return -ENODEV; | ||
829 | } | ||
830 | |||
831 | dev_id = i2c_smbus_read_byte_data(client, AMC6821_REG_DEV_ID); | ||
832 | comp_id = i2c_smbus_read_byte_data(client, AMC6821_REG_COMP_ID); | ||
833 | if (dev_id != 0x21 || comp_id != 0x49) { | ||
834 | dev_dbg(&adapter->dev, | ||
835 | "amc6821: detection failed at 0x%02x.\n", | ||
836 | address); | ||
837 | return -ENODEV; | ||
838 | } | ||
839 | |||
840 | /* Bit 7 of the address register is ignored, so we can check the | ||
841 | ID registers again */ | ||
842 | dev_id = i2c_smbus_read_byte_data(client, 0x80 | AMC6821_REG_DEV_ID); | ||
843 | comp_id = i2c_smbus_read_byte_data(client, 0x80 | AMC6821_REG_COMP_ID); | ||
844 | if (dev_id != 0x21 || comp_id != 0x49) { | ||
845 | dev_dbg(&adapter->dev, | ||
846 | "amc6821: detection failed at 0x%02x.\n", | ||
847 | address); | ||
848 | return -ENODEV; | ||
849 | } | ||
850 | |||
851 | dev_info(&adapter->dev, "amc6821: chip found at 0x%02x.\n", address); | ||
852 | strlcpy(info->type, "amc6821", I2C_NAME_SIZE); | ||
853 | |||
854 | return 0; | ||
855 | } | ||
856 | |||
857 | static int amc6821_probe( | ||
858 | struct i2c_client *client, | ||
859 | const struct i2c_device_id *id) | ||
860 | { | ||
861 | struct amc6821_data *data; | ||
862 | int err; | ||
863 | |||
864 | data = kzalloc(sizeof(struct amc6821_data), GFP_KERNEL); | ||
865 | if (!data) { | ||
866 | dev_err(&client->dev, "out of memory.\n"); | ||
867 | return -ENOMEM; | ||
868 | } | ||
869 | |||
870 | |||
871 | i2c_set_clientdata(client, data); | ||
872 | mutex_init(&data->update_lock); | ||
873 | |||
874 | /* | ||
875 | * Initialize the amc6821 chip | ||
876 | */ | ||
877 | err = amc6821_init_client(client); | ||
878 | if (err) | ||
879 | goto err_free; | ||
880 | |||
881 | err = sysfs_create_group(&client->dev.kobj, &amc6821_attr_grp); | ||
882 | if (err) | ||
883 | goto err_free; | ||
884 | |||
885 | data->hwmon_dev = hwmon_device_register(&client->dev); | ||
886 | if (!IS_ERR(data->hwmon_dev)) | ||
887 | return 0; | ||
888 | |||
889 | err = PTR_ERR(data->hwmon_dev); | ||
890 | dev_err(&client->dev, "error registering hwmon device.\n"); | ||
891 | sysfs_remove_group(&client->dev.kobj, &amc6821_attr_grp); | ||
892 | err_free: | ||
893 | kfree(data); | ||
894 | return err; | ||
895 | } | ||
896 | |||
897 | static int amc6821_remove(struct i2c_client *client) | ||
898 | { | ||
899 | struct amc6821_data *data = i2c_get_clientdata(client); | ||
900 | |||
901 | hwmon_device_unregister(data->hwmon_dev); | ||
902 | sysfs_remove_group(&client->dev.kobj, &amc6821_attr_grp); | ||
903 | |||
904 | kfree(data); | ||
905 | |||
906 | return 0; | ||
907 | } | ||
908 | |||
909 | |||
910 | static int amc6821_init_client(struct i2c_client *client) | ||
911 | { | ||
912 | int config; | ||
913 | int err = -EIO; | ||
914 | |||
915 | if (init) { | ||
916 | config = i2c_smbus_read_byte_data(client, AMC6821_REG_CONF4); | ||
917 | |||
918 | if (config < 0) { | ||
919 | dev_err(&client->dev, | ||
920 | "Error reading configuration register, aborting.\n"); | ||
921 | return err; | ||
922 | } | ||
923 | |||
924 | config |= AMC6821_CONF4_MODE; | ||
925 | |||
926 | if (i2c_smbus_write_byte_data(client, AMC6821_REG_CONF4, | ||
927 | config)) { | ||
928 | dev_err(&client->dev, | ||
929 | "Configuration register write error, aborting.\n"); | ||
930 | return err; | ||
931 | } | ||
932 | |||
933 | config = i2c_smbus_read_byte_data(client, AMC6821_REG_CONF3); | ||
934 | |||
935 | if (config < 0) { | ||
936 | dev_err(&client->dev, | ||
937 | "Error reading configuration register, aborting.\n"); | ||
938 | return err; | ||
939 | } | ||
940 | |||
941 | dev_info(&client->dev, "Revision %d\n", config & 0x0f); | ||
942 | |||
943 | config &= ~AMC6821_CONF3_THERM_FAN_EN; | ||
944 | |||
945 | if (i2c_smbus_write_byte_data(client, AMC6821_REG_CONF3, | ||
946 | config)) { | ||
947 | dev_err(&client->dev, | ||
948 | "Configuration register write error, aborting.\n"); | ||
949 | return err; | ||
950 | } | ||
951 | |||
952 | config = i2c_smbus_read_byte_data(client, AMC6821_REG_CONF2); | ||
953 | |||
954 | if (config < 0) { | ||
955 | dev_err(&client->dev, | ||
956 | "Error reading configuration register, aborting.\n"); | ||
957 | return err; | ||
958 | } | ||
959 | |||
960 | config &= ~AMC6821_CONF2_RTFIE; | ||
961 | config &= ~AMC6821_CONF2_LTOIE; | ||
962 | config &= ~AMC6821_CONF2_RTOIE; | ||
963 | if (i2c_smbus_write_byte_data(client, | ||
964 | AMC6821_REG_CONF2, config)) { | ||
965 | dev_err(&client->dev, | ||
966 | "Configuration register write error, aborting.\n"); | ||
967 | return err; | ||
968 | } | ||
969 | |||
970 | config = i2c_smbus_read_byte_data(client, AMC6821_REG_CONF1); | ||
971 | |||
972 | if (config < 0) { | ||
973 | dev_err(&client->dev, | ||
974 | "Error reading configuration register, aborting.\n"); | ||
975 | return err; | ||
976 | } | ||
977 | |||
978 | config &= ~AMC6821_CONF1_THERMOVIE; | ||
979 | config &= ~AMC6821_CONF1_FANIE; | ||
980 | config |= AMC6821_CONF1_START; | ||
981 | if (pwminv) | ||
982 | config |= AMC6821_CONF1_PWMINV; | ||
983 | else | ||
984 | config &= ~AMC6821_CONF1_PWMINV; | ||
985 | |||
986 | if (i2c_smbus_write_byte_data( | ||
987 | client, AMC6821_REG_CONF1, config)) { | ||
988 | dev_err(&client->dev, | ||
989 | "Configuration register write error, aborting.\n"); | ||
990 | return err; | ||
991 | } | ||
992 | } | ||
993 | return 0; | ||
994 | } | ||
995 | |||
996 | |||
997 | static struct amc6821_data *amc6821_update_device(struct device *dev) | ||
998 | { | ||
999 | struct i2c_client *client = to_i2c_client(dev); | ||
1000 | struct amc6821_data *data = i2c_get_clientdata(client); | ||
1001 | int timeout = HZ; | ||
1002 | u8 reg; | ||
1003 | int i; | ||
1004 | |||
1005 | mutex_lock(&data->update_lock); | ||
1006 | |||
1007 | if (time_after(jiffies, data->last_updated + timeout) || | ||
1008 | !data->valid) { | ||
1009 | |||
1010 | for (i = 0; i < TEMP_IDX_LEN; i++) | ||
1011 | data->temp[i] = i2c_smbus_read_byte_data(client, | ||
1012 | temp_reg[i]); | ||
1013 | |||
1014 | data->stat1 = i2c_smbus_read_byte_data(client, | ||
1015 | AMC6821_REG_STAT1); | ||
1016 | data->stat2 = i2c_smbus_read_byte_data(client, | ||
1017 | AMC6821_REG_STAT2); | ||
1018 | |||
1019 | data->pwm1 = i2c_smbus_read_byte_data(client, | ||
1020 | AMC6821_REG_DCY); | ||
1021 | for (i = 0; i < FAN1_IDX_LEN; i++) { | ||
1022 | data->fan[i] = i2c_smbus_read_byte_data( | ||
1023 | client, | ||
1024 | fan_reg_low[i]); | ||
1025 | data->fan[i] += i2c_smbus_read_byte_data( | ||
1026 | client, | ||
1027 | fan_reg_hi[i]) << 8; | ||
1028 | } | ||
1029 | data->fan1_div = i2c_smbus_read_byte_data(client, | ||
1030 | AMC6821_REG_CONF4); | ||
1031 | data->fan1_div = data->fan1_div & AMC6821_CONF4_PSPR ? 4 : 2; | ||
1032 | |||
1033 | data->pwm1_auto_point_pwm[0] = 0; | ||
1034 | data->pwm1_auto_point_pwm[2] = 255; | ||
1035 | data->pwm1_auto_point_pwm[1] = i2c_smbus_read_byte_data(client, | ||
1036 | AMC6821_REG_DCY_LOW_TEMP); | ||
1037 | |||
1038 | data->temp1_auto_point_temp[0] = | ||
1039 | i2c_smbus_read_byte_data(client, | ||
1040 | AMC6821_REG_PSV_TEMP); | ||
1041 | data->temp2_auto_point_temp[0] = | ||
1042 | data->temp1_auto_point_temp[0]; | ||
1043 | reg = i2c_smbus_read_byte_data(client, | ||
1044 | AMC6821_REG_LTEMP_FAN_CTRL); | ||
1045 | data->temp1_auto_point_temp[1] = (reg & 0xF8) >> 1; | ||
1046 | reg &= 0x07; | ||
1047 | reg = 0x20 >> reg; | ||
1048 | if (reg > 0) | ||
1049 | data->temp1_auto_point_temp[2] = | ||
1050 | data->temp1_auto_point_temp[1] + | ||
1051 | (data->pwm1_auto_point_pwm[2] - | ||
1052 | data->pwm1_auto_point_pwm[1]) / reg; | ||
1053 | else | ||
1054 | data->temp1_auto_point_temp[2] = 255; | ||
1055 | |||
1056 | reg = i2c_smbus_read_byte_data(client, | ||
1057 | AMC6821_REG_RTEMP_FAN_CTRL); | ||
1058 | data->temp2_auto_point_temp[1] = (reg & 0xF8) >> 1; | ||
1059 | reg &= 0x07; | ||
1060 | reg = 0x20 >> reg; | ||
1061 | if (reg > 0) | ||
1062 | data->temp2_auto_point_temp[2] = | ||
1063 | data->temp2_auto_point_temp[1] + | ||
1064 | (data->pwm1_auto_point_pwm[2] - | ||
1065 | data->pwm1_auto_point_pwm[1]) / reg; | ||
1066 | else | ||
1067 | data->temp2_auto_point_temp[2] = 255; | ||
1068 | |||
1069 | reg = i2c_smbus_read_byte_data(client, AMC6821_REG_CONF1); | ||
1070 | reg = (reg >> 5) & 0x3; | ||
1071 | switch (reg) { | ||
1072 | case 0: /*open loop: software sets pwm1*/ | ||
1073 | data->pwm1_auto_channels_temp = 0; | ||
1074 | data->pwm1_enable = 1; | ||
1075 | break; | ||
1076 | case 2: /*closed loop: remote T (temp2)*/ | ||
1077 | data->pwm1_auto_channels_temp = 2; | ||
1078 | data->pwm1_enable = 2; | ||
1079 | break; | ||
1080 | case 3: /*closed loop: local and remote T (temp2)*/ | ||
1081 | data->pwm1_auto_channels_temp = 3; | ||
1082 | data->pwm1_enable = 3; | ||
1083 | break; | ||
1084 | case 1: /*semi-open loop: software sets rpm, chip controls pwm1, | ||
1085 | *currently not implemented | ||
1086 | */ | ||
1087 | data->pwm1_auto_channels_temp = 0; | ||
1088 | data->pwm1_enable = 0; | ||
1089 | break; | ||
1090 | } | ||
1091 | |||
1092 | data->last_updated = jiffies; | ||
1093 | data->valid = 1; | ||
1094 | } | ||
1095 | mutex_unlock(&data->update_lock); | ||
1096 | return data; | ||
1097 | } | ||
1098 | |||
1099 | |||
1100 | static int __init amc6821_init(void) | ||
1101 | { | ||
1102 | return i2c_add_driver(&amc6821_driver); | ||
1103 | } | ||
1104 | |||
1105 | static void __exit amc6821_exit(void) | ||
1106 | { | ||
1107 | i2c_del_driver(&amc6821_driver); | ||
1108 | } | ||
1109 | |||
1110 | module_init(amc6821_init); | ||
1111 | module_exit(amc6821_exit); | ||
1112 | |||
1113 | |||
1114 | MODULE_LICENSE("GPL"); | ||
1115 | MODULE_AUTHOR("T. Mertelj <tomaz.mertelj@guest.arnes.si>"); | ||
1116 | MODULE_DESCRIPTION("Texas Instruments amc6821 hwmon driver"); | ||
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 85f0e8cd875b..1f552c6e7579 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
@@ -85,7 +85,14 @@ static void mmc_blk_put(struct mmc_blk_data *md) | |||
85 | mutex_lock(&open_lock); | 85 | mutex_lock(&open_lock); |
86 | md->usage--; | 86 | md->usage--; |
87 | if (md->usage == 0) { | 87 | if (md->usage == 0) { |
88 | int devmaj = MAJOR(disk_devt(md->disk)); | ||
88 | int devidx = MINOR(disk_devt(md->disk)) >> MMC_SHIFT; | 89 | int devidx = MINOR(disk_devt(md->disk)) >> MMC_SHIFT; |
90 | |||
91 | if (!devmaj) | ||
92 | devidx = md->disk->first_minor >> MMC_SHIFT; | ||
93 | |||
94 | blk_cleanup_queue(md->queue.queue); | ||
95 | |||
89 | __clear_bit(devidx, dev_use); | 96 | __clear_bit(devidx, dev_use); |
90 | 97 | ||
91 | put_disk(md->disk); | 98 | put_disk(md->disk); |
@@ -613,6 +620,7 @@ static int mmc_blk_probe(struct mmc_card *card) | |||
613 | return 0; | 620 | return 0; |
614 | 621 | ||
615 | out: | 622 | out: |
623 | mmc_cleanup_queue(&md->queue); | ||
616 | mmc_blk_put(md); | 624 | mmc_blk_put(md); |
617 | 625 | ||
618 | return err; | 626 | return err; |
diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index 49e582356c65..c5a7a855f4b1 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c | |||
@@ -90,9 +90,10 @@ static void mmc_request(struct request_queue *q) | |||
90 | struct request *req; | 90 | struct request *req; |
91 | 91 | ||
92 | if (!mq) { | 92 | if (!mq) { |
93 | printk(KERN_ERR "MMC: killing requests for dead queue\n"); | 93 | while ((req = blk_fetch_request(q)) != NULL) { |
94 | while ((req = blk_fetch_request(q)) != NULL) | 94 | req->cmd_flags |= REQ_QUIET; |
95 | __blk_end_request_all(req, -EIO); | 95 | __blk_end_request_all(req, -EIO); |
96 | } | ||
96 | return; | 97 | return; |
97 | } | 98 | } |
98 | 99 | ||
@@ -223,17 +224,18 @@ void mmc_cleanup_queue(struct mmc_queue *mq) | |||
223 | struct request_queue *q = mq->queue; | 224 | struct request_queue *q = mq->queue; |
224 | unsigned long flags; | 225 | unsigned long flags; |
225 | 226 | ||
226 | /* Mark that we should start throwing out stragglers */ | ||
227 | spin_lock_irqsave(q->queue_lock, flags); | ||
228 | q->queuedata = NULL; | ||
229 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
230 | |||
231 | /* Make sure the queue isn't suspended, as that will deadlock */ | 227 | /* Make sure the queue isn't suspended, as that will deadlock */ |
232 | mmc_queue_resume(mq); | 228 | mmc_queue_resume(mq); |
233 | 229 | ||
234 | /* Then terminate our worker thread */ | 230 | /* Then terminate our worker thread */ |
235 | kthread_stop(mq->thread); | 231 | kthread_stop(mq->thread); |
236 | 232 | ||
233 | /* Empty the queue */ | ||
234 | spin_lock_irqsave(q->queue_lock, flags); | ||
235 | q->queuedata = NULL; | ||
236 | blk_start_queue(q); | ||
237 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
238 | |||
237 | if (mq->bounce_sg) | 239 | if (mq->bounce_sg) |
238 | kfree(mq->bounce_sg); | 240 | kfree(mq->bounce_sg); |
239 | mq->bounce_sg = NULL; | 241 | mq->bounce_sg = NULL; |
@@ -245,8 +247,6 @@ void mmc_cleanup_queue(struct mmc_queue *mq) | |||
245 | kfree(mq->bounce_buf); | 247 | kfree(mq->bounce_buf); |
246 | mq->bounce_buf = NULL; | 248 | mq->bounce_buf = NULL; |
247 | 249 | ||
248 | blk_cleanup_queue(mq->queue); | ||
249 | |||
250 | mq->card = NULL; | 250 | mq->card = NULL; |
251 | } | 251 | } |
252 | EXPORT_SYMBOL(mmc_cleanup_queue); | 252 | EXPORT_SYMBOL(mmc_cleanup_queue); |
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index c11189446a1f..0eac6c814904 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c | |||
@@ -207,7 +207,7 @@ static int mmc_read_ext_csd(struct mmc_card *card) | |||
207 | } | 207 | } |
208 | 208 | ||
209 | card->ext_csd.rev = ext_csd[EXT_CSD_REV]; | 209 | card->ext_csd.rev = ext_csd[EXT_CSD_REV]; |
210 | if (card->ext_csd.rev > 3) { | 210 | if (card->ext_csd.rev > 5) { |
211 | printk(KERN_ERR "%s: unrecognised EXT_CSD structure " | 211 | printk(KERN_ERR "%s: unrecognised EXT_CSD structure " |
212 | "version %d\n", mmc_hostname(card->host), | 212 | "version %d\n", mmc_hostname(card->host), |
213 | card->ext_csd.rev); | 213 | card->ext_csd.rev); |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index c8c12325e69b..e9aa814ddd23 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -1096,9 +1096,9 @@ static int cmos_pnp_resume(struct pnp_dev *pnp) | |||
1096 | #define cmos_pnp_resume NULL | 1096 | #define cmos_pnp_resume NULL |
1097 | #endif | 1097 | #endif |
1098 | 1098 | ||
1099 | static void cmos_pnp_shutdown(struct device *pdev) | 1099 | static void cmos_pnp_shutdown(struct pnp_dev *pnp) |
1100 | { | 1100 | { |
1101 | if (system_state == SYSTEM_POWER_OFF && !cmos_poweroff(pdev)) | 1101 | if (system_state == SYSTEM_POWER_OFF && !cmos_poweroff(&pnp->dev)) |
1102 | return; | 1102 | return; |
1103 | 1103 | ||
1104 | cmos_do_shutdown(); | 1104 | cmos_do_shutdown(); |
@@ -1117,15 +1117,12 @@ static struct pnp_driver cmos_pnp_driver = { | |||
1117 | .id_table = rtc_ids, | 1117 | .id_table = rtc_ids, |
1118 | .probe = cmos_pnp_probe, | 1118 | .probe = cmos_pnp_probe, |
1119 | .remove = __exit_p(cmos_pnp_remove), | 1119 | .remove = __exit_p(cmos_pnp_remove), |
1120 | .shutdown = cmos_pnp_shutdown, | ||
1120 | 1121 | ||
1121 | /* flag ensures resume() gets called, and stops syslog spam */ | 1122 | /* flag ensures resume() gets called, and stops syslog spam */ |
1122 | .flags = PNP_DRIVER_RES_DO_NOT_CHANGE, | 1123 | .flags = PNP_DRIVER_RES_DO_NOT_CHANGE, |
1123 | .suspend = cmos_pnp_suspend, | 1124 | .suspend = cmos_pnp_suspend, |
1124 | .resume = cmos_pnp_resume, | 1125 | .resume = cmos_pnp_resume, |
1125 | .driver = { | ||
1126 | .name = (char *)driver_name, | ||
1127 | .shutdown = cmos_pnp_shutdown, | ||
1128 | } | ||
1129 | }; | 1126 | }; |
1130 | 1127 | ||
1131 | #endif /* CONFIG_PNP */ | 1128 | #endif /* CONFIG_PNP */ |
diff --git a/drivers/video/backlight/omap1_bl.c b/drivers/video/backlight/omap1_bl.c index 409ca9643528..a3a7f8938175 100644 --- a/drivers/video/backlight/omap1_bl.c +++ b/drivers/video/backlight/omap1_bl.c | |||
@@ -139,8 +139,6 @@ static int omapbl_probe(struct platform_device *pdev) | |||
139 | if (!pdata) | 139 | if (!pdata) |
140 | return -ENXIO; | 140 | return -ENXIO; |
141 | 141 | ||
142 | omapbl_ops.check_fb = pdata->check_fb; | ||
143 | |||
144 | bl = kzalloc(sizeof(struct omap_backlight), GFP_KERNEL); | 142 | bl = kzalloc(sizeof(struct omap_backlight), GFP_KERNEL); |
145 | if (unlikely(!bl)) | 143 | if (unlikely(!bl)) |
146 | return -ENOMEM; | 144 | return -ENOMEM; |
diff --git a/fs/proc/array.c b/fs/proc/array.c index f560325c444f..13b5d0708175 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -327,94 +327,6 @@ static inline void task_context_switch_counts(struct seq_file *m, | |||
327 | p->nivcsw); | 327 | p->nivcsw); |
328 | } | 328 | } |
329 | 329 | ||
330 | #ifdef CONFIG_MMU | ||
331 | |||
332 | struct stack_stats { | ||
333 | struct vm_area_struct *vma; | ||
334 | unsigned long startpage; | ||
335 | unsigned long usage; | ||
336 | }; | ||
337 | |||
338 | static int stack_usage_pte_range(pmd_t *pmd, unsigned long addr, | ||
339 | unsigned long end, struct mm_walk *walk) | ||
340 | { | ||
341 | struct stack_stats *ss = walk->private; | ||
342 | struct vm_area_struct *vma = ss->vma; | ||
343 | pte_t *pte, ptent; | ||
344 | spinlock_t *ptl; | ||
345 | int ret = 0; | ||
346 | |||
347 | pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); | ||
348 | for (; addr != end; pte++, addr += PAGE_SIZE) { | ||
349 | ptent = *pte; | ||
350 | |||
351 | #ifdef CONFIG_STACK_GROWSUP | ||
352 | if (pte_present(ptent) || is_swap_pte(ptent)) | ||
353 | ss->usage = addr - ss->startpage + PAGE_SIZE; | ||
354 | #else | ||
355 | if (pte_present(ptent) || is_swap_pte(ptent)) { | ||
356 | ss->usage = ss->startpage - addr + PAGE_SIZE; | ||
357 | pte++; | ||
358 | ret = 1; | ||
359 | break; | ||
360 | } | ||
361 | #endif | ||
362 | } | ||
363 | pte_unmap_unlock(pte - 1, ptl); | ||
364 | cond_resched(); | ||
365 | return ret; | ||
366 | } | ||
367 | |||
368 | static inline unsigned long get_stack_usage_in_bytes(struct vm_area_struct *vma, | ||
369 | struct task_struct *task) | ||
370 | { | ||
371 | struct stack_stats ss; | ||
372 | struct mm_walk stack_walk = { | ||
373 | .pmd_entry = stack_usage_pte_range, | ||
374 | .mm = vma->vm_mm, | ||
375 | .private = &ss, | ||
376 | }; | ||
377 | |||
378 | if (!vma->vm_mm || is_vm_hugetlb_page(vma)) | ||
379 | return 0; | ||
380 | |||
381 | ss.vma = vma; | ||
382 | ss.startpage = task->stack_start & PAGE_MASK; | ||
383 | ss.usage = 0; | ||
384 | |||
385 | #ifdef CONFIG_STACK_GROWSUP | ||
386 | walk_page_range(KSTK_ESP(task) & PAGE_MASK, vma->vm_end, | ||
387 | &stack_walk); | ||
388 | #else | ||
389 | walk_page_range(vma->vm_start, (KSTK_ESP(task) & PAGE_MASK) + PAGE_SIZE, | ||
390 | &stack_walk); | ||
391 | #endif | ||
392 | return ss.usage; | ||
393 | } | ||
394 | |||
395 | static inline void task_show_stack_usage(struct seq_file *m, | ||
396 | struct task_struct *task) | ||
397 | { | ||
398 | struct vm_area_struct *vma; | ||
399 | struct mm_struct *mm = get_task_mm(task); | ||
400 | |||
401 | if (mm) { | ||
402 | down_read(&mm->mmap_sem); | ||
403 | vma = find_vma(mm, task->stack_start); | ||
404 | if (vma) | ||
405 | seq_printf(m, "Stack usage:\t%lu kB\n", | ||
406 | get_stack_usage_in_bytes(vma, task) >> 10); | ||
407 | |||
408 | up_read(&mm->mmap_sem); | ||
409 | mmput(mm); | ||
410 | } | ||
411 | } | ||
412 | #else | ||
413 | static void task_show_stack_usage(struct seq_file *m, struct task_struct *task) | ||
414 | { | ||
415 | } | ||
416 | #endif /* CONFIG_MMU */ | ||
417 | |||
418 | static void task_cpus_allowed(struct seq_file *m, struct task_struct *task) | 330 | static void task_cpus_allowed(struct seq_file *m, struct task_struct *task) |
419 | { | 331 | { |
420 | seq_printf(m, "Cpus_allowed:\t"); | 332 | seq_printf(m, "Cpus_allowed:\t"); |
@@ -445,7 +357,6 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, | |||
445 | task_show_regs(m, task); | 357 | task_show_regs(m, task); |
446 | #endif | 358 | #endif |
447 | task_context_switch_counts(m, task); | 359 | task_context_switch_counts(m, task); |
448 | task_show_stack_usage(m, task); | ||
449 | return 0; | 360 | return 0; |
450 | } | 361 | } |
451 | 362 | ||
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 47c03f4336b8..f277c4a111cb 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -361,12 +361,11 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, | |||
361 | if (!pte_present(ptent)) | 361 | if (!pte_present(ptent)) |
362 | continue; | 362 | continue; |
363 | 363 | ||
364 | mss->resident += PAGE_SIZE; | ||
365 | |||
366 | page = vm_normal_page(vma, addr, ptent); | 364 | page = vm_normal_page(vma, addr, ptent); |
367 | if (!page) | 365 | if (!page) |
368 | continue; | 366 | continue; |
369 | 367 | ||
368 | mss->resident += PAGE_SIZE; | ||
370 | /* Accumulate the size in pages that have been accessed. */ | 369 | /* Accumulate the size in pages that have been accessed. */ |
371 | if (pte_young(ptent) || PageReferenced(page)) | 370 | if (pte_young(ptent) || PageReferenced(page)) |
372 | mss->referenced += PAGE_SIZE; | 371 | mss->referenced += PAGE_SIZE; |
diff --git a/include/linux/decompress/unlzo.h b/include/linux/decompress/unlzo.h new file mode 100644 index 000000000000..987229752519 --- /dev/null +++ b/include/linux/decompress/unlzo.h | |||
@@ -0,0 +1,10 @@ | |||
1 | #ifndef DECOMPRESS_UNLZO_H | ||
2 | #define DECOMPRESS_UNLZO_H | ||
3 | |||
4 | int unlzo(unsigned char *inbuf, int len, | ||
5 | int(*fill)(void*, unsigned int), | ||
6 | int(*flush)(void*, unsigned int), | ||
7 | unsigned char *output, | ||
8 | int *pos, | ||
9 | void(*error)(char *x)); | ||
10 | #endif | ||
diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 211ff4497269..ab2cc20e21a5 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h | |||
@@ -46,7 +46,7 @@ void kmap_flush_unused(void); | |||
46 | 46 | ||
47 | static inline unsigned int nr_free_highpages(void) { return 0; } | 47 | static inline unsigned int nr_free_highpages(void) { return 0; } |
48 | 48 | ||
49 | #define totalhigh_pages 0 | 49 | #define totalhigh_pages 0UL |
50 | 50 | ||
51 | #ifndef ARCH_HAS_KMAP | 51 | #ifndef ARCH_HAS_KMAP |
52 | static inline void *kmap(struct page *page) | 52 | static inline void *kmap(struct page *page) |
diff --git a/include/linux/i2c/adp5588.h b/include/linux/i2c/adp5588.h index fc5db826b48e..02c9af374741 100644 --- a/include/linux/i2c/adp5588.h +++ b/include/linux/i2c/adp5588.h | |||
@@ -89,4 +89,16 @@ struct adp5588_kpad_platform_data { | |||
89 | unsigned short unlock_key2; /* Unlock Key 2 */ | 89 | unsigned short unlock_key2; /* Unlock Key 2 */ |
90 | }; | 90 | }; |
91 | 91 | ||
92 | struct adp5588_gpio_platform_data { | ||
93 | unsigned gpio_start; /* GPIO Chip base # */ | ||
94 | unsigned pullup_dis_mask; /* Pull-Up Disable Mask */ | ||
95 | int (*setup)(struct i2c_client *client, | ||
96 | int gpio, unsigned ngpio, | ||
97 | void *context); | ||
98 | int (*teardown)(struct i2c_client *client, | ||
99 | int gpio, unsigned ngpio, | ||
100 | void *context); | ||
101 | void *context; | ||
102 | }; | ||
103 | |||
92 | #endif | 104 | #endif |
diff --git a/include/linux/kmemcheck.h b/include/linux/kmemcheck.h index e880d4cf9e22..08d7dc4ddf40 100644 --- a/include/linux/kmemcheck.h +++ b/include/linux/kmemcheck.h | |||
@@ -36,6 +36,56 @@ int kmemcheck_hide_addr(unsigned long address); | |||
36 | 36 | ||
37 | bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size); | 37 | bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size); |
38 | 38 | ||
39 | /* | ||
40 | * Bitfield annotations | ||
41 | * | ||
42 | * How to use: If you have a struct using bitfields, for example | ||
43 | * | ||
44 | * struct a { | ||
45 | * int x:8, y:8; | ||
46 | * }; | ||
47 | * | ||
48 | * then this should be rewritten as | ||
49 | * | ||
50 | * struct a { | ||
51 | * kmemcheck_bitfield_begin(flags); | ||
52 | * int x:8, y:8; | ||
53 | * kmemcheck_bitfield_end(flags); | ||
54 | * }; | ||
55 | * | ||
56 | * Now the "flags_begin" and "flags_end" members may be used to refer to the | ||
57 | * beginning and end, respectively, of the bitfield (and things like | ||
58 | * &x.flags_begin is allowed). As soon as the struct is allocated, the bit- | ||
59 | * fields should be annotated: | ||
60 | * | ||
61 | * struct a *a = kmalloc(sizeof(struct a), GFP_KERNEL); | ||
62 | * kmemcheck_annotate_bitfield(a, flags); | ||
63 | */ | ||
64 | #define kmemcheck_bitfield_begin(name) \ | ||
65 | int name##_begin[0]; | ||
66 | |||
67 | #define kmemcheck_bitfield_end(name) \ | ||
68 | int name##_end[0]; | ||
69 | |||
70 | #define kmemcheck_annotate_bitfield(ptr, name) \ | ||
71 | do { \ | ||
72 | int _n; \ | ||
73 | \ | ||
74 | if (!ptr) \ | ||
75 | break; \ | ||
76 | \ | ||
77 | _n = (long) &((ptr)->name##_end) \ | ||
78 | - (long) &((ptr)->name##_begin); \ | ||
79 | MAYBE_BUILD_BUG_ON(_n < 0); \ | ||
80 | \ | ||
81 | kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \ | ||
82 | } while (0) | ||
83 | |||
84 | #define kmemcheck_annotate_variable(var) \ | ||
85 | do { \ | ||
86 | kmemcheck_mark_initialized(&(var), sizeof(var)); \ | ||
87 | } while (0) \ | ||
88 | |||
39 | #else | 89 | #else |
40 | #define kmemcheck_enabled 0 | 90 | #define kmemcheck_enabled 0 |
41 | 91 | ||
@@ -106,60 +156,16 @@ static inline bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size) | |||
106 | return true; | 156 | return true; |
107 | } | 157 | } |
108 | 158 | ||
109 | #endif /* CONFIG_KMEMCHECK */ | 159 | #define kmemcheck_bitfield_begin(name) |
110 | 160 | #define kmemcheck_bitfield_end(name) | |
111 | /* | 161 | #define kmemcheck_annotate_bitfield(ptr, name) \ |
112 | * Bitfield annotations | 162 | do { \ |
113 | * | 163 | } while (0) |
114 | * How to use: If you have a struct using bitfields, for example | ||
115 | * | ||
116 | * struct a { | ||
117 | * int x:8, y:8; | ||
118 | * }; | ||
119 | * | ||
120 | * then this should be rewritten as | ||
121 | * | ||
122 | * struct a { | ||
123 | * kmemcheck_bitfield_begin(flags); | ||
124 | * int x:8, y:8; | ||
125 | * kmemcheck_bitfield_end(flags); | ||
126 | * }; | ||
127 | * | ||
128 | * Now the "flags_begin" and "flags_end" members may be used to refer to the | ||
129 | * beginning and end, respectively, of the bitfield (and things like | ||
130 | * &x.flags_begin is allowed). As soon as the struct is allocated, the bit- | ||
131 | * fields should be annotated: | ||
132 | * | ||
133 | * struct a *a = kmalloc(sizeof(struct a), GFP_KERNEL); | ||
134 | * kmemcheck_annotate_bitfield(a, flags); | ||
135 | * | ||
136 | * Note: We provide the same definitions for both kmemcheck and non- | ||
137 | * kmemcheck kernels. This makes it harder to introduce accidental errors. It | ||
138 | * is also allowed to pass NULL pointers to kmemcheck_annotate_bitfield(). | ||
139 | */ | ||
140 | #define kmemcheck_bitfield_begin(name) \ | ||
141 | int name##_begin[0]; | ||
142 | |||
143 | #define kmemcheck_bitfield_end(name) \ | ||
144 | int name##_end[0]; | ||
145 | 164 | ||
146 | #define kmemcheck_annotate_bitfield(ptr, name) \ | 165 | #define kmemcheck_annotate_variable(var) \ |
147 | do { \ | 166 | do { \ |
148 | int _n; \ | ||
149 | \ | ||
150 | if (!ptr) \ | ||
151 | break; \ | ||
152 | \ | ||
153 | _n = (long) &((ptr)->name##_end) \ | ||
154 | - (long) &((ptr)->name##_begin); \ | ||
155 | MAYBE_BUILD_BUG_ON(_n < 0); \ | ||
156 | \ | ||
157 | kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \ | ||
158 | } while (0) | 167 | } while (0) |
159 | 168 | ||
160 | #define kmemcheck_annotate_variable(var) \ | 169 | #endif /* CONFIG_KMEMCHECK */ |
161 | do { \ | ||
162 | kmemcheck_mark_initialized(&(var), sizeof(var)); \ | ||
163 | } while (0) \ | ||
164 | 170 | ||
165 | #endif /* LINUX_KMEMCHECK_H */ | 171 | #endif /* LINUX_KMEMCHECK_H */ |
diff --git a/include/linux/poison.h b/include/linux/poison.h index 7fc194aef8c2..2110a81c5e2a 100644 --- a/include/linux/poison.h +++ b/include/linux/poison.h | |||
@@ -2,13 +2,25 @@ | |||
2 | #define _LINUX_POISON_H | 2 | #define _LINUX_POISON_H |
3 | 3 | ||
4 | /********** include/linux/list.h **********/ | 4 | /********** include/linux/list.h **********/ |
5 | |||
6 | /* | ||
7 | * Architectures might want to move the poison pointer offset | ||
8 | * into some well-recognized area such as 0xdead000000000000, | ||
9 | * that is also not mappable by user-space exploits: | ||
10 | */ | ||
11 | #ifdef CONFIG_ILLEGAL_POINTER_VALUE | ||
12 | # define POISON_POINTER_DELTA _AC(CONFIG_ILLEGAL_POINTER_VALUE, UL) | ||
13 | #else | ||
14 | # define POISON_POINTER_DELTA 0 | ||
15 | #endif | ||
16 | |||
5 | /* | 17 | /* |
6 | * These are non-NULL pointers that will result in page faults | 18 | * These are non-NULL pointers that will result in page faults |
7 | * under normal circumstances, used to verify that nobody uses | 19 | * under normal circumstances, used to verify that nobody uses |
8 | * non-initialized list entries. | 20 | * non-initialized list entries. |
9 | */ | 21 | */ |
10 | #define LIST_POISON1 ((void *) 0x00100100) | 22 | #define LIST_POISON1 ((void *) 0x00100100 + POISON_POINTER_DELTA) |
11 | #define LIST_POISON2 ((void *) 0x00200200) | 23 | #define LIST_POISON2 ((void *) 0x00200200 + POISON_POINTER_DELTA) |
12 | 24 | ||
13 | /********** include/linux/timer.h **********/ | 25 | /********** include/linux/timer.h **********/ |
14 | /* | 26 | /* |
diff --git a/init/Kconfig b/init/Kconfig index a23da9f01803..d95ca7cd5d45 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -115,10 +115,13 @@ config HAVE_KERNEL_BZIP2 | |||
115 | config HAVE_KERNEL_LZMA | 115 | config HAVE_KERNEL_LZMA |
116 | bool | 116 | bool |
117 | 117 | ||
118 | config HAVE_KERNEL_LZO | ||
119 | bool | ||
120 | |||
118 | choice | 121 | choice |
119 | prompt "Kernel compression mode" | 122 | prompt "Kernel compression mode" |
120 | default KERNEL_GZIP | 123 | default KERNEL_GZIP |
121 | depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA | 124 | depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA || HAVE_KERNEL_LZO |
122 | help | 125 | help |
123 | The linux kernel is a kind of self-extracting executable. | 126 | The linux kernel is a kind of self-extracting executable. |
124 | Several compression algorithms are available, which differ | 127 | Several compression algorithms are available, which differ |
@@ -141,9 +144,8 @@ config KERNEL_GZIP | |||
141 | bool "Gzip" | 144 | bool "Gzip" |
142 | depends on HAVE_KERNEL_GZIP | 145 | depends on HAVE_KERNEL_GZIP |
143 | help | 146 | help |
144 | The old and tried gzip compression. Its compression ratio is | 147 | The old and tried gzip compression. It provides a good balance |
145 | the poorest among the 3 choices; however its speed (both | 148 | between compression ratio and decompression speed. |
146 | compression and decompression) is the fastest. | ||
147 | 149 | ||
148 | config KERNEL_BZIP2 | 150 | config KERNEL_BZIP2 |
149 | bool "Bzip2" | 151 | bool "Bzip2" |
@@ -164,6 +166,14 @@ config KERNEL_LZMA | |||
164 | two. Compression is slowest. The kernel size is about 33% | 166 | two. Compression is slowest. The kernel size is about 33% |
165 | smaller with LZMA in comparison to gzip. | 167 | smaller with LZMA in comparison to gzip. |
166 | 168 | ||
169 | config KERNEL_LZO | ||
170 | bool "LZO" | ||
171 | depends on HAVE_KERNEL_LZO | ||
172 | help | ||
173 | Its compression ratio is the poorest among the 4. The kernel | ||
174 | size is about about 10% bigger than gzip; however its speed | ||
175 | (both compression and decompression) is the fastest. | ||
176 | |||
167 | endchoice | 177 | endchoice |
168 | 178 | ||
169 | config SWAP | 179 | config SWAP |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 0249f4be9b5c..1fbcc748044a 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -2468,7 +2468,6 @@ static struct cgroup_pidlist *cgroup_pidlist_find(struct cgroup *cgrp, | |||
2468 | /* make sure l doesn't vanish out from under us */ | 2468 | /* make sure l doesn't vanish out from under us */ |
2469 | down_write(&l->mutex); | 2469 | down_write(&l->mutex); |
2470 | mutex_unlock(&cgrp->pidlist_mutex); | 2470 | mutex_unlock(&cgrp->pidlist_mutex); |
2471 | l->use_count++; | ||
2472 | return l; | 2471 | return l; |
2473 | } | 2472 | } |
2474 | } | 2473 | } |
diff --git a/kernel/kmod.c b/kernel/kmod.c index 25b103190364..bf0e231d9702 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c | |||
@@ -520,13 +520,15 @@ int call_usermodehelper_pipe(char *path, char **argv, char **envp, | |||
520 | return -ENOMEM; | 520 | return -ENOMEM; |
521 | 521 | ||
522 | ret = call_usermodehelper_stdinpipe(sub_info, filp); | 522 | ret = call_usermodehelper_stdinpipe(sub_info, filp); |
523 | if (ret < 0) | 523 | if (ret < 0) { |
524 | goto out; | 524 | call_usermodehelper_freeinfo(sub_info); |
525 | return ret; | ||
526 | } | ||
525 | 527 | ||
526 | return call_usermodehelper_exec(sub_info, UMH_WAIT_EXEC); | 528 | ret = call_usermodehelper_exec(sub_info, UMH_WAIT_EXEC); |
529 | if (ret < 0) /* Failed to execute helper, close pipe */ | ||
530 | filp_close(*filp, NULL); | ||
527 | 531 | ||
528 | out: | ||
529 | call_usermodehelper_freeinfo(sub_info); | ||
530 | return ret; | 532 | return ret; |
531 | } | 533 | } |
532 | EXPORT_SYMBOL(call_usermodehelper_pipe); | 534 | EXPORT_SYMBOL(call_usermodehelper_pipe); |
diff --git a/kernel/signal.c b/kernel/signal.c index d09692b40376..934ae5e687b9 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -979,7 +979,8 @@ static void print_fatal_signal(struct pt_regs *regs, int signr) | |||
979 | for (i = 0; i < 16; i++) { | 979 | for (i = 0; i < 16; i++) { |
980 | unsigned char insn; | 980 | unsigned char insn; |
981 | 981 | ||
982 | __get_user(insn, (unsigned char *)(regs->ip + i)); | 982 | if (get_user(insn, (unsigned char *)(regs->ip + i))) |
983 | break; | ||
983 | printk("%02x ", insn); | 984 | printk("%02x ", insn); |
984 | } | 985 | } |
985 | } | 986 | } |
diff --git a/lib/Kconfig b/lib/Kconfig index 1cfe51628e1b..97b136ff117e 100644 --- a/lib/Kconfig +++ b/lib/Kconfig | |||
@@ -117,6 +117,10 @@ config DECOMPRESS_BZIP2 | |||
117 | config DECOMPRESS_LZMA | 117 | config DECOMPRESS_LZMA |
118 | tristate | 118 | tristate |
119 | 119 | ||
120 | config DECOMPRESS_LZO | ||
121 | select LZO_DECOMPRESS | ||
122 | tristate | ||
123 | |||
120 | # | 124 | # |
121 | # Generic allocator support is selected if needed | 125 | # Generic allocator support is selected if needed |
122 | # | 126 | # |
diff --git a/lib/Makefile b/lib/Makefile index 347ad8db29d3..911b25aed1e7 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -69,6 +69,7 @@ obj-$(CONFIG_LZO_DECOMPRESS) += lzo/ | |||
69 | lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o | 69 | lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o |
70 | lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o | 70 | lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o |
71 | lib-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o | 71 | lib-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o |
72 | lib-$(CONFIG_DECOMPRESS_LZO) += decompress_unlzo.o | ||
72 | 73 | ||
73 | obj-$(CONFIG_TEXTSEARCH) += textsearch.o | 74 | obj-$(CONFIG_TEXTSEARCH) += textsearch.o |
74 | obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o | 75 | obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o |
diff --git a/lib/decompress.c b/lib/decompress.c index d2842f571674..a7606815541f 100644 --- a/lib/decompress.c +++ b/lib/decompress.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/decompress/bunzip2.h> | 9 | #include <linux/decompress/bunzip2.h> |
10 | #include <linux/decompress/unlzma.h> | 10 | #include <linux/decompress/unlzma.h> |
11 | #include <linux/decompress/inflate.h> | 11 | #include <linux/decompress/inflate.h> |
12 | #include <linux/decompress/unlzo.h> | ||
12 | 13 | ||
13 | #include <linux/types.h> | 14 | #include <linux/types.h> |
14 | #include <linux/string.h> | 15 | #include <linux/string.h> |
@@ -22,6 +23,9 @@ | |||
22 | #ifndef CONFIG_DECOMPRESS_LZMA | 23 | #ifndef CONFIG_DECOMPRESS_LZMA |
23 | # define unlzma NULL | 24 | # define unlzma NULL |
24 | #endif | 25 | #endif |
26 | #ifndef CONFIG_DECOMPRESS_LZO | ||
27 | # define unlzo NULL | ||
28 | #endif | ||
25 | 29 | ||
26 | static const struct compress_format { | 30 | static const struct compress_format { |
27 | unsigned char magic[2]; | 31 | unsigned char magic[2]; |
@@ -32,6 +36,7 @@ static const struct compress_format { | |||
32 | { {037, 0236}, "gzip", gunzip }, | 36 | { {037, 0236}, "gzip", gunzip }, |
33 | { {0x42, 0x5a}, "bzip2", bunzip2 }, | 37 | { {0x42, 0x5a}, "bzip2", bunzip2 }, |
34 | { {0x5d, 0x00}, "lzma", unlzma }, | 38 | { {0x5d, 0x00}, "lzma", unlzma }, |
39 | { {0x89, 0x4c}, "lzo", unlzo }, | ||
35 | { {0, 0}, NULL, NULL } | 40 | { {0, 0}, NULL, NULL } |
36 | }; | 41 | }; |
37 | 42 | ||
diff --git a/lib/decompress_unlzo.c b/lib/decompress_unlzo.c new file mode 100644 index 000000000000..db521f45626e --- /dev/null +++ b/lib/decompress_unlzo.c | |||
@@ -0,0 +1,209 @@ | |||
1 | /* | ||
2 | * LZO decompressor for the Linux kernel. Code borrowed from the lzo | ||
3 | * implementation by Markus Franz Xaver Johannes Oberhumer. | ||
4 | * | ||
5 | * Linux kernel adaptation: | ||
6 | * Copyright (C) 2009 | ||
7 | * Albin Tonnerre, Free Electrons <albin.tonnerre@free-electrons.com> | ||
8 | * | ||
9 | * Original code: | ||
10 | * Copyright (C) 1996-2005 Markus Franz Xaver Johannes Oberhumer | ||
11 | * All Rights Reserved. | ||
12 | * | ||
13 | * lzop and the LZO library are free software; you can redistribute them | ||
14 | * and/or modify them under the terms of the GNU General Public License as | ||
15 | * published by the Free Software Foundation; either version 2 of | ||
16 | * the License, or (at your option) any later version. | ||
17 | * | ||
18 | * This program is distributed in the hope that it will be useful, | ||
19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
21 | * GNU General Public License for more details. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License | ||
24 | * along with this program; see the file COPYING. | ||
25 | * If not, write to the Free Software Foundation, Inc., | ||
26 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
27 | * | ||
28 | * Markus F.X.J. Oberhumer | ||
29 | * <markus@oberhumer.com> | ||
30 | * http://www.oberhumer.com/opensource/lzop/ | ||
31 | */ | ||
32 | |||
33 | #ifdef STATIC | ||
34 | #include "lzo/lzo1x_decompress.c" | ||
35 | #else | ||
36 | #include <linux/slab.h> | ||
37 | #include <linux/decompress/unlzo.h> | ||
38 | #endif | ||
39 | |||
40 | #include <linux/types.h> | ||
41 | #include <linux/lzo.h> | ||
42 | #include <linux/decompress/mm.h> | ||
43 | |||
44 | #include <linux/compiler.h> | ||
45 | #include <asm/unaligned.h> | ||
46 | |||
47 | static const unsigned char lzop_magic[] = { | ||
48 | 0x89, 0x4c, 0x5a, 0x4f, 0x00, 0x0d, 0x0a, 0x1a, 0x0a }; | ||
49 | |||
50 | #define LZO_BLOCK_SIZE (256*1024l) | ||
51 | #define HEADER_HAS_FILTER 0x00000800L | ||
52 | |||
53 | STATIC inline int INIT parse_header(u8 *input, u8 *skip) | ||
54 | { | ||
55 | int l; | ||
56 | u8 *parse = input; | ||
57 | u8 level = 0; | ||
58 | u16 version; | ||
59 | |||
60 | /* read magic: 9 first bits */ | ||
61 | for (l = 0; l < 9; l++) { | ||
62 | if (*parse++ != lzop_magic[l]) | ||
63 | return 0; | ||
64 | } | ||
65 | /* get version (2bytes), skip library version (2), | ||
66 | * 'need to be extracted' version (2) and | ||
67 | * method (1) */ | ||
68 | version = get_unaligned_be16(parse); | ||
69 | parse += 7; | ||
70 | if (version >= 0x0940) | ||
71 | level = *parse++; | ||
72 | if (get_unaligned_be32(parse) & HEADER_HAS_FILTER) | ||
73 | parse += 8; /* flags + filter info */ | ||
74 | else | ||
75 | parse += 4; /* flags */ | ||
76 | |||
77 | /* skip mode and mtime_low */ | ||
78 | parse += 8; | ||
79 | if (version >= 0x0940) | ||
80 | parse += 4; /* skip mtime_high */ | ||
81 | |||
82 | l = *parse++; | ||
83 | /* don't care about the file name, and skip checksum */ | ||
84 | parse += l + 4; | ||
85 | |||
86 | *skip = parse - input; | ||
87 | return 1; | ||
88 | } | ||
89 | |||
90 | STATIC inline int INIT unlzo(u8 *input, int in_len, | ||
91 | int (*fill) (void *, unsigned int), | ||
92 | int (*flush) (void *, unsigned int), | ||
93 | u8 *output, int *posp, | ||
94 | void (*error_fn) (char *x)) | ||
95 | { | ||
96 | u8 skip = 0, r = 0; | ||
97 | u32 src_len, dst_len; | ||
98 | size_t tmp; | ||
99 | u8 *in_buf, *in_buf_save, *out_buf; | ||
100 | int obytes_processed = 0; | ||
101 | |||
102 | set_error_fn(error_fn); | ||
103 | |||
104 | if (output) { | ||
105 | out_buf = output; | ||
106 | } else if (!flush) { | ||
107 | error("NULL output pointer and no flush function provided"); | ||
108 | goto exit; | ||
109 | } else { | ||
110 | out_buf = malloc(LZO_BLOCK_SIZE); | ||
111 | if (!out_buf) { | ||
112 | error("Could not allocate output buffer"); | ||
113 | goto exit; | ||
114 | } | ||
115 | } | ||
116 | |||
117 | if (input && fill) { | ||
118 | error("Both input pointer and fill function provided, don't know what to do"); | ||
119 | goto exit_1; | ||
120 | } else if (input) { | ||
121 | in_buf = input; | ||
122 | } else if (!fill || !posp) { | ||
123 | error("NULL input pointer and missing position pointer or fill function"); | ||
124 | goto exit_1; | ||
125 | } else { | ||
126 | in_buf = malloc(lzo1x_worst_compress(LZO_BLOCK_SIZE)); | ||
127 | if (!in_buf) { | ||
128 | error("Could not allocate input buffer"); | ||
129 | goto exit_1; | ||
130 | } | ||
131 | } | ||
132 | in_buf_save = in_buf; | ||
133 | |||
134 | if (posp) | ||
135 | *posp = 0; | ||
136 | |||
137 | if (fill) | ||
138 | fill(in_buf, lzo1x_worst_compress(LZO_BLOCK_SIZE)); | ||
139 | |||
140 | if (!parse_header(input, &skip)) { | ||
141 | error("invalid header"); | ||
142 | goto exit_2; | ||
143 | } | ||
144 | in_buf += skip; | ||
145 | |||
146 | if (posp) | ||
147 | *posp = skip; | ||
148 | |||
149 | for (;;) { | ||
150 | /* read uncompressed block size */ | ||
151 | dst_len = get_unaligned_be32(in_buf); | ||
152 | in_buf += 4; | ||
153 | |||
154 | /* exit if last block */ | ||
155 | if (dst_len == 0) { | ||
156 | if (posp) | ||
157 | *posp += 4; | ||
158 | break; | ||
159 | } | ||
160 | |||
161 | if (dst_len > LZO_BLOCK_SIZE) { | ||
162 | error("dest len longer than block size"); | ||
163 | goto exit_2; | ||
164 | } | ||
165 | |||
166 | /* read compressed block size, and skip block checksum info */ | ||
167 | src_len = get_unaligned_be32(in_buf); | ||
168 | in_buf += 8; | ||
169 | |||
170 | if (src_len <= 0 || src_len > dst_len) { | ||
171 | error("file corrupted"); | ||
172 | goto exit_2; | ||
173 | } | ||
174 | |||
175 | /* decompress */ | ||
176 | tmp = dst_len; | ||
177 | r = lzo1x_decompress_safe((u8 *) in_buf, src_len, | ||
178 | out_buf, &tmp); | ||
179 | |||
180 | if (r != LZO_E_OK || dst_len != tmp) { | ||
181 | error("Compressed data violation"); | ||
182 | goto exit_2; | ||
183 | } | ||
184 | |||
185 | obytes_processed += dst_len; | ||
186 | if (flush) | ||
187 | flush(out_buf, dst_len); | ||
188 | if (output) | ||
189 | out_buf += dst_len; | ||
190 | if (posp) | ||
191 | *posp += src_len + 12; | ||
192 | if (fill) { | ||
193 | in_buf = in_buf_save; | ||
194 | fill(in_buf, lzo1x_worst_compress(LZO_BLOCK_SIZE)); | ||
195 | } else | ||
196 | in_buf += src_len; | ||
197 | } | ||
198 | |||
199 | exit_2: | ||
200 | if (!input) | ||
201 | free(in_buf); | ||
202 | exit_1: | ||
203 | if (!output) | ||
204 | free(out_buf); | ||
205 | exit: | ||
206 | return obytes_processed; | ||
207 | } | ||
208 | |||
209 | #define decompress unlzo | ||
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index cf906201aecf..7d2f0b33e5a8 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
@@ -913,6 +913,9 @@ static void check_sync(struct device *dev, | |||
913 | ref->size); | 913 | ref->size); |
914 | } | 914 | } |
915 | 915 | ||
916 | if (entry->direction == DMA_BIDIRECTIONAL) | ||
917 | goto out; | ||
918 | |||
916 | if (ref->direction != entry->direction) { | 919 | if (ref->direction != entry->direction) { |
917 | err_printk(dev, entry, "DMA-API: device driver syncs " | 920 | err_printk(dev, entry, "DMA-API: device driver syncs " |
918 | "DMA memory with different direction " | 921 | "DMA memory with different direction " |
@@ -923,9 +926,6 @@ static void check_sync(struct device *dev, | |||
923 | dir2name[ref->direction]); | 926 | dir2name[ref->direction]); |
924 | } | 927 | } |
925 | 928 | ||
926 | if (entry->direction == DMA_BIDIRECTIONAL) | ||
927 | goto out; | ||
928 | |||
929 | if (to_cpu && !(entry->direction == DMA_FROM_DEVICE) && | 929 | if (to_cpu && !(entry->direction == DMA_FROM_DEVICE) && |
930 | !(ref->direction == DMA_TO_DEVICE)) | 930 | !(ref->direction == DMA_TO_DEVICE)) |
931 | err_printk(dev, entry, "DMA-API: device driver syncs " | 931 | err_printk(dev, entry, "DMA-API: device driver syncs " |
@@ -948,7 +948,6 @@ static void check_sync(struct device *dev, | |||
948 | 948 | ||
949 | out: | 949 | out: |
950 | put_hash_bucket(bucket, &flags); | 950 | put_hash_bucket(bucket, &flags); |
951 | |||
952 | } | 951 | } |
953 | 952 | ||
954 | void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, | 953 | void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, |
diff --git a/lib/lzo/lzo1x_decompress.c b/lib/lzo/lzo1x_decompress.c index 5dc6b29c1575..f2fd09850223 100644 --- a/lib/lzo/lzo1x_decompress.c +++ b/lib/lzo/lzo1x_decompress.c | |||
@@ -11,11 +11,13 @@ | |||
11 | * Richard Purdie <rpurdie@openedhand.com> | 11 | * Richard Purdie <rpurdie@openedhand.com> |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #ifndef STATIC | ||
14 | #include <linux/module.h> | 15 | #include <linux/module.h> |
15 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
16 | #include <linux/lzo.h> | 17 | #endif |
17 | #include <asm/byteorder.h> | 18 | |
18 | #include <asm/unaligned.h> | 19 | #include <asm/unaligned.h> |
20 | #include <linux/lzo.h> | ||
19 | #include "lzodefs.h" | 21 | #include "lzodefs.h" |
20 | 22 | ||
21 | #define HAVE_IP(x, ip_end, ip) ((size_t)(ip_end - ip) < (x)) | 23 | #define HAVE_IP(x, ip_end, ip) ((size_t)(ip_end - ip) < (x)) |
@@ -244,9 +246,10 @@ lookbehind_overrun: | |||
244 | *out_len = op - out; | 246 | *out_len = op - out; |
245 | return LZO_E_LOOKBEHIND_OVERRUN; | 247 | return LZO_E_LOOKBEHIND_OVERRUN; |
246 | } | 248 | } |
247 | 249 | #ifndef STATIC | |
248 | EXPORT_SYMBOL_GPL(lzo1x_decompress_safe); | 250 | EXPORT_SYMBOL_GPL(lzo1x_decompress_safe); |
249 | 251 | ||
250 | MODULE_LICENSE("GPL"); | 252 | MODULE_LICENSE("GPL"); |
251 | MODULE_DESCRIPTION("LZO1X Decompressor"); | 253 | MODULE_DESCRIPTION("LZO1X Decompressor"); |
252 | 254 | ||
255 | #endif | ||
diff --git a/lib/rational.c b/lib/rational.c index b3c099b5478e..3ed247b80662 100644 --- a/lib/rational.c +++ b/lib/rational.c | |||
@@ -7,6 +7,7 @@ | |||
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/rational.h> | 9 | #include <linux/rational.h> |
10 | #include <linux/module.h> | ||
10 | 11 | ||
11 | /* | 12 | /* |
12 | * calculate best rational approximation for a given fraction | 13 | * calculate best rational approximation for a given fraction |
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index d4996cf46eb6..3b8aeec4e327 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -903,7 +903,7 @@ static char *uuid_string(char *buf, char *end, const u8 *addr, | |||
903 | * IPv6 omits the colons (01020304...0f) | 903 | * IPv6 omits the colons (01020304...0f) |
904 | * IPv4 uses dot-separated decimal with leading 0's (010.123.045.006) | 904 | * IPv4 uses dot-separated decimal with leading 0's (010.123.045.006) |
905 | * - 'I6c' for IPv6 addresses printed as specified by | 905 | * - 'I6c' for IPv6 addresses printed as specified by |
906 | * http://www.ietf.org/id/draft-kawamura-ipv6-text-representation-03.txt | 906 | * http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-00 |
907 | * - 'U' For a 16 byte UUID/GUID, it prints the UUID/GUID in the form | 907 | * - 'U' For a 16 byte UUID/GUID, it prints the UUID/GUID in the form |
908 | * "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" | 908 | * "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" |
909 | * Options for %pU are: | 909 | * Options for %pU are: |
@@ -1188,7 +1188,7 @@ qualifier: | |||
1188 | * %pI6 print an IPv6 address with colons | 1188 | * %pI6 print an IPv6 address with colons |
1189 | * %pi6 print an IPv6 address without colons | 1189 | * %pi6 print an IPv6 address without colons |
1190 | * %pI6c print an IPv6 address as specified by | 1190 | * %pI6c print an IPv6 address as specified by |
1191 | * http://www.ietf.org/id/draft-kawamura-ipv6-text-representation-03.txt | 1191 | * http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-00 |
1192 | * %pU[bBlL] print a UUID/GUID in big or little endian using lower or upper | 1192 | * %pU[bBlL] print a UUID/GUID in big or little endian using lower or upper |
1193 | * case. | 1193 | * case. |
1194 | * %n is ignored | 1194 | * %n is ignored |
diff --git a/lib/zlib_inflate/inffast.c b/lib/zlib_inflate/inffast.c index 8550b0c05d00..05e1559fa156 100644 --- a/lib/zlib_inflate/inffast.c +++ b/lib/zlib_inflate/inffast.c | |||
@@ -4,6 +4,8 @@ | |||
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/zutil.h> | 6 | #include <linux/zutil.h> |
7 | #include <asm/unaligned.h> | ||
8 | #include <asm/byteorder.h> | ||
7 | #include "inftrees.h" | 9 | #include "inftrees.h" |
8 | #include "inflate.h" | 10 | #include "inflate.h" |
9 | #include "inffast.h" | 11 | #include "inffast.h" |
@@ -24,9 +26,11 @@ | |||
24 | #ifdef POSTINC | 26 | #ifdef POSTINC |
25 | # define OFF 0 | 27 | # define OFF 0 |
26 | # define PUP(a) *(a)++ | 28 | # define PUP(a) *(a)++ |
29 | # define UP_UNALIGNED(a) get_unaligned((a)++) | ||
27 | #else | 30 | #else |
28 | # define OFF 1 | 31 | # define OFF 1 |
29 | # define PUP(a) *++(a) | 32 | # define PUP(a) *++(a) |
33 | # define UP_UNALIGNED(a) get_unaligned(++(a)) | ||
30 | #endif | 34 | #endif |
31 | 35 | ||
32 | /* | 36 | /* |
@@ -239,18 +243,47 @@ void inflate_fast(z_streamp strm, unsigned start) | |||
239 | } | 243 | } |
240 | } | 244 | } |
241 | else { | 245 | else { |
246 | unsigned short *sout; | ||
247 | unsigned long loops; | ||
248 | |||
242 | from = out - dist; /* copy direct from output */ | 249 | from = out - dist; /* copy direct from output */ |
243 | do { /* minimum length is three */ | 250 | /* minimum length is three */ |
244 | PUP(out) = PUP(from); | 251 | /* Align out addr */ |
245 | PUP(out) = PUP(from); | 252 | if (!((long)(out - 1 + OFF) & 1)) { |
246 | PUP(out) = PUP(from); | 253 | PUP(out) = PUP(from); |
247 | len -= 3; | 254 | len--; |
248 | } while (len > 2); | 255 | } |
249 | if (len) { | 256 | sout = (unsigned short *)(out - OFF); |
250 | PUP(out) = PUP(from); | 257 | if (dist > 2) { |
251 | if (len > 1) | 258 | unsigned short *sfrom; |
252 | PUP(out) = PUP(from); | 259 | |
253 | } | 260 | sfrom = (unsigned short *)(from - OFF); |
261 | loops = len >> 1; | ||
262 | do | ||
263 | PUP(sout) = UP_UNALIGNED(sfrom); | ||
264 | while (--loops); | ||
265 | out = (unsigned char *)sout + OFF; | ||
266 | from = (unsigned char *)sfrom + OFF; | ||
267 | } else { /* dist == 1 or dist == 2 */ | ||
268 | unsigned short pat16; | ||
269 | |||
270 | pat16 = *(sout-2+2*OFF); | ||
271 | if (dist == 1) | ||
272 | #if defined(__BIG_ENDIAN) | ||
273 | pat16 = (pat16 & 0xff) | ((pat16 & 0xff) << 8); | ||
274 | #elif defined(__LITTLE_ENDIAN) | ||
275 | pat16 = (pat16 & 0xff00) | ((pat16 & 0xff00) >> 8); | ||
276 | #else | ||
277 | #error __BIG_ENDIAN nor __LITTLE_ENDIAN is defined | ||
278 | #endif | ||
279 | loops = len >> 1; | ||
280 | do | ||
281 | PUP(sout) = pat16; | ||
282 | while (--loops); | ||
283 | out = (unsigned char *)sout + OFF; | ||
284 | } | ||
285 | if (len & 1) | ||
286 | PUP(out) = PUP(from); | ||
254 | } | 287 | } |
255 | } | 288 | } |
256 | else if ((op & 64) == 0) { /* 2nd level distance code */ | 289 | else if ((op & 64) == 0) { /* 2nd level distance code */ |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 65f38c218207..e91b81b63670 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -402,7 +402,7 @@ static void clear_huge_page(struct page *page, | |||
402 | { | 402 | { |
403 | int i; | 403 | int i; |
404 | 404 | ||
405 | if (unlikely(sz > MAX_ORDER_NR_PAGES)) { | 405 | if (unlikely(sz/PAGE_SIZE > MAX_ORDER_NR_PAGES)) { |
406 | clear_gigantic_page(page, addr, sz); | 406 | clear_gigantic_page(page, addr, sz); |
407 | return; | 407 | return; |
408 | } | 408 | } |
diff --git a/mm/percpu.c b/mm/percpu.c index 442010cc91c6..083e7c91e5f6 100644 --- a/mm/percpu.c +++ b/mm/percpu.c | |||
@@ -1271,7 +1271,7 @@ static void pcpu_reclaim(struct work_struct *work) | |||
1271 | */ | 1271 | */ |
1272 | void free_percpu(void *ptr) | 1272 | void free_percpu(void *ptr) |
1273 | { | 1273 | { |
1274 | void *addr = __pcpu_ptr_to_addr(ptr); | 1274 | void *addr; |
1275 | struct pcpu_chunk *chunk; | 1275 | struct pcpu_chunk *chunk; |
1276 | unsigned long flags; | 1276 | unsigned long flags; |
1277 | int off; | 1277 | int off; |
@@ -1279,6 +1279,8 @@ void free_percpu(void *ptr) | |||
1279 | if (!ptr) | 1279 | if (!ptr) |
1280 | return; | 1280 | return; |
1281 | 1281 | ||
1282 | addr = __pcpu_ptr_to_addr(ptr); | ||
1283 | |||
1282 | spin_lock_irqsave(&pcpu_lock, flags); | 1284 | spin_lock_irqsave(&pcpu_lock, flags); |
1283 | 1285 | ||
1284 | chunk = pcpu_chunk_addr_search(addr); | 1286 | chunk = pcpu_chunk_addr_search(addr); |
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index cd815ac2a50b..0fe48cd91ffa 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib | |||
@@ -235,3 +235,8 @@ quiet_cmd_lzma = LZMA $@ | |||
235 | cmd_lzma = (cat $(filter-out FORCE,$^) | \ | 235 | cmd_lzma = (cat $(filter-out FORCE,$^) | \ |
236 | lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \ | 236 | lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \ |
237 | (rm -f $@ ; false) | 237 | (rm -f $@ ; false) |
238 | |||
239 | quiet_cmd_lzo = LZO $@ | ||
240 | cmd_lzo = (cat $(filter-out FORCE,$^) | \ | ||
241 | lzop -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \ | ||
242 | (rm -f $@ ; false) | ||
diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl index 445e8845f0a4..090f24839700 100755 --- a/scripts/get_maintainer.pl +++ b/scripts/get_maintainer.pl | |||
@@ -296,46 +296,56 @@ my @status = (); | |||
296 | 296 | ||
297 | foreach my $file (@files) { | 297 | foreach my $file (@files) { |
298 | 298 | ||
299 | #Do not match excluded file patterns | 299 | my %hash; |
300 | 300 | my $tvi = find_first_section(); | |
301 | my $exclude = 0; | 301 | while ($tvi < @typevalue) { |
302 | foreach my $line (@typevalue) { | 302 | my $start = find_starting_index($tvi); |
303 | if ($line =~ m/^(\C):\s*(.*)/) { | 303 | my $end = find_ending_index($tvi); |
304 | my $type = $1; | 304 | my $exclude = 0; |
305 | my $value = $2; | 305 | my $i; |
306 | if ($type eq 'X') { | 306 | |
307 | if (file_match_pattern($file, $value)) { | 307 | #Do not match excluded file patterns |
308 | $exclude = 1; | ||
309 | last; | ||
310 | } | ||
311 | } | ||
312 | } | ||
313 | } | ||
314 | 308 | ||
315 | if (!$exclude) { | 309 | for ($i = $start; $i < $end; $i++) { |
316 | my $tvi = 0; | 310 | my $line = $typevalue[$i]; |
317 | my %hash; | ||
318 | foreach my $line (@typevalue) { | ||
319 | if ($line =~ m/^(\C):\s*(.*)/) { | 311 | if ($line =~ m/^(\C):\s*(.*)/) { |
320 | my $type = $1; | 312 | my $type = $1; |
321 | my $value = $2; | 313 | my $value = $2; |
322 | if ($type eq 'F') { | 314 | if ($type eq 'X') { |
323 | if (file_match_pattern($file, $value)) { | 315 | if (file_match_pattern($file, $value)) { |
324 | my $value_pd = ($value =~ tr@/@@); | 316 | $exclude = 1; |
325 | my $file_pd = ($file =~ tr@/@@); | ||
326 | $value_pd++ if (substr($value,-1,1) ne "/"); | ||
327 | if ($pattern_depth == 0 || | ||
328 | (($file_pd - $value_pd) < $pattern_depth)) { | ||
329 | $hash{$tvi} = $value_pd; | ||
330 | } | ||
331 | } | 317 | } |
332 | } | 318 | } |
333 | } | 319 | } |
334 | $tvi++; | ||
335 | } | 320 | } |
336 | foreach my $line (sort {$hash{$b} <=> $hash{$a}} keys %hash) { | 321 | |
337 | add_categories($line); | 322 | if (!$exclude) { |
323 | for ($i = $start; $i < $end; $i++) { | ||
324 | my $line = $typevalue[$i]; | ||
325 | if ($line =~ m/^(\C):\s*(.*)/) { | ||
326 | my $type = $1; | ||
327 | my $value = $2; | ||
328 | if ($type eq 'F') { | ||
329 | if (file_match_pattern($file, $value)) { | ||
330 | my $value_pd = ($value =~ tr@/@@); | ||
331 | my $file_pd = ($file =~ tr@/@@); | ||
332 | $value_pd++ if (substr($value,-1,1) ne "/"); | ||
333 | if ($pattern_depth == 0 || | ||
334 | (($file_pd - $value_pd) < $pattern_depth)) { | ||
335 | $hash{$tvi} = $value_pd; | ||
336 | } | ||
337 | } | ||
338 | } | ||
339 | } | ||
340 | } | ||
338 | } | 341 | } |
342 | |||
343 | $tvi += ($end - $start); | ||
344 | |||
345 | } | ||
346 | |||
347 | foreach my $line (sort {$hash{$b} <=> $hash{$a}} keys %hash) { | ||
348 | add_categories($line); | ||
339 | } | 349 | } |
340 | 350 | ||
341 | if ($email && $email_git) { | 351 | if ($email && $email_git) { |
@@ -570,6 +580,20 @@ sub format_email { | |||
570 | return $formatted_email; | 580 | return $formatted_email; |
571 | } | 581 | } |
572 | 582 | ||
583 | sub find_first_section { | ||
584 | my $index = 0; | ||
585 | |||
586 | while ($index < @typevalue) { | ||
587 | my $tv = $typevalue[$index]; | ||
588 | if (($tv =~ m/^(\C):\s*(.*)/)) { | ||
589 | last; | ||
590 | } | ||
591 | $index++; | ||
592 | } | ||
593 | |||
594 | return $index; | ||
595 | } | ||
596 | |||
573 | sub find_starting_index { | 597 | sub find_starting_index { |
574 | my ($index) = @_; | 598 | my ($index) = @_; |
575 | 599 | ||
diff --git a/usr/Kconfig b/usr/Kconfig index 1c3039f28909..e2721f5a3504 100644 --- a/usr/Kconfig +++ b/usr/Kconfig | |||
@@ -72,6 +72,15 @@ config RD_LZMA | |||
72 | Support loading of a LZMA encoded initial ramdisk or cpio buffer | 72 | Support loading of a LZMA encoded initial ramdisk or cpio buffer |
73 | If unsure, say N. | 73 | If unsure, say N. |
74 | 74 | ||
75 | config RD_LZO | ||
76 | bool "Support initial ramdisks compressed using LZO" if EMBEDDED | ||
77 | default !EMBEDDED | ||
78 | depends on BLK_DEV_INITRD | ||
79 | select DECOMPRESS_LZO | ||
80 | help | ||
81 | Support loading of a LZO encoded initial ramdisk or cpio buffer | ||
82 | If unsure, say N. | ||
83 | |||
75 | choice | 84 | choice |
76 | prompt "Built-in initramfs compression mode" if INITRAMFS_SOURCE!="" | 85 | prompt "Built-in initramfs compression mode" if INITRAMFS_SOURCE!="" |
77 | help | 86 | help |
@@ -108,16 +117,15 @@ config INITRAMFS_COMPRESSION_GZIP | |||
108 | bool "Gzip" | 117 | bool "Gzip" |
109 | depends on RD_GZIP | 118 | depends on RD_GZIP |
110 | help | 119 | help |
111 | The old and tried gzip compression. Its compression ratio is | 120 | The old and tried gzip compression. It provides a good balance |
112 | the poorest among the 3 choices; however its speed (both | 121 | between compression ratio and decompression speed. |
113 | compression and decompression) is the fastest. | ||
114 | 122 | ||
115 | config INITRAMFS_COMPRESSION_BZIP2 | 123 | config INITRAMFS_COMPRESSION_BZIP2 |
116 | bool "Bzip2" | 124 | bool "Bzip2" |
117 | depends on RD_BZIP2 | 125 | depends on RD_BZIP2 |
118 | help | 126 | help |
119 | Its compression ratio and speed is intermediate. | 127 | Its compression ratio and speed is intermediate. |
120 | Decompression speed is slowest among the three. The initramfs | 128 | Decompression speed is slowest among the four. The initramfs |
121 | size is about 10% smaller with bzip2, in comparison to gzip. | 129 | size is about 10% smaller with bzip2, in comparison to gzip. |
122 | Bzip2 uses a large amount of memory. For modern kernels you | 130 | Bzip2 uses a large amount of memory. For modern kernels you |
123 | will need at least 8MB RAM or more for booting. | 131 | will need at least 8MB RAM or more for booting. |
@@ -128,7 +136,15 @@ config INITRAMFS_COMPRESSION_LZMA | |||
128 | help | 136 | help |
129 | The most recent compression algorithm. | 137 | The most recent compression algorithm. |
130 | Its ratio is best, decompression speed is between the other | 138 | Its ratio is best, decompression speed is between the other |
131 | two. Compression is slowest. The initramfs size is about 33% | 139 | three. Compression is slowest. The initramfs size is about 33% |
132 | smaller with LZMA in comparison to gzip. | 140 | smaller with LZMA in comparison to gzip. |
133 | 141 | ||
142 | config INITRAMFS_COMPRESSION_LZO | ||
143 | bool "LZO" | ||
144 | depends on RD_LZO | ||
145 | help | ||
146 | Its compression ratio is the poorest among the four. The kernel | ||
147 | size is about about 10% bigger than gzip; however its speed | ||
148 | (both compression and decompression) is the fastest. | ||
149 | |||
134 | endchoice | 150 | endchoice |