summaryrefslogtreecommitdiff
path: root/sound/soc/atmel
AgeCommit message (Collapse)Author
2015-12-23Merge remote-tracking branches 'asoc/topic/atmel-classd', 'asoc/topic/const' ↵Mark Brown
and 'asoc/topic/da7218' into asoc-next
2015-12-23ASoC: atmel_wm8904: add snd_soc_pm_opsSongjun Wu
Sometimes the audio play can not be resumed after it is suspended. Add snd_soc_pm_ops to execute power management operations, then this issue is fixed. Signed-off-by: Songjun Wu <songjun.wu@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-12-18ASoC: atmel-pdmic: add the Pulse Density Modulation Interface ControllerSongjun Wu
Add driver for the Pulse Density Modulation Interface Controller. It comes with digitallly controlled gain, a High-Pass and a SINCC filter. Signed-off-by: Songjun Wu <songjun.wu@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-12-12ASoC: Atmel: ClassD: unregister codec when error occursSongjun Wu
Add code to unregister codec in probe function, when the error occurs after the codec is registered. Signed-off-by: Songjun Wu <songjun.wu@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-11-20ASoC: Atmel: ClassD: supports mono audioSongjun Wu
Modify the code to support mono audio. Signed-off-by: Songjun Wu <songjun.wu@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-10-26Merge remote-tracking branches 'asoc/topic/atmel-classd' and ↵Mark Brown
'asoc/topic/da7213' into asoc-next
2015-10-22ASoC: atmel-classd: add the Audio Class D AmplifierSongjun Wu
Add driver for the digital imput to PWM output stereo class D amplifier. It comes with filter, digitally controlled gain, an equalizer and a dmphase filter. Signed-off-by: Songjun Wu <songjun.wu@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-09-14ASoC: atmel_wm8904: Fix module autoload for OF platform driverLuis de Bethencourt
This platform driver has a OF device ID table but the OF module alias information is not created so module autoloading won't work. Signed-off-by: Luis de Bethencourt <luis@debethencourt.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-08-04ASoC: atmel_ssc_dai: Correct misuse of 0x%<decimal>Joe Perches
Correct misuse of 0x%d in logging message. Signed-off-by: Joe Perches <joe@perches.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-06-22Merge remote-tracking branches 'asoc/topic/adsp' and 'asoc/topic/atmel' into ↵Mark Brown
asoc-next
2015-06-12ASoC: atmel: properly select dma driver stateAlexandre Belloni
It is currently possible to have CONFIG_SND_ATMEL_SOC_SSC=y with either CONFIG_SND_ATMEL_SOC_PDC=m or CONFIG_SND_ATMEL_SOC_DMA=m. This results in a driver that compiles but does not link with this kind of error: sound/built-in.o: In function `atmel_ssc_set_audio': (.text+0x87d90): undefined reference to `atmel_pcm_pdc_platform_register' sound/built-in.o: In function `atmel_ssc_put_audio': (.text+0x8879a): undefined reference to `atmel_pcm_pdc_platform_unregister' Introduce new config options SND_ATMEL_SOC_SSC_PDC and SND_ATMEL_SOC_SSC_DMA which should be used by the board drivers and the correct logic to properly select the SND_ATMEL_SOC_PDC and SND_ATMEL_SOC_DMA states. Reported-by: Randy Dunlap <rdunlap@infradead.org> Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-06-12ASoC: atmel: Revert previous fix for Kconfig limationsAlexandre Belloni
After discussing with the Kconfig maintainer, we found a better fiw allowing to keep each driver as modules. This reverts commit 0ef9dc139db2fca304ce4eadb5b8fb40d3dedb5e. Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-06-05Merge remote-tracking branches 'asoc/topic/adau1977', 'asoc/topic/adav80x', ↵Mark Brown
'asoc/topic/arizona' and 'asoc/topic/atmel' into asoc-next
2015-05-26ASoC: atmel: compile pcm driver in snd-soc-atmel_ssc_daiAlexandre Belloni
It is currently possible to have CONFIG_SND_ATMEL_SOC_SSC=y with either CONFIG_SND_ATMEL_SOC_PDC=m or CONFIG_SND_ATMEL_SOC_DMA=m. This results in a driver that compiles but does not link with this kind of error: sound/built-in.o: In function `atmel_ssc_set_audio': (.text+0x87d90): undefined reference to `atmel_pcm_pdc_platform_register' sound/built-in.o: In function `atmel_ssc_put_audio': (.text+0x8879a): undefined reference to `atmel_pcm_pdc_platform_unregister' Solve that by compiling the selected PCM driver (PDC, DMA or both) in the Atmel SSC DAI driver. Reported-by: Randy Dunlap <rdunlap@infradead.org> Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-05-26ASoC: atmel: simplify KconfigAlexandre Belloni
Enclose the options in if SND_ATMEL_SOC ... endif to remove the dependency. Also remove the useless description for SND_ATMEL_SOC_SSC. Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-04-27ASoC: dmaengine_pcm: Make FLAG_NO_RESIDUE internalLars-Peter Clausen
Whether residue can be reported or not is not a property of the audio controller but of the DMA controller. The FLAG_NO_RESIDUE was initially added when the DMAengine framework had no support for describing the residue reporting capabilities of the controller. Support for this was added quite a while ago and recently the DMAengine framework started to complain if a driver does not describe its capabilities and a lot of patches have been merged that add support for this where it was missing. So it should be safe to assume that driver on actively used platforms properly implement the DMA capabilities API. This patch makes the FLAG_NO_RESIDUE internal and no longer allows audio controller drivers to manually set the flag. If a DMA driver against expectations does not support reporting its capabilities for now the generic DMAengine PCM driver will now emit a warning and simply assume that residue reporting is not supported. In the future this might be changed to aborting with an error. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-04-27ASoC: at91sam9g20ek: Automatically disconnect non-connected pinsLars-Peter Clausen
According to the schematics the both LHPOUT and RHPOUT are connected to the external connector. RHPOUT is missing from the DAPM routes, but otherwise they seem to be complete. This patch adds the missing route and then sets the fully_routed flag for the card. This allows to remove all the manual calls to snd_soc_dapm_nc_pin(). Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-04-12Merge remote-tracking branches 'asoc/topic/4554', 'asoc/topic/ab8500', ↵Mark Brown
'asoc/topic/ak4642', 'asoc/topic/arizona' and 'asoc/topic/atmel' into asoc-next
2015-04-12ASoC: atmel: Improve machine driver compile test coverageLars-Peter Clausen
The Atmel ASoC machine drivers don't have any compile time arch dependencies anymore. Make it possible to select them when COMPILE_TEST is enabled to get better compile test coverage. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-04-12ASoC: atmel: Add dependency to SND_SOC_I2C_AND_SPI where necessaryLars-Peter Clausen
The SND_AT91_SOC_SAM9G20_WM8731 and SND_AT91_SOC_SAM9X5_WM8731 machine driver symbols select SND_SOC_WM8731 which depends on SND_SOC_I2C_AND_SPI. So the machine driver symbols need to depend on SND_SOC_I2C_AND_SPI as well, otherwise we might end up with a invalid configuration, which will sooner or later upset the randconfig auto-builders. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-04-02ASoC: atmel-pcm-dma: increase buffer_bytes_maxAlexandre Belloni
atmel-pcm-dma is not limited to a buffer size of 64kB like atmel-pcm-pdc. Increase buffer_bytes_max to 512kB to allow for higher bit rates (i.e. 32bps at 192kHz) to work correctly. By default, keep the prealloc at 64kB. Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-04-01ASoC: atmel-pcm-pdc: merge atmel-pcm back inAlexandre Belloni
atmel-pcm.c was split into two files to create a generic framework for both PDC and DMA. atmel-pcm-dma.c is using the generic dmaengine framework since 95e0e07e710e (ASoC: atmel-pcm: use generic dmaengine framework). Merge atmel-pcm.c in atmel-pcm-pdc.c as this is now the only user. Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-03-05Merge remote-tracking branches 'asoc/topic/atmel', 'asoc/topic/davinci', ↵Mark Brown
'asoc/topic/gpiod' and 'asoc/topic/intel' into asoc-next
2015-03-02ASoC: sam9g20_wm8731: drop machine_is_xxxAlexandre Belloni
Atmel based boards can now only be used with device tree. Drop non DT initialization. Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-02-10ASoC: atmel_ssc_dai: Allow more ratesPeter Rosin
When the SSC acts as BCK master, use a ratnum rule to limit the rate instead of only doing the standard rates. When the SSC acts as BCK slave, allow any BCK frequency up to the SSC master clock, divided by either of 2, 3 or 6. Put a cap at 384kHz. Who's /ever/ going to need more than that? The divider of 2, 3 or 6 is selected based on the Serial Clock Ratio Considerations section from the SSC documentation: The Transmitter and the Receiver can be programmed to operate with the clock signals provided on either the TK or RK pins. This allows the SSC to support many slave-mode data transfers. In this case, the maximum clock speed allowed on the RK pin is: - Peripheral clock divided by 2 if Receiver Frame Synchro is input - Peripheral clock divided by 3 if Receiver Frame Synchro is output In addition, the maximum clock speed allowed on the TK pin is: - Peripheral clock divided by 6 if Transmit Frame Synchro is input - Peripheral clock divided by 2 if Transmit Frame Synchro is output Signed-off-by: Peter Rosin <peda@axentia.se> Acked-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-02-09Merge remote-tracking branches 'asoc/topic/cs42l73', 'asoc/topic/dai' and ↵Mark Brown
'asoc/topic/davinci' into asoc-next
2015-02-09Merge remote-tracking branches 'asoc/topic/ad193x', 'asoc/topic/alc5632', ↵Mark Brown
'asoc/topic/atmel' and 'asoc/topic/au1x' into asoc-next
2015-02-04Merge remote-tracking branches 'asoc/topic/cs42l73', 'asoc/topic/dai' and ↵Mark Brown
'asoc/topic/davinci' into asoc-next
2015-02-04Merge remote-tracking branches 'asoc/topic/ad193x', 'asoc/topic/alc5632', ↵Mark Brown
'asoc/topic/atmel' and 'asoc/topic/au1x' into asoc-next
2015-02-02ASoC: atmel-pcm-dma: won't check direction when configure dmaBo Shen
As DMA framework request DMA using direction only in prep_slave function, (The At91 xdma driver has adapted to this request). So won't check direction when do DMA configuration. Signed-off-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-01-30ASoC: atmel_ssc_dai: only clean PDC when using PDCBo Shen
Only using PDC, it needs to clean PDC registers. Signed-off-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-01-30ASoC: atmel_ssc_dai: refactor the startup and shutdownBo Shen
In startup function, enable ssc clock and in shutdown function, disable clock. And also remove disable ssc in shutdown function, as ssc is disabled in prepare function. Signed-off-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-01-30ASoC: atmel_ssc_dai: fix the setting for DSP modeBo Shen
When SCC work in DSP A mode, the data outputs/inputs are shift out on falling edge, the frame sync are sample on the rising edge. Reported-by: Songjun Wu <songjun.wu@atmel.com> Signed-off-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-01-30ASoC: atmel_ssc_dai: Support SND_SOC_DAIFMT_CBM_CFS on I2SPeter Rosin
Signed-off-by: Peter Rosin <peda@axentia.se> Acked-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-01-27ASoC: atmel_ssc_dai: remove clock pin commentsBo Shen
As the clock can be get from TK/RK pin, so remove the comments. Signed-off-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-01-27Merge branch 'fix/atmel' of ↵Mark Brown
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-atmel
2015-01-27ASoC: atmel_ssc_dai: fix start event for I2S modeBo Shen
According to the I2S specification information as following: - WS = 0, channel 1 (left) - WS = 1, channel 2 (right) So, the start event should be TF/RF falling edge. Reported-by: Songjun Wu <songjun.wu@atmel.com> Signed-off-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org> Cc: stable@vger.kernel.org
2015-01-14Asoc: sam9x5_wm8731: depend on ARCH_AT91 instead of SOC_AT91SAM9X5Alexandre Belloni
The SOC_AT91SAM9X5 option is going to be removed, only depend on ARCH_AT91 like for the other drivers. Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> Acked-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-01-06ASoC: atmel: sam9g20_wm8731: remove useless includeAlexandre Belloni
A mach/ header is included but never used. Simply remove it. Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Acked-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2015-01-06ASoC: sam9g20_wm8731: Use static DAI format setupLars-Peter Clausen
Set the dai_fmt field in the dai_link struct instead of manually calling snd_soc_dai_fmt(). This makes the code cleaner and shorter. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Acked-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2014-12-20Merge tag 'sound-fix-3.19-rc1' of ↵Linus Torvalds
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Here are a few fixes that have landed after the previous pull request. All are driver specific fixes including: - error/int value fixes in OXFW, - Intel Skylake HD-audio HDMI codec support, - Additional HD-audio Realtek codecs and AD1986A codec fixes/quirks, - a few more DSD support and a quirk for Arcam rPAC in usb-audio, - a typo fix for Scarlett 6i6, - fixes for new ASIHPI firmware, - ASoC Exynos7 cleanups, - Intel ACPI support, and - a fix for PCM512 register cache sync" * tag 'sound-fix-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (24 commits) ALSA: usb-audio: extend KEF X300A FU 10 tweak to Arcam rPAC ALSA: hda/realtek - New codec support for ALC298 ALSA: asihpi: update to HPI version 4.14 ALSA: asihpi: increase tuner pad cache size ALSA: asihpi: relax firmware version check ALSA: usb-audio: Fix Scarlett 6i6 initialization typo ALSA: hda - Add quirk for Packard Bell EasyNote MX65 ALSA: usb-audio: add native DSD support for Matrix Audio DACs ALSA: hda/realtek - New codec support for ALC256 ALSA: hda/realtek - Add new Dell desktop for ALC3234 headset mode ASoC: Intel: fix possible acpi enumeration panic ALSA: hda/hdmi - apply Haswell fix-ups to Skylake display codec ASoC: Intel: fix return value check in sst_acpi_probe() ALSA: hda - Make add_stereo_mix_input flag tristate ALSA: hda - Create capture source ctls when stereo mix input is added ALSA: hda - Fix typos in snd_hda_get_int_hint() kerneldoc comments ALSA: hda - add codec ID for Skylake display audio codec ALSA: oxfw: some signedness bugs ALSA: oxfw: fix detect_loud_models() return value ASoC: rt5677: add REGMAP_I2C and REGMAP_IRQ dependency ...
2014-12-16Merge tag 'asoc-v3.19-2' of ↵Takashi Iwai
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Merge window fixes for v3.19 A smattering of driver specific fixes here, some more cleanup of the Exynos7 and Intel ACPI support plus a fix for register cache sync on the pcm512x driver which has been lurking for a while.
2014-12-15Merge tag 'driver-core-3.19-rc1' of ↵Linus Torvalds
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core Pull driver core update from Greg KH: "Here's the set of driver core patches for 3.19-rc1. They are dominated by the removal of the .owner field in platform drivers. They touch a lot of files, but they are "simple" changes, just removing a line in a structure. Other than that, a few minor driver core and debugfs changes. There are some ath9k patches coming in through this tree that have been acked by the wireless maintainers as they relied on the debugfs changes. Everything has been in linux-next for a while" * tag 'driver-core-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (324 commits) Revert "ath: ath9k: use debugfs_create_devm_seqfile() helper for seq_file entries" fs: debugfs: add forward declaration for struct device type firmware class: Deletion of an unnecessary check before the function call "vunmap" firmware loader: fix hung task warning dump devcoredump: provide a one-way disable function device: Add dev_<level>_once variants ath: ath9k: use debugfs_create_devm_seqfile() helper for seq_file entries ath: use seq_file api for ath9k debugfs files debugfs: add helper function to create device related seq_file drivers/base: cacheinfo: remove noisy error boot message Revert "core: platform: add warning if driver has no owner" drivers: base: support cpu cache information interface to userspace via sysfs drivers: base: add cpu_device_create to support per-cpu devices topology: replace custom attribute macros with standard DEVICE_ATTR* cpumask: factor out show_cpumap into separate helper function driver core: Fix unbalanced device reference in drivers_probe driver core: fix race with userland in device_add() sysfs/kernfs: make read requests on pre-alloc files use the buffer. sysfs/kernfs: allow attributes to request write buffer be pre-allocated. fs: sysfs: return EGBIG on write if offset is larger than file size ...
2014-12-08Merge tag 'asoc-v3.19' of ↵Takashi Iwai
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Updates for v3.19 Lots and lots of changes this time around, the usual set of driver updates and a huge bulk of cleanups from Lars-Peter. Probably the most interesting thing for most users is the Intel driver updates which will (with some more machine integration work) enable support for newer x86 laptops. - Conversion of AC'97 drivers to use regmap, bringing us closer to the removal of the ASoC level I/O code. - Clean up a lot of old drivers that were open coding things that have subsequently been implemented in the core. - Some DAPM performance improvements. - Removal of the now seldom used CODEC mutex. - Lots of updates for the newer Intel SoC support, including support for the DSP and some Cherrytrail and Braswell machine drivers. - Support for Samsung boards using rt5631 as the CODEC. - Removal of the obsolete AFEB9260 machine driver. - Driver support for the TI TS3A227E headset driver used in some Chrombeooks.
2014-12-08ASoC: atmel_ssc_dai/trivial: typo fixMatthieu Crapet
Signed-off-by: Matthieu Crapet <mcrapet@gmail.com> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2014-12-02ASoC: Kconfig: remove not used SND_AT91_SOC_AFEB9260 optionNicolas Ferre
Now that the driver snd-soc-afeb9260.c is deleted, remove its Kconfig option. Reported-by: Paul Bolle <pebolle@tiscali.nl> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2014-12-01ASoC: snd-soc-afeb9260: delete driver as board has just been removedNicolas Ferre
During the removal of all AT91 !DT boards, we removed the AFEB9260. This driver is !DT and was only used by this board, so we delete it as well. Reported-by: Paul Bolle <pebolle@tiscali.nl> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2014-11-09ALSA: pcm: Add snd_pcm_stop_xrun() helperTakashi Iwai
Add a new helper function snd_pcm_stop_xrun() to the standard sequnce lock/snd_pcm_stop(XRUN)/unlock by a single call, and replace the existing open codes with this helper. The function checks the PCM running state to prevent setting the wrong state, too, for more safety. Signed-off-by: Takashi Iwai <tiwai@suse.de>
2014-11-03ASoC: atmel_ssc_dai: Match the CMR divider only in full duplex.Peter Rosin
The CMR divider register is shared by playback and capture. The SSC driver therefore tries to enforce rules so that the needed register content do not conflict during simultaneous playback/capture. However, the implementation also prevents changing the register content in half-duplex scenarios, which is needed when using the OSS API. Thus, only lock the divider if there is a stream in the other direction. Fixes the below program to not fail with the atmel ssc dai in master mode. int main(void) { int fd; int format; int channels; int speed; if ((fd = open("/dev/dsp", O_WRONLY, 0)) == -1) { perror("open"); return 1; } format = AFMT_S16_LE; if (ioctl(fd, SNDCTL_DSP_SETFMT, &format) == -1) { perror("SNDCTL_DSP_SETFMT"); return 1; } channels = 2; if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) == -1) { perror("SNDCTL_DSP_CHANNELS"); return 1; } speed = 22025; if (ioctl(fd, SNDCTL_DSP_SPEED, &speed) == -1) { perror("SNDCTL_DSP_SPEED"); return 1; } return 0; } Signed-off-by: Peter Rosin <peda@axentia.se> Acked-by: Bo Shen <voice.shen@atmel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
2014-10-20ASoC: atmel: drop owner assignment from platform_driversWolfram Sang
A platform_driver does not need to set an owner, it will be populated by the driver core. Signed-off-by: Wolfram Sang <wsa@the-dreams.de>