From 3150326498ba9388b85e5af2c8fcfeafc46eeaad Mon Sep 17 00:00:00 2001 From: GT Date: Sat, 6 Apr 2019 21:16:39 +0100 Subject: [PATCH] ASoC: decommissioning driver for 3Dlab Nano soundcard --- .../overlays/3dlab-nano-player-overlay.dts | 32 -- arch/arm/boot/dts/overlays/Makefile | 1 - arch/arm/boot/dts/overlays/README | 6 - sound/soc/bcm/3dlab-nano-player.c | 370 ------------------ sound/soc/bcm/Kconfig | 6 - sound/soc/bcm/Makefile | 6 +- 8 files changed, 2 insertions(+), 421 deletions(-) delete mode 100644 arch/arm/boot/dts/overlays/3dlab-nano-player-overlay.dts delete mode 100644 sound/soc/bcm/3dlab-nano-player.c --- a/arch/arm/boot/dts/overlays/3dlab-nano-player-overlay.dts +++ /dev/null @@ -1,32 +0,0 @@ -// Definitions for 3Dlab Nano Player -/dts-v1/; -/plugin/; - -/ { - compatible = "brcm,bcm2708"; - - fragment@0 { - target = <&i2s>; - __overlay__ { - status = "okay"; - }; - }; - - fragment@1 { - target = <&i2c>; - __overlay__ { - #address-cells = <1>; - #size-cells = <0>; - status = "okay"; - - nano-player@41 { - compatible = "3dlab,nano-player"; - reg = <0x41>; - i2s-controller = <&i2s>; - status = "okay"; - }; - }; - }; -}; - -// EOF --- a/arch/arm/boot/dts/overlays/Makefile +++ b/arch/arm/boot/dts/overlays/Makefile @@ -1,7 +1,6 @@ # Overlays for the Raspberry Pi platform dtbo-$(CONFIG_ARCH_BCM2835) += \ - 3dlab-nano-player.dtbo \ adau1977-adc.dtbo \ adau7002-simple.dtbo \ ads1015.dtbo \ --- a/arch/arm/boot/dts/overlays/README +++ b/arch/arm/boot/dts/overlays/README @@ -205,12 +205,6 @@ Params: and the other i2c baudrate parameters. -Name: 3dlab-nano-player -Info: Configures the 3Dlab Nano Player -Load: dtoverlay=3dlab-nano-player -Params: - - Name: adau1977-adc Info: Overlay for activation of ADAU1977 ADC codec over I2C for control and I2S for data. --- a/sound/soc/bcm/3dlab-nano-player.c +++ /dev/null @@ -1,370 +0,0 @@ -/* - * 3Dlab Nano Player ALSA SoC Audio driver. - * - * Copyright (C) 2018 3Dlab. - * - * Author: GT - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * 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. - */ - -#include -#include -#include -#include -#include -#include - -#define NANO_ID 0x00 -#define NANO_VER 0x01 -#define NANO_CFG 0x02 -#define NANO_STATUS 0x03 -#define NANO_SPI_ADDR 0x04 -#define NANO_SPI_DATA 0x05 - -#define NANO_ID_VAL 0x3D -#define NANO_CFG_OFF 0x00 -#define NANO_CFG_MULT1 0 -#define NANO_CFG_MULT2 1 -#define NANO_CFG_MULT4 2 -#define NANO_CFG_MULT8 3 -#define NANO_CFG_MULT16 4 -#define NANO_CFG_CLK22 0 -#define NANO_CFG_CLK24 BIT(3) -#define NANO_CFG_DSD BIT(4) -#define NANO_CFG_ENA BIT(5) -#define NANO_CFG_BLINK BIT(6) -#define NANO_STATUS_P1 BIT(0) -#define NANO_STATUS_P2 BIT(1) -#define NANO_STATUS_FLG BIT(2) -#define NANO_STATUS_CLK BIT(3) -#define NANO_SPI_READ 0 -#define NANO_SPI_WRITE BIT(5) - -#define NANO_DAC_CTRL1 0x00 -#define NANO_DAC_CTRL2 0x01 -#define NANO_DAC_CTRL3 0x02 -#define NANO_DAC_LATT 0x03 -#define NANO_DAC_RATT 0x04 - -#define NANO_CTRL2_VAL 0x22 - -static int nano_player_spi_write(struct regmap *map, - unsigned int reg, unsigned int val) -{ - /* indirect register access */ - regmap_write(map, NANO_SPI_DATA, val); - regmap_write(map, NANO_SPI_ADDR, reg | NANO_SPI_WRITE); - return 0; -} - -static int nano_player_ctrl_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - /* describe control element */ - if (strstr(kcontrol->id.name, "Volume")) { - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 100; - } else { - uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; - uinfo->count = 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 1; - } - - return 0; -} - -static int nano_player_ctrl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* program control value to hardware */ - struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); - struct regmap *regmap = snd_soc_card_get_drvdata(card); - - if (strstr(kcontrol->id.name, "Volume")) { - unsigned int vol = ucontrol->value.integer.value[0]; - unsigned int att = 255 - (2 * (100 - vol)); - - nano_player_spi_write(regmap, NANO_DAC_LATT, att); - nano_player_spi_write(regmap, NANO_DAC_RATT, att); - kcontrol->private_value = vol; - } else { - unsigned int mute = ucontrol->value.integer.value[0]; - unsigned int reg = NANO_CTRL2_VAL | mute; - - nano_player_spi_write(regmap, NANO_DAC_CTRL2, reg); - kcontrol->private_value = mute; - } - return 0; -} - -static int nano_player_ctrl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* return last programmed value */ - ucontrol->value.integer.value[0] = kcontrol->private_value; - return 0; -} - -#define SOC_NANO_PLAYER_CTRL(xname) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ - .info = nano_player_ctrl_info, \ - .put = nano_player_ctrl_put, \ - .get = nano_player_ctrl_get } - -static const struct snd_kcontrol_new nano_player_controls[] = { - SOC_NANO_PLAYER_CTRL("Master Playback Volume"), - SOC_NANO_PLAYER_CTRL("Master Playback Switch"), -}; - -static const unsigned int nano_player_rates[] = { - 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, - 705600, 768000 /* only possible with fast clocks */ -}; - -static struct snd_pcm_hw_constraint_list nano_player_constraint_rates = { - .list = nano_player_rates, - .count = ARRAY_SIZE(nano_player_rates), -}; - -static int nano_player_init(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_soc_card *card = rtd->card; - struct regmap *regmap = snd_soc_card_get_drvdata(card); - struct snd_soc_pcm_stream *cpu = &rtd->cpu_dai->driver->playback; - struct snd_soc_pcm_stream *codec = &rtd->codec_dai->driver->playback; - unsigned int sample_bits = 32; - unsigned int val; - - /* configure cpu dai */ - cpu->formats |= SNDRV_PCM_FMTBIT_DSD_U32_LE; - cpu->rate_max = 768000; - - /* configure dummy codec dai */ - codec->rate_min = 44100; - codec->rates = SNDRV_PCM_RATE_KNOT; - codec->formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_DSD_U32_LE; - - /* configure max supported rate */ - regmap_read(regmap, NANO_STATUS, &val); - if (val & NANO_STATUS_CLK) { - dev_notice(card->dev, "Board with fast clocks installed\n"); - codec->rate_max = 768000; - } else { - dev_notice(card->dev, "Board with normal clocks installed\n"); - codec->rate_max = 384000; - } - - /* frame length enforced by hardware */ - return snd_soc_dai_set_bclk_ratio(rtd->cpu_dai, sample_bits * 2); -} - -static int nano_player_startup(struct snd_pcm_substream *substream) -{ - return snd_pcm_hw_constraint_list(substream->runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &nano_player_constraint_rates); -} - -static int nano_player_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_card *card = rtd->card; - struct regmap *regmap = snd_soc_card_get_drvdata(card); - unsigned int config = NANO_CFG_ENA; - struct snd_mask *fmt; - - /* configure PCM or DSD */ - fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); - if (snd_mask_test(fmt, SNDRV_PCM_FORMAT_DSD_U32_LE)) { - /* embed DSD in PCM data */ - snd_mask_none(fmt); - snd_mask_set(fmt, SNDRV_PCM_FORMAT_S32_LE); - /* enable DSD mode */ - config |= NANO_CFG_DSD; - } - - /* configure clocks */ - switch (params_rate(params)) { - case 44100: - config |= NANO_CFG_MULT1 | NANO_CFG_CLK22; - break; - case 88200: - config |= NANO_CFG_MULT2 | NANO_CFG_CLK22; - break; - case 176400: - config |= NANO_CFG_MULT4 | NANO_CFG_CLK22; - break; - case 352800: - config |= NANO_CFG_MULT8 | NANO_CFG_CLK22; - break; - case 705600: - config |= NANO_CFG_MULT16 | NANO_CFG_CLK22; - break; - case 48000: - config |= NANO_CFG_MULT1 | NANO_CFG_CLK24; - break; - case 96000: - config |= NANO_CFG_MULT2 | NANO_CFG_CLK24; - break; - case 192000: - config |= NANO_CFG_MULT4 | NANO_CFG_CLK24; - break; - case 384000: - config |= NANO_CFG_MULT8 | NANO_CFG_CLK24; - break; - case 768000: - config |= NANO_CFG_MULT16 | NANO_CFG_CLK24; - break; - default: - return -EINVAL; - } - - dev_dbg(card->dev, "Send CFG register 0x%02X\n", config); - return regmap_write(regmap, NANO_CFG, config); -} - -static struct snd_soc_ops nano_player_ops = { - .startup = nano_player_startup, - .hw_params = nano_player_hw_params, -}; - -static struct snd_soc_dai_link nano_player_link = { - .name = "3Dlab Nano Player", - .stream_name = "3Dlab Nano Player HiFi", - .platform_name = "bcm2708-i2s.0", - .cpu_dai_name = "bcm2708-i2s.0", - .codec_name = "snd-soc-dummy", - .codec_dai_name = "snd-soc-dummy-dai", - .dai_fmt = SND_SOC_DAIFMT_I2S | - SND_SOC_DAIFMT_CONT | - SND_SOC_DAIFMT_NB_NF | - SND_SOC_DAIFMT_CBM_CFM, - .init = nano_player_init, - .ops = &nano_player_ops, -}; - -static const struct regmap_config nano_player_regmap = { - .reg_bits = 8, - .val_bits = 8, - .max_register = 128, - .cache_type = REGCACHE_RBTREE, -}; - -static int nano_player_card_probe(struct snd_soc_card *card) -{ - struct regmap *regmap = snd_soc_card_get_drvdata(card); - unsigned int val; - - /* check hardware integrity */ - regmap_read(regmap, NANO_ID, &val); - if (val != NANO_ID_VAL) { - dev_err(card->dev, "Invalid ID register 0x%02X\n", val); - return -ENODEV; - } - - /* report version to the user */ - regmap_read(regmap, NANO_VER, &val); - dev_notice(card->dev, "Started 3Dlab Nano Player driver (v%d)\n", val); - - /* enable internal audio bus and blink status LED */ - return regmap_write(regmap, NANO_CFG, NANO_CFG_ENA | NANO_CFG_BLINK); -} - -static int nano_player_card_remove(struct snd_soc_card *card) -{ - /* disable internal audio bus */ - struct regmap *regmap = snd_soc_card_get_drvdata(card); - - return regmap_write(regmap, NANO_CFG, NANO_CFG_OFF); -} - -static struct snd_soc_card nano_player_card = { - .name = "3Dlab_Nano_Player", - .owner = THIS_MODULE, - .dai_link = &nano_player_link, - .num_links = 1, - .controls = nano_player_controls, - .num_controls = ARRAY_SIZE(nano_player_controls), - .probe = nano_player_card_probe, - .remove = nano_player_card_remove, -}; - -static int nano_player_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) -{ - struct regmap *regmap; - int ret; - - regmap = devm_regmap_init_i2c(i2c, &nano_player_regmap); - if (IS_ERR(regmap)) { - ret = PTR_ERR(regmap); - dev_err(&i2c->dev, "Failed to init regmap %d\n", ret); - return ret; - } - - if (i2c->dev.of_node) { - struct snd_soc_dai_link *dai = &nano_player_link; - struct device_node *node; - - /* cpu handle configured by device tree */ - node = of_parse_phandle(i2c->dev.of_node, "i2s-controller", 0); - if (node) { - dai->platform_name = NULL; - dai->platform_of_node = node; - dai->cpu_dai_name = NULL; - dai->cpu_of_node = node; - } - } - - nano_player_card.dev = &i2c->dev; - snd_soc_card_set_drvdata(&nano_player_card, regmap); - ret = devm_snd_soc_register_card(&i2c->dev, &nano_player_card); - - if (ret && ret != -EPROBE_DEFER) - dev_err(&i2c->dev, "Failed to register card %d\n", ret); - - return ret; -} - -static const struct of_device_id nano_player_of_match[] = { - { .compatible = "3dlab,nano-player", }, - { } -}; -MODULE_DEVICE_TABLE(of, nano_player_of_match); - -static const struct i2c_device_id nano_player_i2c_id[] = { - { "nano-player", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, nano_player_i2c_id); - -static struct i2c_driver nano_player_i2c_driver = { - .probe = nano_player_i2c_probe, - .id_table = nano_player_i2c_id, - .driver = { - .name = "nano-player", - .owner = THIS_MODULE, - .of_match_table = nano_player_of_match, - }, -}; - -module_i2c_driver(nano_player_i2c_driver); - -MODULE_DESCRIPTION("ASoC 3Dlab Nano Player driver"); -MODULE_AUTHOR("GT "); -MODULE_LICENSE("GPL v2"); - -/* EOF */ --- a/sound/soc/bcm/Kconfig +++ b/sound/soc/bcm/Kconfig @@ -17,12 +17,6 @@ config SND_SOC_CYGNUS If you don't know what to do here, say N. -config SND_BCM2708_SOC_3DLAB_NANO_PLAYER - tristate "Support for 3Dlab Nano Player" - depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S - help - Say Y or M if you want to add support for 3Dlab Nano Player. - config SND_BCM2708_SOC_GOOGLEVOICEHAT_SOUNDCARD tristate "Support for Google voiceHAT soundcard" depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S --- a/sound/soc/bcm/Makefile +++ b/sound/soc/bcm/Makefile @@ -12,7 +12,6 @@ obj-$(CONFIG_SND_SOC_CYGNUS) += snd-soc- snd-soc-googlevoicehat-codec-objs := googlevoicehat-codec.o # BCM2708 Machine Support -snd-soc-3dlab-nano-player-objs := 3dlab-nano-player.o snd-soc-hifiberry-dacplus-objs := hifiberry_dacplus.o snd-soc-hifiberry-dacplusadc-objs := hifiberry_dacplusadc.o snd-soc-justboom-dac-objs := justboom-dac.o @@ -20,7 +19,7 @@ snd-soc-rpi-cirrus-objs := rpi-cirrus.o snd-soc-rpi-proto-objs := rpi-proto.o snd-soc-iqaudio-codec-objs := iqaudio-codec.o snd-soc-iqaudio-dac-objs := iqaudio-dac.o - snd-soc-i-sabre-q2m-objs := i-sabre-q2m.o +snd-soc-i-sabre-q2m-objs := i-sabre-q2m.o snd-soc-audioinjector-pi-soundcard-objs := audioinjector-pi-soundcard.o snd-soc-audioinjector-octo-soundcard-objs := audioinjector-octo-soundcard.o snd-soc-audiosense-pi-objs := audiosense-pi.o @@ -36,7 +35,6 @@ snd-soc-fe-pi-audio-objs := fe-pi-audio. snd-soc-rpi-simple-soundcard-objs := rpi-simple-soundcard.o snd-soc-rpi-wm8804-soundcard-objs := rpi-wm8804-soundcard.o -obj-$(CONFIG_SND_BCM2708_SOC_3DLAB_NANO_PLAYER) += snd-soc-3dlab-nano-player.o obj-$(CONFIG_SND_BCM2708_SOC_GOOGLEVOICEHAT_SOUNDCARD) += snd-soc-googlevoicehat-codec.o obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS) += snd-soc-hifiberry-dacplus.o obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADC) += snd-soc-hifiberry-dacplusadc.o @@ -45,7 +43,7 @@ obj-$(CONFIG_SND_BCM2708_SOC_RPI_CIRRUS) obj-$(CONFIG_SND_BCM2708_SOC_RPI_PROTO) += snd-soc-rpi-proto.o obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_CODEC) += snd-soc-iqaudio-codec.o obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC) += snd-soc-iqaudio-dac.o - obj-$(CONFIG_SND_BCM2708_SOC_I_SABRE_Q2M) += snd-soc-i-sabre-q2m.o +obj-$(CONFIG_SND_BCM2708_SOC_I_SABRE_Q2M) += snd-soc-i-sabre-q2m.o obj-$(CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD) += snd-soc-audioinjector-pi-soundcard.o obj-$(CONFIG_SND_AUDIOINJECTOR_OCTO_SOUNDCARD) += snd-soc-audioinjector-octo-soundcard.o obj-$(CONFIG_SND_AUDIOSENSE_PI) += snd-soc-audiosense-pi.o