linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself
@ 2015-03-12  2:17 Songjun Wu
  2015-03-16 14:53 ` Charles Keepax
  2015-03-16 15:01 ` Mark Brown
  0 siblings, 2 replies; 10+ messages in thread
From: Songjun Wu @ 2015-03-12  2:17 UTC (permalink / raw)
  To: lgirdwood, broonie, perex, tiwai, ckeepax, lars, fabio.estevam,
	manuel.lauss, patches, alsa-devel, linux-kernel, voice.shen
  Cc: Songjun Wu

Enable WM8731 to support common clock framework.

Signed-off-by: Songjun Wu <songjun.wu@atmel.com>
---
 sound/soc/codecs/wm8731.c |   34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c
index 098c143..8df1550 100644
--- a/sound/soc/codecs/wm8731.c
+++ b/sound/soc/codecs/wm8731.c
@@ -25,6 +25,7 @@
 #include <linux/spi/spi.h>
 #include <linux/of_device.h>
 #include <linux/mutex.h>
+#include <linux/clk.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
@@ -45,6 +46,7 @@ static const char *wm8731_supply_names[WM8731_NUM_SUPPLIES] = {
 /* codec private data */
 struct wm8731_priv {
 	struct regmap *regmap;
+	struct clk *mclk;
 	struct regulator_bulk_data supplies[WM8731_NUM_SUPPLIES];
 	const struct snd_pcm_hw_constraint_list *constraints;
 	unsigned int sysclk;
@@ -390,6 +392,8 @@ static int wm8731_set_dai_sysclk(struct snd_soc_dai *codec_dai,
 	switch (clk_id) {
 	case WM8731_SYSCLK_XTAL:
 	case WM8731_SYSCLK_MCLK:
+		if (wm8731->mclk && clk_set_rate(wm8731->mclk, freq))
+			return -EINVAL;
 		wm8731->sysclk_type = clk_id;
 		break;
 	default:
@@ -491,6 +495,8 @@ static int wm8731_set_bias_level(struct snd_soc_codec *codec,
 
 	switch (level) {
 	case SND_SOC_BIAS_ON:
+		if (wm8731->mclk)
+			clk_prepare_enable(wm8731->mclk);
 		break;
 	case SND_SOC_BIAS_PREPARE:
 		break;
@@ -509,6 +515,8 @@ static int wm8731_set_bias_level(struct snd_soc_codec *codec,
 		snd_soc_write(codec, WM8731_PWR, reg | 0x0040);
 		break;
 	case SND_SOC_BIAS_OFF:
+		if (wm8731->mclk)
+			clk_disable_unprepare(wm8731->mclk);
 		snd_soc_write(codec, WM8731_PWR, 0xffff);
 		regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies),
 				       wm8731->supplies);
@@ -667,6 +675,19 @@ static int wm8731_spi_probe(struct spi_device *spi)
 	if (wm8731 == NULL)
 		return -ENOMEM;
 
+	wm8731->mclk = devm_clk_get(&spi->dev, "mclk");
+	if (IS_ERR(wm8731->mclk)) {
+		ret = PTR_ERR(wm8731->mclk);
+		if (ret == -ENOENT) {
+			wm8731->mclk = NULL;
+			dev_warn(&spi->dev, "Assuming static MCLK\n");
+		} else {
+			dev_err(&spi->dev, "Failed to get MCLK: %d\n",
+				ret);
+			return ret;
+		}
+	}
+
 	mutex_init(&wm8731->lock);
 
 	wm8731->regmap = devm_regmap_init_spi(spi, &wm8731_regmap);
@@ -718,6 +739,19 @@ static int wm8731_i2c_probe(struct i2c_client *i2c,
 	if (wm8731 == NULL)
 		return -ENOMEM;
 
+	wm8731->mclk = devm_clk_get(&i2c->dev, "mclk");
+	if (IS_ERR(wm8731->mclk)) {
+		ret = PTR_ERR(wm8731->mclk);
+		if (ret == -ENOENT) {
+			wm8731->mclk = NULL;
+			dev_warn(&i2c->dev, "Assuming static MCLK\n");
+		} else {
+			dev_err(&i2c->dev, "Failed to get MCLK: %d\n",
+				ret);
+			return ret;
+		}
+	}
+
 	mutex_init(&wm8731->lock);
 
 	wm8731->regmap = devm_regmap_init_i2c(i2c, &wm8731_regmap);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself
  2015-03-12  2:17 [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself Songjun Wu
@ 2015-03-16 14:53 ` Charles Keepax
  2015-03-16 15:01 ` Mark Brown
  1 sibling, 0 replies; 10+ messages in thread
From: Charles Keepax @ 2015-03-16 14:53 UTC (permalink / raw)
  To: Songjun Wu
  Cc: lgirdwood, broonie, perex, tiwai, lars, fabio.estevam,
	manuel.lauss, patches, alsa-devel, linux-kernel, voice.shen

On Thu, Mar 12, 2015 at 10:17:11AM +0800, Songjun Wu wrote:
> Enable WM8731 to support common clock framework.
> 
> Signed-off-by: Songjun Wu <songjun.wu@atmel.com>
> ---

Looks ok to me:

Acked-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>

Thanks,
Charles

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself
  2015-03-12  2:17 [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself Songjun Wu
  2015-03-16 14:53 ` Charles Keepax
@ 2015-03-16 15:01 ` Mark Brown
  1 sibling, 0 replies; 10+ messages in thread
From: Mark Brown @ 2015-03-16 15:01 UTC (permalink / raw)
  To: Songjun Wu
  Cc: lgirdwood, perex, tiwai, ckeepax, lars, fabio.estevam,
	manuel.lauss, patches, alsa-devel, linux-kernel, voice.shen

[-- Attachment #1: Type: text/plain, Size: 129 bytes --]

On Thu, Mar 12, 2015 at 10:17:11AM +0800, Songjun Wu wrote:
> Enable WM8731 to support common clock framework.

Applied, thanks.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself
  2015-02-04  3:45         ` Bo Shen
@ 2015-02-04 11:13           ` Mark Brown
  0 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2015-02-04 11:13 UTC (permalink / raw)
  To: Bo Shen
  Cc: Manuel Lauss, Manuel Lauss, Liam Girdwood, Richard Purdie,
	patches, linux-sound, alsa-devel, linux-arm-kernel, LKML

[-- Attachment #1: Type: text/plain, Size: 371 bytes --]

On Wed, Feb 04, 2015 at 11:45:29AM +0800, Bo Shen wrote:

> Do you mean I send my RFC patch as the formal patch, and let other boards
> which use the wm8731 to add clk object, am I right?

No, we need to keep the boards working so we either need patches adding
the fixed clocks for existing boards or we need to have the handling of
missing clocks that Manuel suggested.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself
  2015-02-03 16:21       ` Mark Brown
@ 2015-02-04  3:45         ` Bo Shen
  2015-02-04 11:13           ` Mark Brown
  0 siblings, 1 reply; 10+ messages in thread
From: Bo Shen @ 2015-02-04  3:45 UTC (permalink / raw)
  To: Mark Brown, Manuel Lauss
  Cc: Manuel Lauss, Liam Girdwood, Richard Purdie, patches,
	linux-sound, alsa-devel, linux-arm-kernel, LKML

Hi Mark,

On 02/04/2015 12:21 AM, Mark Brown wrote:
> On Tue, Feb 03, 2015 at 03:40:45PM +0100, Manuel Lauss wrote:
>> On Tue, Feb 3, 2015 at 1:44 PM, Mark Brown <broonie@kernel.org> wrote:
>
>>>> +    wm8731->mclk = devm_clk_get(&spi->dev, "mclk");
>>>> +    if (IS_ERR(wm8731->mclk)) {
>>>> +        wm8731->mclk = NULL;
>>>> +        dev_warn(&spi->dev, "assuming static MCLK\n");
>>>> +    }
>
>>> This is broken for both deferred probe and in the case where the clock
>>> API genuinely returns a NULL clock.  Other than that it's the kind of
>>> thing that we've done for some other drivers, though it's not good to
>>> have to do this.  Check them for correct behaviour.
>
>> Hm, so the only option is to create the simples possible 12MHz clk object?
>
> Well, that's the best option in general.  You can get away with just
> making sure that -EPROBE_DEFER is handled and that IS_ERR() is used to
> check for an invalid clock but if you can define a clock that's even
> better (and should be pretty painless), we're going to want to do that
> transition at some point.

Do you mean I send my RFC patch as the formal patch, and let other 
boards which use the wm8731 to add clk object, am I right?

Best Regards,
Bo Shen


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself
  2015-02-03 14:40     ` Manuel Lauss
@ 2015-02-03 16:21       ` Mark Brown
  2015-02-04  3:45         ` Bo Shen
  0 siblings, 1 reply; 10+ messages in thread
From: Mark Brown @ 2015-02-03 16:21 UTC (permalink / raw)
  To: Manuel Lauss
  Cc: Bo Shen, Manuel Lauss, Liam Girdwood, Richard Purdie, patches,
	linux-sound, alsa-devel, linux-arm-kernel, LKML

[-- Attachment #1: Type: text/plain, Size: 1005 bytes --]

On Tue, Feb 03, 2015 at 03:40:45PM +0100, Manuel Lauss wrote:
> On Tue, Feb 3, 2015 at 1:44 PM, Mark Brown <broonie@kernel.org> wrote:

> >> +    wm8731->mclk = devm_clk_get(&spi->dev, "mclk");
> >> +    if (IS_ERR(wm8731->mclk)) {
> >> +        wm8731->mclk = NULL;
> >> +        dev_warn(&spi->dev, "assuming static MCLK\n");
> >> +    }

> > This is broken for both deferred probe and in the case where the clock
> > API genuinely returns a NULL clock.  Other than that it's the kind of
> > thing that we've done for some other drivers, though it's not good to
> > have to do this.  Check them for correct behaviour.

> Hm, so the only option is to create the simples possible 12MHz clk object?

Well, that's the best option in general.  You can get away with just
making sure that -EPROBE_DEFER is handled and that IS_ERR() is used to
check for an invalid clock but if you can define a clock that's even
better (and should be pretty painless), we're going to want to do that
transition at some point.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself
  2015-02-03 12:44   ` Mark Brown
@ 2015-02-03 14:40     ` Manuel Lauss
  2015-02-03 16:21       ` Mark Brown
  0 siblings, 1 reply; 10+ messages in thread
From: Manuel Lauss @ 2015-02-03 14:40 UTC (permalink / raw)
  To: Mark Brown
  Cc: Bo Shen, Manuel Lauss, Liam Girdwood, Richard Purdie, patches,
	linux-sound, alsa-devel, linux-arm-kernel, LKML

On Tue, Feb 3, 2015 at 1:44 PM, Mark Brown <broonie@kernel.org> wrote:
> On Tue, Feb 03, 2015 at 08:54:57AM +0100, Manuel Lauss wrote:
>
>> +    wm8731->mclk = devm_clk_get(&spi->dev, "mclk");
>> +    if (IS_ERR(wm8731->mclk)) {
>> +        wm8731->mclk = NULL;
>> +        dev_warn(&spi->dev, "assuming static MCLK\n");
>> +    }
>
> This is broken for both deferred probe and in the case where the clock
> API genuinely returns a NULL clock.  Other than that it's the kind of
> thing that we've done for some other drivers, though it's not good to
> have to do this.  Check them for correct behaviour.

Hm, so the only option is to create the simples possible 12MHz clk object?

Manuel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself
  2015-02-03  7:54 ` Manuel Lauss
@ 2015-02-03 12:44   ` Mark Brown
  2015-02-03 14:40     ` Manuel Lauss
  0 siblings, 1 reply; 10+ messages in thread
From: Mark Brown @ 2015-02-03 12:44 UTC (permalink / raw)
  To: Manuel Lauss
  Cc: Bo Shen, Manuel Lauss, Liam Girdwood, Richard Purdie, patches,
	linux-sound, alsa-devel, linux-arm-kernel, LKML

[-- Attachment #1: Type: text/plain, Size: 617 bytes --]

On Tue, Feb 03, 2015 at 08:54:57AM +0100, Manuel Lauss wrote:

> +    wm8731->mclk = devm_clk_get(&spi->dev, "mclk");
> +    if (IS_ERR(wm8731->mclk)) {
> +        wm8731->mclk = NULL;
> +        dev_warn(&spi->dev, "assuming static MCLK\n");
> +    }

This is broken for both deferred probe and in the case where the clock
API genuinely returns a NULL clock.  Other than that it's the kind of
thing that we've done for some other drivers, though it's not good to
have to do this.  Check them for correct behaviour.

The coding style is also not right for the whole patch and there's a
lot of missing error checking.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself
  2015-02-03  3:33 Bo Shen
@ 2015-02-03  7:54 ` Manuel Lauss
  2015-02-03 12:44   ` Mark Brown
  0 siblings, 1 reply; 10+ messages in thread
From: Manuel Lauss @ 2015-02-03  7:54 UTC (permalink / raw)
  To: Bo Shen
  Cc: Mark Brown, Manuel Lauss, Liam Girdwood, Richard Purdie, patches,
	linux-sound, alsa-devel, linux-arm-kernel, LKML

On Tue, Feb 3, 2015 at 4:33 AM, Bo Shen <voice.shen@atmel.com> wrote:
> Let the wm8731 codec to manage clock by itself.
>
> As all at91 related boards have been switch to CCF framework. So, on
> the at91 related boards which use wm8731 will let it manage the clock,
> or else the board use wm8731 is broken.
>
> However, at the same time the wm8731 codec is used on other boards,
> I am sure this change will broken some boards.
>
> For example: poodle and corgi based on PXA SoC (in default configuration
> file, no one use it). DB1200 board which is a mips based board. So I have
> no idea how to fix them.
>
> So, my suggestion is to add CCF check based on the following patch? Any
> idea or suggestions?

What about the patch below?  It makes absence of mclk object non-fatal and
checks if wm8731->mclk is non-NULL before enabling/disabling it.  Works on
my DB1200/DB1300 boards:

diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c
index b115ed8..648b8cd 100644
--- a/sound/soc/codecs/wm8731.c
+++ b/sound/soc/codecs/wm8731.c
@@ -13,6 +13,7 @@
  * published by the Free Software Foundation.
  */

+#include <linux/clk.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/init.h>
@@ -45,6 +46,7 @@ static const char
*wm8731_supply_names[WM8731_NUM_SUPPLIES] = {
 /* codec private data */
 struct wm8731_priv {
     struct regmap *regmap;
+    struct clk *mclk;
     struct regulator_bulk_data supplies[WM8731_NUM_SUPPLIES];
     const struct snd_pcm_hw_constraint_list *constraints;
     unsigned int sysclk;
@@ -389,6 +391,8 @@ static int wm8731_set_dai_sysclk(struct
snd_soc_dai *codec_dai,
     switch (clk_id) {
     case WM8731_SYSCLK_XTAL:
     case WM8731_SYSCLK_MCLK:
+        if (wm8731->mclk && clk_set_rate(wm8731->mclk, freq))
+            return -EINVAL;
         wm8731->sysclk_type = clk_id;
         break;
     default:
@@ -490,6 +494,8 @@ static int wm8731_set_bias_level(struct
snd_soc_codec *codec,

     switch (level) {
     case SND_SOC_BIAS_ON:
+        if (wm8731->mclk)
+            clk_prepare_enable(wm8731->mclk);
         break;
     case SND_SOC_BIAS_PREPARE:
         break;
@@ -508,6 +514,8 @@ static int wm8731_set_bias_level(struct
snd_soc_codec *codec,
         snd_soc_write(codec, WM8731_PWR, reg | 0x0040);
         break;
     case SND_SOC_BIAS_OFF:
+        if (wm8731->mclk)
+            clk_disable_unprepare(wm8731->mclk);
         snd_soc_write(codec, WM8731_PWR, 0xffff);
         regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies),
                        wm8731->supplies);
@@ -666,6 +674,12 @@ static int wm8731_spi_probe(struct spi_device *spi)
     if (wm8731 == NULL)
         return -ENOMEM;

+    wm8731->mclk = devm_clk_get(&spi->dev, "mclk");
+    if (IS_ERR(wm8731->mclk)) {
+        wm8731->mclk = NULL;
+        dev_warn(&spi->dev, "assuming static MCLK\n");
+    }
+
     mutex_init(&wm8731->lock);

     wm8731->regmap = devm_regmap_init_spi(spi, &wm8731_regmap);
@@ -719,6 +733,12 @@ static int wm8731_i2c_probe(struct i2c_client *i2c,

     mutex_init(&wm8731->lock);

+    wm8731->mclk = devm_clk_get(&i2c->dev, "mclk");
+    if (IS_ERR(wm8731->mclk)) {
+        wm8731->mclk = NULL;
+        dev_warn(&i2c->dev, "assuming static MCLK\n");
+    }
+
     wm8731->regmap = devm_regmap_init_i2c(i2c, &wm8731_regmap);
     if (IS_ERR(wm8731->regmap)) {
         ret = PTR_ERR(wm8731->regmap);

-- 

Manuel

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself
@ 2015-02-03  3:33 Bo Shen
  2015-02-03  7:54 ` Manuel Lauss
  0 siblings, 1 reply; 10+ messages in thread
From: Bo Shen @ 2015-02-03  3:33 UTC (permalink / raw)
  To: Mark Brown, Manuel Lauss, Liam Girdwood, Richard Purdie, patches
  Cc: linux-sound, alsa-devel, linux-arm-kernel, linux-kernel, Bo Shen

Let the wm8731 codec to manage clock by itself.

As all at91 related boards have been switch to CCF framework. So, on
the at91 related boards which use wm8731 will let it manage the clock,
or else the board use wm8731 is broken.

However, at the same time the wm8731 codec is used on other boards,
I am sure this change will broken some boards.

For example: poodle and corgi based on PXA SoC (in default configuration
file, no one use it). DB1200 board which is a mips based board. So I have
no idea how to fix them.

So, my suggestion is to add CCF check based on the following patch? Any
idea or suggestions?

Signed-off-by: Bo Shen <voice.shen@atmel.com>
---

 sound/soc/codecs/wm8731.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c
index b9211b4..83f75d66 100644
--- a/sound/soc/codecs/wm8731.c
+++ b/sound/soc/codecs/wm8731.c
@@ -13,6 +13,7 @@
  * published by the Free Software Foundation.
  */
 
+#include <linux/clk.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/init.h>
@@ -45,6 +46,7 @@ static const char *wm8731_supply_names[WM8731_NUM_SUPPLIES] = {
 /* codec private data */
 struct wm8731_priv {
 	struct regmap *regmap;
+	struct clk *mclk;
 	struct regulator_bulk_data supplies[WM8731_NUM_SUPPLIES];
 	const struct snd_pcm_hw_constraint_list *constraints;
 	unsigned int sysclk;
@@ -389,6 +391,8 @@ static int wm8731_set_dai_sysclk(struct snd_soc_dai *codec_dai,
 	switch (clk_id) {
 	case WM8731_SYSCLK_XTAL:
 	case WM8731_SYSCLK_MCLK:
+		if (clk_set_rate(wm8731->mclk, freq))
+			return -EINVAL;
 		wm8731->sysclk_type = clk_id;
 		break;
 	default:
@@ -490,6 +494,7 @@ static int wm8731_set_bias_level(struct snd_soc_codec *codec,
 
 	switch (level) {
 	case SND_SOC_BIAS_ON:
+		clk_prepare_enable(wm8731->mclk);
 		break;
 	case SND_SOC_BIAS_PREPARE:
 		break;
@@ -508,6 +513,7 @@ static int wm8731_set_bias_level(struct snd_soc_codec *codec,
 		snd_soc_write(codec, WM8731_PWR, reg | 0x0040);
 		break;
 	case SND_SOC_BIAS_OFF:
+		clk_disable_unprepare(wm8731->mclk);
 		snd_soc_write(codec, WM8731_PWR, 0xffff);
 		regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies),
 				       wm8731->supplies);
@@ -666,6 +672,13 @@ static int wm8731_spi_probe(struct spi_device *spi)
 	if (wm8731 == NULL)
 		return -ENOMEM;
 
+	wm8731->mclk = devm_clk_get(&spi->dev, "mclk");
+	if (IS_ERR(wm8731->mclk)) {
+		ret = PTR_ERR(wm8731->mclk);
+		dev_err(&spi->dev, "Failed to get MCLK\n");
+		return ret;
+	}
+
 	mutex_init(&wm8731->lock);
 
 	wm8731->regmap = devm_regmap_init_spi(spi, &wm8731_regmap);
@@ -717,6 +730,13 @@ static int wm8731_i2c_probe(struct i2c_client *i2c,
 	if (wm8731 == NULL)
 		return -ENOMEM;
 
+	wm8731->mclk = devm_clk_get(&i2c->dev, "mclk");
+	if (IS_ERR(wm8731->mclk)) {
+		ret = PTR_ERR(wm8731->mclk);
+		dev_err(&i2c->dev, "Failed to get MCLK\n");
+		return ret;
+	}
+
 	wm8731->regmap = devm_regmap_init_i2c(i2c, &wm8731_regmap);
 	if (IS_ERR(wm8731->regmap)) {
 		ret = PTR_ERR(wm8731->regmap);
-- 
2.3.0.rc0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2015-03-16 15:01 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-12  2:17 [RFC PATCH] ASoC: wm8731: let codec to manage clock by itself Songjun Wu
2015-03-16 14:53 ` Charles Keepax
2015-03-16 15:01 ` Mark Brown
  -- strict thread matches above, loose matches on Subject: below --
2015-02-03  3:33 Bo Shen
2015-02-03  7:54 ` Manuel Lauss
2015-02-03 12:44   ` Mark Brown
2015-02-03 14:40     ` Manuel Lauss
2015-02-03 16:21       ` Mark Brown
2015-02-04  3:45         ` Bo Shen
2015-02-04 11:13           ` Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).