Commit 6f1a7767 authored by Mark Brown's avatar Mark Brown

Merge branch 'for-3.1' into for-3.2

parents 63010634 f99847a6
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
#include <plat/iic.h> #include <plat/iic.h>
#include <plat/pm.h> #include <plat/pm.h>
#include <sound/wm8915.h> #include <sound/wm8996.h>
#include <sound/wm8962.h> #include <sound/wm8962.h>
#include <sound/wm9081.h> #include <sound/wm9081.h>
...@@ -614,7 +614,7 @@ static struct wm831x_pdata glenfarclas_pmic_pdata __initdata = { ...@@ -614,7 +614,7 @@ static struct wm831x_pdata glenfarclas_pmic_pdata __initdata = {
.disable_touch = true, .disable_touch = true,
}; };
static struct wm8915_retune_mobile_config wm8915_retune[] = { static struct wm8996_retune_mobile_config wm8996_retune[] = {
{ {
.name = "Sub LPF", .name = "Sub LPF",
.rate = 48000, .rate = 48000,
...@@ -635,12 +635,12 @@ static struct wm8915_retune_mobile_config wm8915_retune[] = { ...@@ -635,12 +635,12 @@ static struct wm8915_retune_mobile_config wm8915_retune[] = {
}, },
}; };
static struct wm8915_pdata wm8915_pdata __initdata = { static struct wm8996_pdata wm8996_pdata __initdata = {
.ldo_ena = S3C64XX_GPN(7), .ldo_ena = S3C64XX_GPN(7),
.gpio_base = CODEC_GPIO_BASE, .gpio_base = CODEC_GPIO_BASE,
.micdet_def = 1, .micdet_def = 1,
.inl_mode = WM8915_DIFFERRENTIAL_1, .inl_mode = WM8996_DIFFERRENTIAL_1,
.inr_mode = WM8915_DIFFERRENTIAL_1, .inr_mode = WM8996_DIFFERRENTIAL_1,
.irq_flags = IRQF_TRIGGER_RISING, .irq_flags = IRQF_TRIGGER_RISING,
...@@ -652,8 +652,8 @@ static struct wm8915_pdata wm8915_pdata __initdata = { ...@@ -652,8 +652,8 @@ static struct wm8915_pdata wm8915_pdata __initdata = {
0x020e, /* GPIO5 == CLKOUT */ 0x020e, /* GPIO5 == CLKOUT */
}, },
.retune_mobile_cfgs = wm8915_retune, .retune_mobile_cfgs = wm8996_retune,
.num_retune_mobile_cfgs = ARRAY_SIZE(wm8915_retune), .num_retune_mobile_cfgs = ARRAY_SIZE(wm8996_retune),
}; };
static struct wm8962_pdata wm8962_pdata __initdata = { static struct wm8962_pdata wm8962_pdata __initdata = {
...@@ -679,8 +679,8 @@ static struct i2c_board_info i2c_devs1[] __initdata = { ...@@ -679,8 +679,8 @@ static struct i2c_board_info i2c_devs1[] __initdata = {
.platform_data = &glenfarclas_pmic_pdata }, .platform_data = &glenfarclas_pmic_pdata },
{ I2C_BOARD_INFO("wm1250-ev1", 0x27) }, { I2C_BOARD_INFO("wm1250-ev1", 0x27) },
{ I2C_BOARD_INFO("wm8915", 0x1a), { I2C_BOARD_INFO("wm8996", 0x1a),
.platform_data = &wm8915_pdata, .platform_data = &wm8996_pdata,
.irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2, .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2,
}, },
{ I2C_BOARD_INFO("wm9081", 0x6c), { I2C_BOARD_INFO("wm9081", 0x6c),
......
/* /*
* linux/sound/wm8915.h -- Platform data for WM8915 * linux/sound/wm8996.h -- Platform data for WM8996
* *
* Copyright 2011 Wolfson Microelectronics. PLC. * Copyright 2011 Wolfson Microelectronics. PLC.
* *
...@@ -8,14 +8,14 @@ ...@@ -8,14 +8,14 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#ifndef __LINUX_SND_WM8903_H #ifndef __LINUX_SND_WM8996_H
#define __LINUX_SND_WM8903_H #define __LINUX_SND_WM8996_H
enum wm8915_inmode { enum wm8996_inmode {
WM8915_DIFFERRENTIAL_1 = 0, /* IN1xP - IN1xN */ WM8996_DIFFERRENTIAL_1 = 0, /* IN1xP - IN1xN */
WM8915_INVERTING = 1, /* IN1xN */ WM8996_INVERTING = 1, /* IN1xN */
WM8915_NON_INVERTING = 2, /* IN1xP */ WM8996_NON_INVERTING = 2, /* IN1xP */
WM8915_DIFFERENTIAL_2 = 3, /* IN2xP - IN2xP */ WM8996_DIFFERENTIAL_2 = 3, /* IN2xP - IN2xP */
}; };
/** /**
...@@ -25,23 +25,23 @@ enum wm8915_inmode { ...@@ -25,23 +25,23 @@ enum wm8915_inmode {
* Configurations are expected to be generated using the ReTune Mobile * Configurations are expected to be generated using the ReTune Mobile
* control panel in WISCE - see http://www.wolfsonmicro.com/wisce/ * control panel in WISCE - see http://www.wolfsonmicro.com/wisce/
*/ */
struct wm8915_retune_mobile_config { struct wm8996_retune_mobile_config {
const char *name; const char *name;
int rate; int rate;
u16 regs[20]; u16 regs[20];
}; };
#define WM8915_SET_DEFAULT 0x10000 #define WM8996_SET_DEFAULT 0x10000
struct wm8915_pdata { struct wm8996_pdata {
int irq_flags; /** Set IRQ trigger flags; default active low */ int irq_flags; /** Set IRQ trigger flags; default active low */
int ldo_ena; /** GPIO for LDO1; -1 for none */ int ldo_ena; /** GPIO for LDO1; -1 for none */
int micdet_def; /** Default MICDET_SRC/HP1FB_SRC/MICD_BIAS */ int micdet_def; /** Default MICDET_SRC/HP1FB_SRC/MICD_BIAS */
enum wm8915_inmode inl_mode; enum wm8996_inmode inl_mode;
enum wm8915_inmode inr_mode; enum wm8996_inmode inr_mode;
u32 spkmute_seq; /** Value for register 0x802 */ u32 spkmute_seq; /** Value for register 0x802 */
...@@ -49,7 +49,7 @@ struct wm8915_pdata { ...@@ -49,7 +49,7 @@ struct wm8915_pdata {
u32 gpio_default[5]; u32 gpio_default[5];
int num_retune_mobile_cfgs; int num_retune_mobile_cfgs;
struct wm8915_retune_mobile_config *retune_mobile_cfgs; struct wm8996_retune_mobile_config *retune_mobile_cfgs;
}; };
#endif #endif
...@@ -78,7 +78,6 @@ config SND_SOC_ALL_CODECS ...@@ -78,7 +78,6 @@ config SND_SOC_ALL_CODECS
select SND_SOC_WM8900 if I2C select SND_SOC_WM8900 if I2C
select SND_SOC_WM8903 if I2C select SND_SOC_WM8903 if I2C
select SND_SOC_WM8904 if I2C select SND_SOC_WM8904 if I2C
select SND_SOC_WM8915 if I2C
select SND_SOC_WM8940 if I2C select SND_SOC_WM8940 if I2C
select SND_SOC_WM8955 if I2C select SND_SOC_WM8955 if I2C
select SND_SOC_WM8960 if I2C select SND_SOC_WM8960 if I2C
...@@ -95,6 +94,7 @@ config SND_SOC_ALL_CODECS ...@@ -95,6 +94,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_WM8993 if I2C select SND_SOC_WM8993 if I2C
select SND_SOC_WM8994 if MFD_WM8994 select SND_SOC_WM8994 if MFD_WM8994
select SND_SOC_WM8995 if SND_SOC_I2C_AND_SPI select SND_SOC_WM8995 if SND_SOC_I2C_AND_SPI
select SND_SOC_WM8996 if I2C
select SND_SOC_WM9081 if I2C select SND_SOC_WM9081 if I2C
select SND_SOC_WM9090 if I2C select SND_SOC_WM9090 if I2C
select SND_SOC_WM9705 if SND_SOC_AC97_BUS select SND_SOC_WM9705 if SND_SOC_AC97_BUS
...@@ -329,9 +329,6 @@ config SND_SOC_WM8903 ...@@ -329,9 +329,6 @@ config SND_SOC_WM8903
config SND_SOC_WM8904 config SND_SOC_WM8904
tristate tristate
config SND_SOC_WM8915
tristate
config SND_SOC_WM8940 config SND_SOC_WM8940
tristate tristate
...@@ -380,6 +377,9 @@ config SND_SOC_WM8994 ...@@ -380,6 +377,9 @@ config SND_SOC_WM8994
config SND_SOC_WM8995 config SND_SOC_WM8995
tristate tristate
config SND_SOC_WM8996
tristate
config SND_SOC_WM9081 config SND_SOC_WM9081
tristate tristate
......
...@@ -63,7 +63,7 @@ snd-soc-wm8804-objs := wm8804.o ...@@ -63,7 +63,7 @@ snd-soc-wm8804-objs := wm8804.o
snd-soc-wm8900-objs := wm8900.o snd-soc-wm8900-objs := wm8900.o
snd-soc-wm8903-objs := wm8903.o snd-soc-wm8903-objs := wm8903.o
snd-soc-wm8904-objs := wm8904.o snd-soc-wm8904-objs := wm8904.o
snd-soc-wm8915-objs := wm8915.o snd-soc-wm8996-objs := wm8996.o
snd-soc-wm8940-objs := wm8940.o snd-soc-wm8940-objs := wm8940.o
snd-soc-wm8955-objs := wm8955.o snd-soc-wm8955-objs := wm8955.o
snd-soc-wm8960-objs := wm8960.o snd-soc-wm8960-objs := wm8960.o
...@@ -160,7 +160,7 @@ obj-$(CONFIG_SND_SOC_WM8804) += snd-soc-wm8804.o ...@@ -160,7 +160,7 @@ obj-$(CONFIG_SND_SOC_WM8804) += snd-soc-wm8804.o
obj-$(CONFIG_SND_SOC_WM8900) += snd-soc-wm8900.o obj-$(CONFIG_SND_SOC_WM8900) += snd-soc-wm8900.o
obj-$(CONFIG_SND_SOC_WM8903) += snd-soc-wm8903.o obj-$(CONFIG_SND_SOC_WM8903) += snd-soc-wm8903.o
obj-$(CONFIG_SND_SOC_WM8904) += snd-soc-wm8904.o obj-$(CONFIG_SND_SOC_WM8904) += snd-soc-wm8904.o
obj-$(CONFIG_SND_SOC_WM8915) += snd-soc-wm8915.o obj-$(CONFIG_SND_SOC_WM8996) += snd-soc-wm8996.o
obj-$(CONFIG_SND_SOC_WM8940) += snd-soc-wm8940.o obj-$(CONFIG_SND_SOC_WM8940) += snd-soc-wm8940.o
obj-$(CONFIG_SND_SOC_WM8955) += snd-soc-wm8955.o obj-$(CONFIG_SND_SOC_WM8955) += snd-soc-wm8955.o
obj-$(CONFIG_SND_SOC_WM8960) += snd-soc-wm8960.o obj-$(CONFIG_SND_SOC_WM8960) += snd-soc-wm8960.o
......
...@@ -2046,8 +2046,13 @@ static int wm8903_probe(struct snd_soc_codec *codec) ...@@ -2046,8 +2046,13 @@ static int wm8903_probe(struct snd_soc_codec *codec)
/* power down chip */ /* power down chip */
static int wm8903_remove(struct snd_soc_codec *codec) static int wm8903_remove(struct snd_soc_codec *codec)
{ {
struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
wm8903_free_gpio(codec); wm8903_free_gpio(codec);
wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF); wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF);
if (wm8903->irq)
free_irq(wm8903->irq, codec);
return 0; return 0;
} }
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -183,7 +183,7 @@ config SND_SOC_SPEYSIDE ...@@ -183,7 +183,7 @@ config SND_SOC_SPEYSIDE
tristate "Audio support for Wolfson Speyside" tristate "Audio support for Wolfson Speyside"
depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410 depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410
select SND_SAMSUNG_I2S select SND_SAMSUNG_I2S
select SND_SOC_WM8915 select SND_SOC_WM8996
select SND_SOC_WM9081 select SND_SOC_WM9081
config SND_SOC_SPEYSIDE_WM8962 config SND_SOC_SPEYSIDE_WM8962
......
...@@ -14,10 +14,10 @@ ...@@ -14,10 +14,10 @@
#include <sound/jack.h> #include <sound/jack.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include "../codecs/wm8915.h" #include "../codecs/wm8996.h"
#include "../codecs/wm9081.h" #include "../codecs/wm9081.h"
#define WM8915_HPSEL_GPIO 214 #define WM8996_HPSEL_GPIO 214
static int speyside_set_bias_level(struct snd_soc_card *card, static int speyside_set_bias_level(struct snd_soc_card *card,
struct snd_soc_dapm_context *dapm, struct snd_soc_dapm_context *dapm,
...@@ -31,12 +31,12 @@ static int speyside_set_bias_level(struct snd_soc_card *card, ...@@ -31,12 +31,12 @@ static int speyside_set_bias_level(struct snd_soc_card *card,
switch (level) { switch (level) {
case SND_SOC_BIAS_STANDBY: case SND_SOC_BIAS_STANDBY:
ret = snd_soc_dai_set_sysclk(codec_dai, WM8915_SYSCLK_MCLK2, ret = snd_soc_dai_set_sysclk(codec_dai, WM8996_SYSCLK_MCLK2,
32768, SND_SOC_CLOCK_IN); 32768, SND_SOC_CLOCK_IN);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = snd_soc_dai_set_pll(codec_dai, WM8915_FLL_MCLK2, ret = snd_soc_dai_set_pll(codec_dai, WM8996_FLL_MCLK2,
0, 0, 0); 0, 0, 0);
if (ret < 0) { if (ret < 0) {
pr_err("Failed to stop FLL\n"); pr_err("Failed to stop FLL\n");
...@@ -65,7 +65,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card, ...@@ -65,7 +65,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card,
case SND_SOC_BIAS_PREPARE: case SND_SOC_BIAS_PREPARE:
if (card->dapm.bias_level == SND_SOC_BIAS_STANDBY) { if (card->dapm.bias_level == SND_SOC_BIAS_STANDBY) {
ret = snd_soc_dai_set_pll(codec_dai, 0, ret = snd_soc_dai_set_pll(codec_dai, 0,
WM8915_FLL_MCLK2, WM8996_FLL_MCLK2,
32768, 48000 * 256); 32768, 48000 * 256);
if (ret < 0) { if (ret < 0) {
pr_err("Failed to start FLL\n"); pr_err("Failed to start FLL\n");
...@@ -73,7 +73,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card, ...@@ -73,7 +73,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card,
} }
ret = snd_soc_dai_set_sysclk(codec_dai, ret = snd_soc_dai_set_sysclk(codec_dai,
WM8915_SYSCLK_FLL, WM8996_SYSCLK_FLL,
48000 * 256, 48000 * 256,
SND_SOC_CLOCK_IN); SND_SOC_CLOCK_IN);
if (ret < 0) if (ret < 0)
...@@ -149,26 +149,26 @@ static void speyside_set_polarity(struct snd_soc_codec *codec, ...@@ -149,26 +149,26 @@ static void speyside_set_polarity(struct snd_soc_codec *codec,
int polarity) int polarity)
{ {
speyside_jack_polarity = !polarity; speyside_jack_polarity = !polarity;
gpio_direction_output(WM8915_HPSEL_GPIO, speyside_jack_polarity); gpio_direction_output(WM8996_HPSEL_GPIO, speyside_jack_polarity);
/* Re-run DAPM to make sure we're using the correct mic bias */ /* Re-run DAPM to make sure we're using the correct mic bias */
snd_soc_dapm_sync(&codec->dapm); snd_soc_dapm_sync(&codec->dapm);
} }
static int speyside_wm8915_init(struct snd_soc_pcm_runtime *rtd) static int speyside_wm8996_init(struct snd_soc_pcm_runtime *rtd)
{ {
struct snd_soc_dai *dai = rtd->codec_dai; struct snd_soc_dai *dai = rtd->codec_dai;
struct snd_soc_codec *codec = rtd->codec; struct snd_soc_codec *codec = rtd->codec;
int ret; int ret;
ret = snd_soc_dai_set_sysclk(dai, WM8915_SYSCLK_MCLK2, 32768, 0); ret = snd_soc_dai_set_sysclk(dai, WM8996_SYSCLK_MCLK2, 32768, 0);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = gpio_request(WM8915_HPSEL_GPIO, "HP_SEL"); ret = gpio_request(WM8996_HPSEL_GPIO, "HP_SEL");
if (ret != 0) if (ret != 0)
pr_err("Failed to request HP_SEL GPIO: %d\n", ret); pr_err("Failed to request HP_SEL GPIO: %d\n", ret);
gpio_direction_output(WM8915_HPSEL_GPIO, speyside_jack_polarity); gpio_direction_output(WM8996_HPSEL_GPIO, speyside_jack_polarity);
ret = snd_soc_jack_new(codec, "Headset", ret = snd_soc_jack_new(codec, "Headset",
SND_JACK_HEADSET | SND_JACK_BTN_0, SND_JACK_HEADSET | SND_JACK_BTN_0,
...@@ -182,7 +182,7 @@ static int speyside_wm8915_init(struct snd_soc_pcm_runtime *rtd) ...@@ -182,7 +182,7 @@ static int speyside_wm8915_init(struct snd_soc_pcm_runtime *rtd)
if (ret) if (ret)
return ret; return ret;
wm8915_detect(codec, &speyside_headset, speyside_set_polarity); wm8996_detect(codec, &speyside_headset, speyside_set_polarity);
return 0; return 0;
} }
...@@ -205,16 +205,16 @@ static struct snd_soc_dai_link speyside_dai[] = { ...@@ -205,16 +205,16 @@ static struct snd_soc_dai_link speyside_dai[] = {
.name = "CPU", .name = "CPU",
.stream_name = "CPU", .stream_name = "CPU",
.cpu_dai_name = "samsung-i2s.0", .cpu_dai_name = "samsung-i2s.0",
.codec_dai_name = "wm8915-aif1", .codec_dai_name = "wm8996-aif1",
.platform_name = "samsung-audio", .platform_name = "samsung-audio",
.codec_name = "wm8915.1-001a", .codec_name = "wm8996.1-001a",
.init = speyside_wm8915_init, .init = speyside_wm8996_init,
.ops = &speyside_ops, .ops = &speyside_ops,
}, },
{ {
.name = "Baseband", .name = "Baseband",
.stream_name = "Baseband", .stream_name = "Baseband",
.cpu_dai_name = "wm8915-aif2", .cpu_dai_name = "wm8996-aif2",
.codec_dai_name = "wm1250-ev1", .codec_dai_name = "wm1250-ev1",
.codec_name = "wm1250-ev1.1-0027", .codec_name = "wm1250-ev1.1-0027",
.ops = &speyside_ops, .ops = &speyside_ops,
......
...@@ -309,9 +309,14 @@ static int tegra_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream) ...@@ -309,9 +309,14 @@ static int tegra_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
static void tegra_pcm_deallocate_dma_buffer(struct snd_pcm *pcm, int stream) static void tegra_pcm_deallocate_dma_buffer(struct snd_pcm *pcm, int stream)
{ {
struct snd_pcm_substream *substream = pcm->streams[stream].substream; struct snd_pcm_substream *substream;
struct snd_dma_buffer *buf = &substream->dma_buffer; struct snd_dma_buffer *buf;
substream = pcm->streams[stream].substream;
if (!substream)
return;
buf = &substream->dma_buffer;
if (!buf->area) if (!buf->area)
return; return;
......
...@@ -56,6 +56,7 @@ ...@@ -56,6 +56,7 @@
#define GPIO_HP_MUTE BIT(1) #define GPIO_HP_MUTE BIT(1)
#define GPIO_INT_MIC_EN BIT(2) #define GPIO_INT_MIC_EN BIT(2)
#define GPIO_EXT_MIC_EN BIT(3) #define GPIO_EXT_MIC_EN BIT(3)
#define GPIO_HP_DET BIT(4)
struct tegra_wm8903 { struct tegra_wm8903 {
struct tegra_asoc_utils_data util_data; struct tegra_asoc_utils_data util_data;
...@@ -304,6 +305,7 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd) ...@@ -304,6 +305,7 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)
snd_soc_jack_add_gpios(&tegra_wm8903_hp_jack, snd_soc_jack_add_gpios(&tegra_wm8903_hp_jack,
1, 1,
&tegra_wm8903_hp_jack_gpio); &tegra_wm8903_hp_jack_gpio);
machine->gpio_requested |= GPIO_HP_DET;
} }
snd_soc_jack_new(codec, "Mic Jack", SND_JACK_MICROPHONE, snd_soc_jack_new(codec, "Mic Jack", SND_JACK_MICROPHONE,
...@@ -429,10 +431,10 @@ static int __devexit tegra_wm8903_driver_remove(struct platform_device *pdev) ...@@ -429,10 +431,10 @@ static int __devexit tegra_wm8903_driver_remove(struct platform_device *pdev)
struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card); struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card);
struct tegra_wm8903_platform_data *pdata = machine->pdata; struct tegra_wm8903_platform_data *pdata = machine->pdata;
snd_soc_unregister_card(card); if (machine->gpio_requested & GPIO_HP_DET)
snd_soc_jack_free_gpios(&tegra_wm8903_hp_jack,
tegra_asoc_utils_fini(&machine->util_data); 1,
&tegra_wm8903_hp_jack_gpio);
if (machine->gpio_requested & GPIO_EXT_MIC_EN) if (machine->gpio_requested & GPIO_EXT_MIC_EN)
gpio_free(pdata->gpio_ext_mic_en); gpio_free(pdata->gpio_ext_mic_en);
if (machine->gpio_requested & GPIO_INT_MIC_EN) if (machine->gpio_requested & GPIO_INT_MIC_EN)
...@@ -441,6 +443,11 @@ static int __devexit tegra_wm8903_driver_remove(struct platform_device *pdev) ...@@ -441,6 +443,11 @@ static int __devexit tegra_wm8903_driver_remove(struct platform_device *pdev)
gpio_free(pdata->gpio_hp_mute); gpio_free(pdata->gpio_hp_mute);
if (machine->gpio_requested & GPIO_SPKR_EN) if (machine->gpio_requested & GPIO_SPKR_EN)
gpio_free(pdata->gpio_spkr_en); gpio_free(pdata->gpio_spkr_en);
machine->gpio_requested = 0;
snd_soc_unregister_card(card);
tegra_asoc_utils_fini(&machine->util_data);
kfree(machine); kfree(machine);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment