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 |
