From nobody Mon Feb 9 16:51:18 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9E8D82DE703 for ; Tue, 9 Dec 2025 09:32:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765272739; cv=none; b=QuEuHWZUtTB2Fm8pMoMBEWGhyAuTwT+eZRXKIPKK8JH/b+RcRL/xhX16g7wQ3g+DvYxqIiZ5mD2tzBYffsBitJUPCKf9mk4ZLR+wVldKQCUSRFjejlaSuyzpBGSWpyMVPyep1wJ7I0QIR11G4g16kKQ8zXNKM1Fa88tJ5JrVKBQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765272739; c=relaxed/simple; bh=+drHU6Kv5dx2gWI6Rb8MzRIPjOqO6lKIV5+rr02mpIU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lZk53Ldaa8IR5YNPGLeD31UCfYd+8+l5E26Xe0hEgGK3ccHVS769ewufVCLjL9CveJ0cW8CNzocBen0a8aS/mtyvF3ukYBacPXydyqRI0x8LVL+QRhkv+l9p1MLzE4M+avlDbLTzJOrebSe59t2EdAGJ5MeDZWn39e4wR2zdv5U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YX7vlZqg; arc=none smtp.client-ip=209.85.214.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YX7vlZqg" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-29e1b8be48fso23393145ad.1 for ; Tue, 09 Dec 2025 01:32:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765272737; x=1765877537; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=+PN0Qd2/OSPDiP/SCt4m3b00gB3oBVDwfSgnMIlH8+4=; b=YX7vlZqgO0NvWAjFQJt/MjrA2vf1Krjx4Ocd6l7m7NR4hzzDaR78wZ+yQXLMBmTuV/ QTsevIGpfoL0a2biCm0KDIFuDXIJ15RmCF1hv2SB3wpj+Jfmh2KwETfIdUuQ11MwuF5m Q6oVQQtqcPorqMet5sCB7OrACkfI88bnXAwU8hWyqs/aZgeavkccYWTcocMtf7v5wMI9 2weSgiK7d0EadLEJT9+84v6vWZa+78tsgP+HtZC/9WjGONCrW7HbJXJeAJSNkCgi49Pp vUFVcurTC7LixWFNCWL08E/0tdgJjrKUzFruXPPNgCC/eJbOfcBIHqPmLoPvFaGVaKIn PWCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765272737; x=1765877537; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=+PN0Qd2/OSPDiP/SCt4m3b00gB3oBVDwfSgnMIlH8+4=; b=GJS6uWZ83FIm8ji37rMinResZ21uMWUDEI/7rRrU0qG+TZpX+hF3zYW1HMA9jdLvLr Z+CWq3GCgBDiulUrUwGwvsQuuC0J1TQeVWcJ3c5wYOQD6iRkQuckjqyu/gt0jDc1J9R9 QXm/AKBkKVa4K9+qvelAtBJE+M5rN5GqWRwB/FvIB3JV0Ugi+fDqZph9vZ/Hq1Fd1AdD 5OgS5gFBlmHiThn54eWqok0BKM6wZ0hB7FqopkYkQkASVRSm3MbhFRzHxVWEWik/r5gY eR2S7D5yJq4IPRkYu7sdM0UCjzpZgd9zGMf83ESBNAJz8AhGh1uVFj3/2T+7ictbLPzW dBqg== X-Forwarded-Encrypted: i=1; AJvYcCW99k/0gQwt2KqDYO78CHxwj6WpQXQR/9WirWRIoTpdMcR3rUqZq7rvO91e3QSNXWTlZoLg+9rrsQaCr94=@vger.kernel.org X-Gm-Message-State: AOJu0Ywuj7V4A6IqILr138Cgv0iy/4JFrVWOuvtW+rrfA1JxjJcV3CZa VYOJeEb7gfyECmessH3guxsWYMIQrS6GkIecl6gZfQToNJ3kufvoCtES X-Gm-Gg: ASbGncsQvvobhIZHDQA/hj5Zz0la8/qDFjYj6UKm4bLzQ9tzjfHqIQfJDHgiQgWYlB/ z1qgFsXOTk8snEswH3hz3NdJXqxD1xT30UGtZp1bZW9VFH+IuDv5fu8OABspraCEHzbFZ48+GnD t4kBVqWdfqq0XEj0/DsRrxqvJN1fwVT9Zs1SN1OzX7Hay870m5GbZeHIwT7YNEHC3VngS9RPQRs scGzVinxOc50aybSa6wcI2LiIu5Nqy3BH3bEfc8ikRtGRIYPIK1KhgpnXySbwHZleqcN2YKzRz7 SdWMYnpMoWkFAofvN2ZSysS/NtG/Y5RJgNX2comdA1sfYmo9zPqzI80TE4k75eShnu92IB1Jc0H ujAjf7jZOWEJTiyxvOwIYt0msIjIV7b0InNHbX6/PB0O3Z592jRT/JzyXvlJ+LKlRSsH39/CRJ9 owkoTQeQcbUwebxtVP8Tu1ZPBGJ5arTMRAQroYNGNjStCi9kPxxyranWga9tA9YADf3u75UGwGn BrcKnojAIxVVqOf7Uyl4PmyqDbaBHoVhMFUA4umcPYsIsmR7p8gdpmHBI4eVmKLPUc8V1fp6hAz M3uRc0tIwJQY+YhZrTNllIG5ewvr+o5sG0vquVIRxcU8g5nwNRlAS6GvAH8nEQ== X-Google-Smtp-Source: AGHT+IFotzk8vBpJPn3igE6lPKAddyobbStk24n2ejESg7hiOK8wrzqTNKlOE578VcVOs6JfDZz2qQ== X-Received: by 2002:a17:90b:35cb:b0:340:7b2e:64cc with SMTP id 98e67ed59e1d1-349a250ee48mr9384938a91.15.1765272736911; Tue, 09 Dec 2025 01:32:16 -0800 (PST) Received: from [192.168.2.3] (2403-580a-80ed-0-4835-5a07-49e7-f115.ip6.aussiebb.net. [2403:580a:80ed:0:4835:5a07:49e7:f115]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-34a49658704sm1800408a91.6.2025.12.09.01.32.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Dec 2025 01:32:16 -0800 (PST) From: James Calligeros Date: Tue, 09 Dec 2025 19:31:19 +1000 Subject: [PATCH 6/7] ASoC: tas2764: expose SDOUT bus keeper via set_tdm_idle operation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251209-tdm-idle-slots-v1-6-38dabf6bc01e@gmail.com> References: <20251209-tdm-idle-slots-v1-0-38dabf6bc01e@gmail.com> In-Reply-To: <20251209-tdm-idle-slots-v1-0-38dabf6bc01e@gmail.com> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Kuninori Morimoto , Shengjiu Wang , Jaroslav Kysela , Takashi Iwai , Shenghao Ding , Kevin Lu , Baojun Xu Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, asahi@lists.linux.dev, James Calligeros X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4997; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=+drHU6Kv5dx2gWI6Rb8MzRIPjOqO6lKIV5+rr02mpIU=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDJnmb7JfL7h9ab2x4v5VXfeDrtgleVdwvmWYk9b4w7zy2 8sdd+yvdUxkYRDjYrAUU2TZ0CTkMduI7Wa/SOVemDmsTCBDpEUaGICAhYEvNzGv1EjHSM9U21DP 0FDHWMeIgYtTAKb6xi6GP1y/mVemPYxX+hStFdmwwFavarPMj9QTcfuDGrtMjn48W8rwV+jP1Fa Wa6duhjKu/KD9X1tVgbXtvWZDDaN1WaBCvOcHFgA= X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 TAS2764, and the Apple-exclusive variant SN012776, include bus keepers on the SDOUT pin that can be configured to alter the behaviour of the SDOUT pin during specified TDM slots. The chip can either leave the bus floating (default/uninitialised behaviour) or fill the specified slots with zeroes. Expose the SDOUT bus keeper and allow it to be configured using the set_tdm_idle DAI op. The mask must be cropped to only cover slots valid for the configured BCLK ratio, so introduce a set_bclk_ratio op that properly configures the bus keeper too. Signed-off-by: James Calligeros --- sound/soc/codecs/tas2764.c | 95 +++++++++++++++++++++++++ sound/soc/codecs/tas2764.h | 11 +++ 2 files changed, 106 insertions(+) diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c index 36e25e48b354..423b7073b302 100644 --- a/sound/soc/codecs/tas2764.c +++ b/sound/soc/codecs/tas2764.c @@ -44,6 +44,11 @@ struct tas2764_priv { =20 bool dac_powered; bool unmuted; + + struct { + int tx_mode; + unsigned int tx_mask; + } idle_slot_config; }; =20 #include "tas2764-quirks.h" @@ -509,11 +514,101 @@ static int tas2764_set_dai_tdm_slot(struct snd_soc_d= ai *dai, return 0; } =20 +static int tas2764_write_sdout_idle_mask(struct tas2764_priv *tas2764, u32= mask) +{ + struct snd_soc_component *component =3D tas2764->component; + int i, ret; + + /* Hardware supports up to 64 slots, but we don't */ + for (i =3D 0; i < 4; i++) { + ret =3D snd_soc_component_write(component, + TAS2764_SDOUT_HIZ_1 + i, + (mask >> (i * 8)) & 0xff); + if (ret < 0) + return ret; + } + + return 0; +} + +static int tas2764_set_dai_tdm_idle(struct snd_soc_dai *dai, + unsigned int tx_mask, unsigned int rx_mask, + int tx_mode, int rx_mode) +{ + struct snd_soc_component *component =3D dai->component; + struct tas2764_priv *tas2764 =3D snd_soc_component_get_drvdata(component); + int ret; + + /* We don't support setting anything on SDIN */ + if (rx_mode) + return -EOPNOTSUPP; + + if (tas2764->idle_slot_config.tx_mask =3D=3D tx_mask && + tas2764->idle_slot_config.tx_mode =3D=3D tx_mode) + return 0; + + switch (tx_mode) { + case SND_SOC_DAI_TDM_IDLE_ZERO: + if (!tx_mask) + return -EINVAL; + + ret =3D tas2764_write_sdout_idle_mask(tas2764, tx_mask); + if (ret < 0) + return ret; + + ret =3D snd_soc_component_update_bits(component, + TAS2764_SDOUT_HIZ_9, + TAS2764_SDOUT_HIZ_9_FORCE_0_EN, + TAS2764_SDOUT_HIZ_9_FORCE_0_EN); + if (ret < 0) + return ret; + + tas2764->idle_slot_config.tx_mask =3D tx_mask; + tas2764->idle_slot_config.tx_mode =3D tx_mode; + break; + case SND_SOC_DAI_TDM_IDLE_HIZ: + case SND_SOC_DAI_TDM_IDLE_OFF: + /* HiZ mode does not support a slot mask */ + ret =3D tas2764_write_sdout_idle_mask(tas2764, 0); + if (ret < 0) + return ret; + + ret =3D snd_soc_component_update_bits(component, + TAS2764_SDOUT_HIZ_9, + TAS2764_SDOUT_HIZ_9_FORCE_0_EN, 0); + if (ret < 0) + return ret; + + tas2764->idle_slot_config.tx_mask =3D 0; + tas2764->idle_slot_config.tx_mode =3D tx_mode; + break; + default: + return -EOPNOTSUPP; + } + + return 0; +} + +/* The SDOUT idle slot mask must be cropped based on the BCLK ratio */ +static int tas2764_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ra= tio) +{ + struct tas2764_priv *tas2764 =3D snd_soc_component_get_drvdata(dai->compo= nent); + + if (!tas2764->idle_slot_config.tx_mask) + return 0; + + tas2764->idle_slot_config.tx_mask &=3D GENMASK((ratio / 8) - 1, 0); + + return tas2764_write_sdout_idle_mask(tas2764, tas2764->idle_slot_config.t= x_mask); +} + static const struct snd_soc_dai_ops tas2764_dai_ops =3D { .mute_stream =3D tas2764_mute, .hw_params =3D tas2764_hw_params, .set_fmt =3D tas2764_set_fmt, + .set_bclk_ratio =3D tas2764_set_bclk_ratio, .set_tdm_slot =3D tas2764_set_dai_tdm_slot, + .set_tdm_idle =3D tas2764_set_dai_tdm_idle, .no_capture_mute =3D 1, }; =20 diff --git a/sound/soc/codecs/tas2764.h b/sound/soc/codecs/tas2764.h index 538290ed3d92..4494bc4889dc 100644 --- a/sound/soc/codecs/tas2764.h +++ b/sound/soc/codecs/tas2764.h @@ -126,4 +126,15 @@ =20 #define TAS2764_BOP_CFG0 TAS2764_REG(0X0, 0x1d) =20 +#define TAS2764_SDOUT_HIZ_1 TAS2764_REG(0x1, 0x3d) +#define TAS2764_SDOUT_HIZ_2 TAS2764_REG(0x1, 0x3e) +#define TAS2764_SDOUT_HIZ_3 TAS2764_REG(0x1, 0x3f) +#define TAS2764_SDOUT_HIZ_4 TAS2764_REG(0x1, 0x40) +#define TAS2764_SDOUT_HIZ_5 TAS2764_REG(0x1, 0x41) +#define TAS2764_SDOUT_HIZ_6 TAS2764_REG(0x1, 0x42) +#define TAS2764_SDOUT_HIZ_7 TAS2764_REG(0x1, 0x43) +#define TAS2764_SDOUT_HIZ_8 TAS2764_REG(0x1, 0x44) +#define TAS2764_SDOUT_HIZ_9 TAS2764_REG(0x1, 0x45) +#define TAS2764_SDOUT_HIZ_9_FORCE_0_EN BIT(7) + #endif /* __TAS2764__ */ --=20 2.52.0