Received: by 10.223.176.5 with SMTP id f5csp1604984wra; Wed, 31 Jan 2018 08:49:22 -0800 (PST) X-Google-Smtp-Source: AH8x226Mn1KodGRx9ncjWo13aGEld+AfMbh3ZpHOBcG0HI8b7xFxDuR7qGs85ACP0qdTCbKPi3pO X-Received: by 2002:a17:902:ad05:: with SMTP id i5-v6mr13776568plr.139.1517417362865; Wed, 31 Jan 2018 08:49:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517417362; cv=none; d=google.com; s=arc-20160816; b=L8LyAX2wIbOApmjs8QJZ3S1cwc1CcBaerL8/fC/KhYgXsxpX311edtufrlUKmgNuVE Lzs7BiAT7Ah7zeDZenImfcMsl/ByyrHVT3NGCVmEHkHV7S/a7DByCUWrmvYq+m3/89ug uSU+jybx8e0m4pGc5vGBFZTiBNF64tuV5v8+GolAE1dJw1vtaMxsGAptM2Nuefr8F98A PLjRGY0LAVC8eZiwDJDUVB+nPTjDIlJ3x3OmdOWffKeOzcsvyu3F4nAExzK9yzwqMZAN fn8ZH6XCasrEl6XYs3p2kQz0PAIWlG6aL5h1ZSx1ctzvDHNdXq0fm9kJFig+K/l5Q4Gx tUHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=UJebG4hKi9sfRsem1KMxAn42TUiSW4Z03O2O30eu6V0=; b=bkzxEZ8/eCFL0Yyxf+KtqHJc5OJJAS2sq0RN3W1kpArNSP0kTslY+C4s1lT86IXO6n s3r0eExlehEfWGV6aja8GU/OPHyMAXicBWR2S/f5BJ+68rog/dMVx5kXd3/O+oVtS5Xb 4DXCmbsfD2i/Z4fxPR7/71+wa7+zoykisTuRKzQAoR2S5NneLK3/v8lG9xRr401iFS9+ HhDZs5H9nrcQWZ9xaOhavY+CwWbQcr+LePs/+yN1hJHY/LI+Aottj4yCNKzP+Q9qqjJR D2i9bbmkhxnBkWIzO6Mu+3/PczkKPnPOI6R5NJkTgY/ui062u0IdVz79V87PNb1AP7qg 4mAg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ApPuS+yy; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x3-v6si6425966plr.586.2018.01.31.08.49.07; Wed, 31 Jan 2018 08:49:22 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ApPuS+yy; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753910AbeAaQUe (ORCPT + 99 others); Wed, 31 Jan 2018 11:20:34 -0500 Received: from mail-ot0-f194.google.com ([74.125.82.194]:33637 "EHLO mail-ot0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753862AbeAaQUc (ORCPT ); Wed, 31 Jan 2018 11:20:32 -0500 Received: by mail-ot0-f194.google.com with SMTP id q9so2944489oti.0; Wed, 31 Jan 2018 08:20:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=UJebG4hKi9sfRsem1KMxAn42TUiSW4Z03O2O30eu6V0=; b=ApPuS+yyJOJfSC38fTnjwXZOnYHTQizmbtpKI8cOBlUeB7xXYWFnLAs2K9GPwUgCzo 9Saet+apVm5wWURmQnDo0Hm0eozk40S8l9lZfqH3CxCR3V6+NPYX9575E1M5T+9yWeEw OPc2OxAXEMzNXw5sN1e/uQMDIEttSPus7JEdWo7Hh7ASW5bvxJxxnLy6c0lELYBL5Mgd lh8g1qb6YJlOYkONCkv+57eqri4Sa79Hk/cJQn/vVqx2WNzLA15ViNpXKu99jEn+LE7v yYCTy7IML9D0wMduLv+5R0NUI22BydtpSPHhUNfX0JyzTRrjifXOMHECy8C2yZQay73S NOZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=UJebG4hKi9sfRsem1KMxAn42TUiSW4Z03O2O30eu6V0=; b=RTT5v3Y/vY/gRTjLb2iYeRHaB9Om4RNntVEtmBKy+A8jD0P/QYqc285Zjb3Aceu3tQ lGTJT0oocXpHFd5M4tVW4en08uZoK4AdwzJJGGgjCEyDtpCAgtES0cisR/K+fI/9POEu 4gbYQViEFsqbTPKIeGLZohA+nfeGXpBmsD21Ru8STuImpb1dS3USQGTuiViJq8iDQvrK R/0TY86PBBEb+5jt7PW1uEIeurhv9cGjdJcqDKBfSe050EMjSStsnnmWjfjcQUyduOv0 42xFn7Vyn8efLfhWDNXu6p8pT2P1M/87e/XDum1m47nFyXAJf/DLxWtRAHUlQzFT+hQ+ E2KQ== X-Gm-Message-State: AKwxytfX2Y6p9s1USz8LLrsdKtU2C8Iefvm2S2dI6qX78TZvZ2WV4hgS iptPd04cs8VQojshxW/oBV4WLjykyE7cZDPLRlTJUw== X-Received: by 10.157.80.36 with SMTP id a36mr659691oth.128.1517415631691; Wed, 31 Jan 2018 08:20:31 -0800 (PST) MIME-Version: 1.0 Received: by 10.157.61.203 with HTTP; Wed, 31 Jan 2018 08:20:31 -0800 (PST) In-Reply-To: <1517403459-6668-1-git-send-email-daniel.baluta@nxp.com> References: <1517403459-6668-1-git-send-email-daniel.baluta@nxp.com> From: Fabio Estevam Date: Wed, 31 Jan 2018 14:20:31 -0200 Message-ID: Subject: Re: [PATCH] ASoC: codecs: Add support for AK5558 ADC driver To: Daniel Baluta Cc: Mark Brown , alsa-devel@alsa-project.org, "open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS" , linux-kernel , wakasugi.jb@om.asahi-kasei.co.jp, shengjiu.wang@nxp.com, mihai.serban@gmail.com, cosmin.samoila@nxp.com, linux-imx@nxp.com, Mihai Serban Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Daniel, On Wed, Jan 31, 2018 at 10:57 AM, Daniel Baluta wrote: > AK5558 is a 32-bit, 768 kHZ sampling, differential input ADC > for digital audio systems. > > Datasheet is available at: > > https://www.akm.com/akm/en/file/datasheet/AK5558VN.pdf > > Initial patch includes support for normal and TDM modes. > > Signed-off-by: Junichi Wakasugi > Signed-off-by: Mihai Serban > Signed-off-by: Shengjiu Wang > Signed-off-by: Daniel Baluta > --- > Documentation/devicetree/bindings/sound/ak5558.txt | 20 + > sound/soc/codecs/Kconfig | 6 + > sound/soc/codecs/Makefile | 2 + > sound/soc/codecs/ak5558.c | 754 +++++++++++++++++++++ > sound/soc/codecs/ak5558.h | 60 ++ > 5 files changed, 842 insertions(+) > create mode 100644 Documentation/devicetree/bindings/sound/ak5558.txt Maybe you should split this is as a separate patch and send it to dt maintainer for review. > create mode 100644 sound/soc/codecs/ak5558.c > create mode 100644 sound/soc/codecs/ak5558.h > > diff --git a/Documentation/devicetree/bindings/sound/ak5558.txt b/Documentation/devicetree/bindings/sound/ak5558.txt > new file mode 100644 > index 0000000..c6c71af > --- /dev/null > +++ b/Documentation/devicetree/bindings/sound/ak5558.txt > @@ -0,0 +1,20 @@ > +AK5558 8 channel differential 32-bit delta-sigma ADC > + > +This device supports I2C mode only. > + > +Required properties: > + > +- compatible : "asahi-kasei,ak5558" > +- reg : The I2C address of the device for I2C. > +- asahi-kasei,pdn-gpios: A GPIO specifier for the GPIO controlling > + the power down & reset pin. > + > +Example: > + > +&i2c { > + ak5558: ak5558@10 { > + compatible = "asahi-kasei,ak5558"; > + reg = <0x10>; > + asahi-kasei,pdn-gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; Datasheet says it is active low. The driver seems to ignore the GPIO polarity, but device tree should represent the hardware correctly. Better switch the driver to use gpiod API. > --- /dev/null > +++ b/sound/soc/codecs/ak5558.c > @@ -0,0 +1,754 @@ > +/* > + * ak5558.c -- audio driver for AK5558 ADC > + * > + * Copyright (C) 2015 Asahi Kasei Microdevices Corporation > + * Copyright 2018 NXP > + * > + * This software is licensed under the terms of the GNU General Public > + * License version 2, as published by the Free Software Foundation, and > + * may be copied, distributed, and modified under those terms. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. You could use SPDX identifier and get rid of the license text. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include "ak5558.h" > + > +#define AK5558_SLAVE_CKS_AUTO Why is this define needed? > + > +static int ak5558_set_mcki(struct snd_soc_codec *codec, int fs, int rclk) > +{ > + u8 mode; > +#ifndef AK5558_SLAVE_CKS_AUTO > + int mcki_rate; > +#endif You could drop this variable as AK5558_SLAVE_CKS_AUTO seems to be always defined. Then maybe you could remove mcki_rate and AK5558_SLAVE_CKS_AUTO. > +static int ak5558_startup(struct snd_pcm_substream *substream, > + struct snd_soc_dai *dai) > +{ > + int ret; > + > + ret = snd_pcm_hw_constraint_list(substream->runtime, 0, > + SNDRV_PCM_HW_PARAM_RATE, > + &ak5558_rate_constraints); > + return ret; You could simply return directly without using the variable 'ret'. > +static int ak5558_init_reg(struct snd_soc_codec *codec) > +{ > + int ret; > + struct ak5558_priv *ak5558 = snd_soc_codec_get_drvdata(codec); > + > + dev_dbg(codec->dev, "%s(%d)\n", __func__, __LINE__); > + > + usleep_range(10000, 11000); > + if (gpio_is_valid(ak5558->pdn_gpio)) { > + gpio_set_value_cansleep(ak5558->pdn_gpio, 0); > + usleep_range(1000, 2000); > + gpio_set_value_cansleep(ak5558->pdn_gpio, 1); Here the GPIO polarity is hardcoded, which can cause issues in systems that has an inverter in this GPIO line. One more generic approach would be to use gpiod_set_value_cansleep() instead, which takes the GPIO polarity read from device tree. > +static int ak5558_probe(struct snd_soc_codec *codec) > +{ > + struct ak5558_priv *ak5558 = snd_soc_codec_get_drvdata(codec); > + int ret = 0; > + > + dev_dbg(codec->dev, "%s(%d)\n", __func__, __LINE__); Better to remove such dev_dbg() lines. > +static int ak5558_i2c_probe(struct i2c_client *i2c, > + const struct i2c_device_id *id) > +{ > + struct device_node *np = i2c->dev.of_node; > + struct ak5558_priv *ak5558; > + int ret = 0; > + > + dev_err(&i2c->dev, "%s(%d)\n", __func__, __LINE__); You certainly do not want an error message on every probe :-) > + ak5558 = devm_kzalloc(&i2c->dev, sizeof(struct ak5558_priv), > + GFP_KERNEL); > + if (!ak5558) > + return -ENOMEM; > + > + ak5558->regmap = devm_regmap_init_i2c(i2c, &ak5558_regmap); > + if (IS_ERR(ak5558->regmap)) > + return PTR_ERR(ak5558->regmap); > + > + i2c_set_clientdata(i2c, ak5558); > + ak5558->i2c = i2c; > + > + ak5558->pdn_gpio = of_get_named_gpio(np, "ak5558,pdn-gpio", 0); It does not match the property in the binding doc: asahi-kasei,pdn-gpios > +module_i2c_driver(ak5558_i2c_driver); > + > +MODULE_AUTHOR("Junichi Wakasugi "); > +MODULE_AUTHOR("Mihai Serban "); > +MODULE_DESCRIPTION("ASoC AK5558 ADC driver"); > +MODULE_LICENSE("GPL"); Don't you mean MODULE_LICENSE("GPL v2") instead?