Re: [PATCH v2 3/3] ASoC: cros_ec_codec: Add codec driver for Cros EC

2018-12-25 Thread Cheng-yi Chiang
Hi Guenter,
  Thanks a lot for reviewing the patch on holidays.

On Mon, Dec 24, 2018 at 10:48 PM Guenter Roeck  wrote:
>
> On Mon, Dec 24, 2018 at 12:45 AM Cheng-Yi Chiang  
> wrote:
> >
> > Add a codec driver to control ChromeOS EC codec.
> >
> > Use EC Host command to enable/disable I2S recording and control other
> > configurations.
> >
> > Signed-off-by: Cheng-Yi Chiang 
> > ---
> >  Addressed Enric's comments.
> >
> >  Changes in v2:
> >  - Many style fixes. Passed checkpatch.pl --strict.
> >  - Use ChromeOS naming.
> >  - Remove license boilerplate.
> >  - Use u8 instead of uint8_t.
> >  - Remove useless debug messages.
> >  - Remove useless remove ops.
> >  - Remove -EPROBE_DEFER in probe.
> >
> >  MAINTAINERS  |   2 +
> >  sound/soc/codecs/Kconfig |   8 +
> >  sound/soc/codecs/Makefile|   2 +
> >  sound/soc/codecs/cros_ec_codec.c | 458 +++
> >  sound/soc/codecs/cros_ec_codec.h |  21 ++
> >  5 files changed, 491 insertions(+)
> >  create mode 100644 sound/soc/codecs/cros_ec_codec.c
> >  create mode 100644 sound/soc/codecs/cros_ec_codec.h
> >
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 05e1922624e58..d66f80f3252d7 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -3638,8 +3638,10 @@ F:   drivers/platform/chrome/
> >
> >  CHROMEOS EC CODEC DRIVER
> >  M: Cheng-Yi Chiang 
> > +R: Enric Balletbo i Serra 
> >  S: Maintained
> >  F: Documentation/devicetree/bindings/sound/google,cros-ec-codec.txt
> > +F: sound/soc/codecs/cros_ec_codec.*
> >
> >  CIRRUS LOGIC AUDIO CODEC DRIVERS
> >  M: Brian Austin 
> > diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
> > index 87cb9c51e6f5a..0b36428159b71 100644
> > --- a/sound/soc/codecs/Kconfig
> > +++ b/sound/soc/codecs/Kconfig
> > @@ -50,6 +50,7 @@ config SND_SOC_ALL_CODECS
> > select SND_SOC_BT_SCO
> > select SND_SOC_BD28623
> > select SND_SOC_CQ0093VC
> > +   select SND_SOC_CROS_EC_CODEC
> > select SND_SOC_CS35L32 if I2C
> > select SND_SOC_CS35L33 if I2C
> > select SND_SOC_CS35L34 if I2C
> > @@ -457,6 +458,13 @@ config SND_SOC_CPCAP
> >  config SND_SOC_CQ0093VC
> > tristate
> >
> > +config SND_SOC_CROS_EC_CODEC
> > +   tristate "codec driver for ChromeOS EC"
> > +   depends on MFD_CROS_EC
> > +   help
> > + If you say yes here you will get support for the
> > + ChromeOS Embedded Controller's Audio Codec.
> > +
> >  config SND_SOC_CS35L32
> > tristate "Cirrus Logic CS35L32 CODEC"
> > depends on I2C
> > diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
> > index 9bb3346fab2fe..3cfd8f5f61705 100644
> > --- a/sound/soc/codecs/Makefile
> > +++ b/sound/soc/codecs/Makefile
> > @@ -42,6 +42,7 @@ snd-soc-bd28623-objs := bd28623.o
> >  snd-soc-bt-sco-objs := bt-sco.o
> >  snd-soc-cpcap-objs := cpcap.o
> >  snd-soc-cq93vc-objs := cq93vc.o
> > +snd-soc-cros-ec-codec-objs := cros_ec_codec.o
> >  snd-soc-cs35l32-objs := cs35l32.o
> >  snd-soc-cs35l33-objs := cs35l33.o
> >  snd-soc-cs35l34-objs := cs35l34.o
> > @@ -310,6 +311,7 @@ obj-$(CONFIG_SND_SOC_BD28623)   += snd-soc-bd28623.o
> >  obj-$(CONFIG_SND_SOC_BT_SCO)   += snd-soc-bt-sco.o
> >  obj-$(CONFIG_SND_SOC_CQ0093VC) += snd-soc-cq93vc.o
> >  obj-$(CONFIG_SND_SOC_CPCAP)+= snd-soc-cpcap.o
> > +obj-$(CONFIG_SND_SOC_CROS_EC_CODEC)+= snd-soc-cros-ec-codec.o
> >  obj-$(CONFIG_SND_SOC_CS35L32)  += snd-soc-cs35l32.o
> >  obj-$(CONFIG_SND_SOC_CS35L33)  += snd-soc-cs35l33.o
> >  obj-$(CONFIG_SND_SOC_CS35L34)  += snd-soc-cs35l34.o
> > diff --git a/sound/soc/codecs/cros_ec_codec.c 
> > b/sound/soc/codecs/cros_ec_codec.c
> > new file mode 100644
> > index 0..39e61bf46b5c0
> > --- /dev/null
> > +++ b/sound/soc/codecs/cros_ec_codec.c
> > @@ -0,0 +1,458 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * Driver for ChromeOS Embedded Controller codec.
> > + *
> > + * This driver uses the cros-ec interface to communicate with the ChromeOS
> > + * EC for audio function.
> > + */
> > +
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +
> > +#include "cros_ec_codec.h"
> > +
> > +#define MAX_GAIN 43
> > +
> > +#define DRV_NAME "cros-ec-codec"
> > +
> > +static const DECLARE_TLV_DB_SCALE(ec_mic_gain_tlv, 0, 100, 0);
> > +/*
> > + * Wrapper for EC command.
> > + */
> > +static int ec_command(struct snd_soc_component *component, int version,
> > + int command, u8 *outdata, int outsize,
> > + u8 *indata, int insize)
> > +{
> > +   struct cros_ec_codec_data *codec_data =
> > +   snd_soc_component_get_drvdata(component);
> > +   struct cros_ec_device *ec_device = codec_data->ec_device;
> > +   struct cros_ec_command *msg;
> > +   int ret;
> > +
> > +   msg = kzalloc(sizeof(*msg) + max(insi

Re: [PATCH v2 3/3] ASoC: cros_ec_codec: Add codec driver for Cros EC

2018-12-24 Thread Guenter Roeck
On Mon, Dec 24, 2018 at 12:45 AM Cheng-Yi Chiang  wrote:
>
> Add a codec driver to control ChromeOS EC codec.
>
> Use EC Host command to enable/disable I2S recording and control other
> configurations.
>
> Signed-off-by: Cheng-Yi Chiang 
> ---
>  Addressed Enric's comments.
>
>  Changes in v2:
>  - Many style fixes. Passed checkpatch.pl --strict.
>  - Use ChromeOS naming.
>  - Remove license boilerplate.
>  - Use u8 instead of uint8_t.
>  - Remove useless debug messages.
>  - Remove useless remove ops.
>  - Remove -EPROBE_DEFER in probe.
>
>  MAINTAINERS  |   2 +
>  sound/soc/codecs/Kconfig |   8 +
>  sound/soc/codecs/Makefile|   2 +
>  sound/soc/codecs/cros_ec_codec.c | 458 +++
>  sound/soc/codecs/cros_ec_codec.h |  21 ++
>  5 files changed, 491 insertions(+)
>  create mode 100644 sound/soc/codecs/cros_ec_codec.c
>  create mode 100644 sound/soc/codecs/cros_ec_codec.h
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 05e1922624e58..d66f80f3252d7 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -3638,8 +3638,10 @@ F:   drivers/platform/chrome/
>
>  CHROMEOS EC CODEC DRIVER
>  M: Cheng-Yi Chiang 
> +R: Enric Balletbo i Serra 
>  S: Maintained
>  F: Documentation/devicetree/bindings/sound/google,cros-ec-codec.txt
> +F: sound/soc/codecs/cros_ec_codec.*
>
>  CIRRUS LOGIC AUDIO CODEC DRIVERS
>  M: Brian Austin 
> diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
> index 87cb9c51e6f5a..0b36428159b71 100644
> --- a/sound/soc/codecs/Kconfig
> +++ b/sound/soc/codecs/Kconfig
> @@ -50,6 +50,7 @@ config SND_SOC_ALL_CODECS
> select SND_SOC_BT_SCO
> select SND_SOC_BD28623
> select SND_SOC_CQ0093VC
> +   select SND_SOC_CROS_EC_CODEC
> select SND_SOC_CS35L32 if I2C
> select SND_SOC_CS35L33 if I2C
> select SND_SOC_CS35L34 if I2C
> @@ -457,6 +458,13 @@ config SND_SOC_CPCAP
>  config SND_SOC_CQ0093VC
> tristate
>
> +config SND_SOC_CROS_EC_CODEC
> +   tristate "codec driver for ChromeOS EC"
> +   depends on MFD_CROS_EC
> +   help
> + If you say yes here you will get support for the
> + ChromeOS Embedded Controller's Audio Codec.
> +
>  config SND_SOC_CS35L32
> tristate "Cirrus Logic CS35L32 CODEC"
> depends on I2C
> diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
> index 9bb3346fab2fe..3cfd8f5f61705 100644
> --- a/sound/soc/codecs/Makefile
> +++ b/sound/soc/codecs/Makefile
> @@ -42,6 +42,7 @@ snd-soc-bd28623-objs := bd28623.o
>  snd-soc-bt-sco-objs := bt-sco.o
>  snd-soc-cpcap-objs := cpcap.o
>  snd-soc-cq93vc-objs := cq93vc.o
> +snd-soc-cros-ec-codec-objs := cros_ec_codec.o
>  snd-soc-cs35l32-objs := cs35l32.o
>  snd-soc-cs35l33-objs := cs35l33.o
>  snd-soc-cs35l34-objs := cs35l34.o
> @@ -310,6 +311,7 @@ obj-$(CONFIG_SND_SOC_BD28623)   += snd-soc-bd28623.o
>  obj-$(CONFIG_SND_SOC_BT_SCO)   += snd-soc-bt-sco.o
>  obj-$(CONFIG_SND_SOC_CQ0093VC) += snd-soc-cq93vc.o
>  obj-$(CONFIG_SND_SOC_CPCAP)+= snd-soc-cpcap.o
> +obj-$(CONFIG_SND_SOC_CROS_EC_CODEC)+= snd-soc-cros-ec-codec.o
>  obj-$(CONFIG_SND_SOC_CS35L32)  += snd-soc-cs35l32.o
>  obj-$(CONFIG_SND_SOC_CS35L33)  += snd-soc-cs35l33.o
>  obj-$(CONFIG_SND_SOC_CS35L34)  += snd-soc-cs35l34.o
> diff --git a/sound/soc/codecs/cros_ec_codec.c 
> b/sound/soc/codecs/cros_ec_codec.c
> new file mode 100644
> index 0..39e61bf46b5c0
> --- /dev/null
> +++ b/sound/soc/codecs/cros_ec_codec.c
> @@ -0,0 +1,458 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Driver for ChromeOS Embedded Controller codec.
> + *
> + * This driver uses the cros-ec interface to communicate with the ChromeOS
> + * EC for audio function.
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#include "cros_ec_codec.h"
> +
> +#define MAX_GAIN 43
> +
> +#define DRV_NAME "cros-ec-codec"
> +
> +static const DECLARE_TLV_DB_SCALE(ec_mic_gain_tlv, 0, 100, 0);
> +/*
> + * Wrapper for EC command.
> + */
> +static int ec_command(struct snd_soc_component *component, int version,
> + int command, u8 *outdata, int outsize,
> + u8 *indata, int insize)
> +{
> +   struct cros_ec_codec_data *codec_data =
> +   snd_soc_component_get_drvdata(component);
> +   struct cros_ec_device *ec_device = codec_data->ec_device;
> +   struct cros_ec_command *msg;
> +   int ret;
> +
> +   msg = kzalloc(sizeof(*msg) + max(insize, outsize), GFP_KERNEL);
> +   if (!msg)
> +   return -ENOMEM;
> +
> +   msg->version = version;
> +   msg->command = command;
> +   msg->outsize = outsize;
> +   msg->insize = insize;
> +
> +   if (outsize)
> +   memcpy(msg->data, outdata, outsize);
> +
> +   ret = cros_ec_cmd_xfer_status(ec_device, msg);
> +   if (ret > 0 && insize)
> +   

[PATCH v2 3/3] ASoC: cros_ec_codec: Add codec driver for Cros EC

2018-12-24 Thread Cheng-Yi Chiang
Add a codec driver to control ChromeOS EC codec.

Use EC Host command to enable/disable I2S recording and control other
configurations.

Signed-off-by: Cheng-Yi Chiang 
---
 Addressed Enric's comments.

 Changes in v2:
 - Many style fixes. Passed checkpatch.pl --strict.
 - Use ChromeOS naming.
 - Remove license boilerplate.
 - Use u8 instead of uint8_t.
 - Remove useless debug messages.
 - Remove useless remove ops.
 - Remove -EPROBE_DEFER in probe.

 MAINTAINERS  |   2 +
 sound/soc/codecs/Kconfig |   8 +
 sound/soc/codecs/Makefile|   2 +
 sound/soc/codecs/cros_ec_codec.c | 458 +++
 sound/soc/codecs/cros_ec_codec.h |  21 ++
 5 files changed, 491 insertions(+)
 create mode 100644 sound/soc/codecs/cros_ec_codec.c
 create mode 100644 sound/soc/codecs/cros_ec_codec.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 05e1922624e58..d66f80f3252d7 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3638,8 +3638,10 @@ F:   drivers/platform/chrome/
 
 CHROMEOS EC CODEC DRIVER
 M: Cheng-Yi Chiang 
+R: Enric Balletbo i Serra 
 S: Maintained
 F: Documentation/devicetree/bindings/sound/google,cros-ec-codec.txt
+F: sound/soc/codecs/cros_ec_codec.*
 
 CIRRUS LOGIC AUDIO CODEC DRIVERS
 M: Brian Austin 
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index 87cb9c51e6f5a..0b36428159b71 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -50,6 +50,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_BT_SCO
select SND_SOC_BD28623
select SND_SOC_CQ0093VC
+   select SND_SOC_CROS_EC_CODEC
select SND_SOC_CS35L32 if I2C
select SND_SOC_CS35L33 if I2C
select SND_SOC_CS35L34 if I2C
@@ -457,6 +458,13 @@ config SND_SOC_CPCAP
 config SND_SOC_CQ0093VC
tristate
 
+config SND_SOC_CROS_EC_CODEC
+   tristate "codec driver for ChromeOS EC"
+   depends on MFD_CROS_EC
+   help
+ If you say yes here you will get support for the
+ ChromeOS Embedded Controller's Audio Codec.
+
 config SND_SOC_CS35L32
tristate "Cirrus Logic CS35L32 CODEC"
depends on I2C
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 9bb3346fab2fe..3cfd8f5f61705 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -42,6 +42,7 @@ snd-soc-bd28623-objs := bd28623.o
 snd-soc-bt-sco-objs := bt-sco.o
 snd-soc-cpcap-objs := cpcap.o
 snd-soc-cq93vc-objs := cq93vc.o
+snd-soc-cros-ec-codec-objs := cros_ec_codec.o
 snd-soc-cs35l32-objs := cs35l32.o
 snd-soc-cs35l33-objs := cs35l33.o
 snd-soc-cs35l34-objs := cs35l34.o
@@ -310,6 +311,7 @@ obj-$(CONFIG_SND_SOC_BD28623)   += snd-soc-bd28623.o
 obj-$(CONFIG_SND_SOC_BT_SCO)   += snd-soc-bt-sco.o
 obj-$(CONFIG_SND_SOC_CQ0093VC) += snd-soc-cq93vc.o
 obj-$(CONFIG_SND_SOC_CPCAP)+= snd-soc-cpcap.o
+obj-$(CONFIG_SND_SOC_CROS_EC_CODEC)+= snd-soc-cros-ec-codec.o
 obj-$(CONFIG_SND_SOC_CS35L32)  += snd-soc-cs35l32.o
 obj-$(CONFIG_SND_SOC_CS35L33)  += snd-soc-cs35l33.o
 obj-$(CONFIG_SND_SOC_CS35L34)  += snd-soc-cs35l34.o
diff --git a/sound/soc/codecs/cros_ec_codec.c b/sound/soc/codecs/cros_ec_codec.c
new file mode 100644
index 0..39e61bf46b5c0
--- /dev/null
+++ b/sound/soc/codecs/cros_ec_codec.c
@@ -0,0 +1,458 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Driver for ChromeOS Embedded Controller codec.
+ *
+ * This driver uses the cros-ec interface to communicate with the ChromeOS
+ * EC for audio function.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "cros_ec_codec.h"
+
+#define MAX_GAIN 43
+
+#define DRV_NAME "cros-ec-codec"
+
+static const DECLARE_TLV_DB_SCALE(ec_mic_gain_tlv, 0, 100, 0);
+/*
+ * Wrapper for EC command.
+ */
+static int ec_command(struct snd_soc_component *component, int version,
+ int command, u8 *outdata, int outsize,
+ u8 *indata, int insize)
+{
+   struct cros_ec_codec_data *codec_data =
+   snd_soc_component_get_drvdata(component);
+   struct cros_ec_device *ec_device = codec_data->ec_device;
+   struct cros_ec_command *msg;
+   int ret;
+
+   msg = kzalloc(sizeof(*msg) + max(insize, outsize), GFP_KERNEL);
+   if (!msg)
+   return -ENOMEM;
+
+   msg->version = version;
+   msg->command = command;
+   msg->outsize = outsize;
+   msg->insize = insize;
+
+   if (outsize)
+   memcpy(msg->data, outdata, outsize);
+
+   ret = cros_ec_cmd_xfer_status(ec_device, msg);
+   if (ret > 0 && insize)
+   memcpy(indata, msg->data, insize);
+
+   kfree(msg);
+   return ret;
+}
+
+static int set_i2s_config(struct snd_soc_component *component,
+ enum ec_i2s_config i2s_config)
+{
+   struct ec_param_codec_i2s param;
+   int ret;
+
+   dev_dbg(component->dev, "%s set I2S format to %u\n", __func__,