Received: by 2002:a05:7412:8d10:b0:f3:1519:9f41 with SMTP id bj16csp6978314rdb; Fri, 15 Dec 2023 13:55:04 -0800 (PST) X-Google-Smtp-Source: AGHT+IEen3W9NK7ZZ+dWjMNzel3Zw9FBVmqERmO4ZID8pFPHBEyN4gcQJD4vTttlFMlSH7lrv913 X-Received: by 2002:a05:6870:e246:b0:1fa:d6e7:afe0 with SMTP id d6-20020a056870e24600b001fad6e7afe0mr11452221oac.56.1702677304362; Fri, 15 Dec 2023 13:55:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702677304; cv=none; d=google.com; s=arc-20160816; b=o278/6Dx1XRCMV8X3Kj//+paBmNrIi9BPljWadEIzTePUszHX2pfWgHlCF34Eq+5G8 lLEGNWOmQXw8If6g9abRokH5LqwmbA0jcg0zPQ+vIdeU/joF3QjPzWkgvhxEKP+KmTBH 0TYA3Om9v/04dAMOV/rR7q1HtnWBTYdKS6FMo/klyHb3DH5kgObIUNdP1rIDuGkHmkqP 5+nadq7giz5fGvkvYTyLdn1I/6i/GjZ2DnhcQ97J7K3msAYXy3OGkoIr6Ae3m9bW9uz/ EW0TMOhC/3KIr/he0tIlR3nM1pdUAC2Ms0Bq5hylmabpHVlXOQQRZ1BhBV0a4vcLvhMm V3zg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:list-unsubscribe:list-subscribe:list-id:precedence :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=L2qotf6xpYYmqLwnEkW9ngHyZkfprz9VyYE0khXKWZA=; fh=0KzismZj+xI0Z//ZGdqKIH/FO9LtSZM7Yj4P0VtrCz0=; b=n7cEymDF+8wW9fbg1UY/0s8izvJYuGd7aTPdJVJmgmJWxiNXC86hUJsp6zmyJNKXdO ekMe+OLqRlI5Z+a1rQ6VylxM3fiA5df7xICHqZ6KnQ5fNxwIJJBl9UmEGs0S+iO3s26K N/ATZj5iDPMZNzYnx1ZkwieZVR0QSBzsSEGsJozgGpkA4jK8SuZ4tb7gk76P/mIsrjBG QDFcnnMxXecZFG13YVDNhKFkHM7JsJfeV5Q+hGH1Q4e81p7OElApTSni6yoSbpZVkAQZ zUKHHVo5811wE9d+B/vIg2Fe1oz477AgiXcnuDMl8pJ7c2OWoSCqiPHcfiA9FB2w/RyI BdZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=Mi5XkPRO; spf=pass (google.com: domain of linux-kernel+bounces-1696-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-1696-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id ki20-20020a05622a771400b00425598bb8c1si17441620qtb.741.2023.12.15.13.55.04 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Dec 2023 13:55:04 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-1696-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=Mi5XkPRO; spf=pass (google.com: domain of linux-kernel+bounces-1696-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-1696-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id B3B381C24757 for ; Fri, 15 Dec 2023 21:54:47 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4F1C06E2AE; Fri, 15 Dec 2023 21:50:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="Mi5XkPRO" X-Original-To: linux-kernel@vger.kernel.org Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C6416721F; Fri, 15 Dec 2023 21:50:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=quicinc.com Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.24/8.17.1.24) with ESMTP id 3BFL7flw009268; Fri, 15 Dec 2023 21:50:16 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type; s=qcppdkim1; bh=L2qotf6xpYYmqLwnEkW9 ngHyZkfprz9VyYE0khXKWZA=; b=Mi5XkPROrKhv2dhAAqY+P0NIphyNr4BHFtdQ LGx/mdQAypHFifBx4Fvcm7pVkEE54iGykcF4VaniEd2viFBfYmfEQYX1tFvUKtXe jO4SNj3xo9CXULKICD6YtQZ5sKjKtK8fpv4uEBUE5vw6jPtoResiVWjGyJ/gq8rV TtcFDuVzJPW1vxuf2/GJMLHJleY1SAtvjdx76fprUx2NkE399vmTXRBT6WBjzkLW cxRJ8KtT9adFeePAthAkh4qDpRqMq7RQkhZuHx1+HRuSLCZwmoex9RJS++yPqvoE nXTByHkdahImXvsEwWd0h0ruUdX0EIqD87zwHVeDGN85WfQHZA== Received: from nalasppmta01.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3v0w1989h0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 15 Dec 2023 21:50:16 +0000 (GMT) Received: from nalasex01b.na.qualcomm.com (nalasex01b.na.qualcomm.com [10.47.209.197]) by NALASPPMTA01.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 3BFLoFPs018023 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 15 Dec 2023 21:50:15 GMT Received: from hu-wcheng-lv.qualcomm.com (10.49.16.6) by nalasex01b.na.qualcomm.com (10.47.209.197) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.40; Fri, 15 Dec 2023 13:50:15 -0800 From: Wesley Cheng To: , , , , , , , , , , , , , , , CC: , , , , , , , Wesley Cheng Subject: [PATCH v10 32/41] ASoC: qcom: qdsp6: Add PCM ops to track current state Date: Fri, 15 Dec 2023 13:49:46 -0800 Message-ID: <20231215214955.12110-33-quic_wcheng@quicinc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20231215214955.12110-1-quic_wcheng@quicinc.com> References: <20231215214955.12110-1-quic_wcheng@quicinc.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain X-ClientProxiedBy: nalasex01c.na.qualcomm.com (10.47.97.35) To nalasex01b.na.qualcomm.com (10.47.209.197) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: AxRo1hB-m5nrd8hkTuRLAPEORgza8TZv X-Proofpoint-ORIG-GUID: AxRo1hB-m5nrd8hkTuRLAPEORgza8TZv X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.997,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-12-09_01,2023-12-07_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 mlxlogscore=999 suspectscore=0 mlxscore=0 impostorscore=0 lowpriorityscore=0 spamscore=0 adultscore=0 phishscore=0 clxscore=1015 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2311290000 definitions=main-2312150152 Register PCM callbacks so that the Q6USB DPCM backend dai link can track and update the status of the PCM device. Utilize the SOC USB state APIs to ensure that the SND kcontrol for the offload status is updated properly. Signed-off-by: Wesley Cheng --- sound/soc/qcom/qdsp6/q6usb.c | 52 +++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/sound/soc/qcom/qdsp6/q6usb.c b/sound/soc/qcom/qdsp6/q6usb.c index e41b83a58874..fd4da457d834 100644 --- a/sound/soc/qcom/qdsp6/q6usb.c +++ b/sound/soc/qcom/qdsp6/q6usb.c @@ -30,6 +30,9 @@ struct q6usb_status { struct snd_soc_usb_device *sdev; unsigned int pcm_index; + bool prepared; + bool running; + int session_id; }; struct q6usb_port_data { @@ -81,14 +84,48 @@ static int q6usb_hw_params(struct snd_pcm_substream *substream, goto out; data->status[data->sel_card_idx].pcm_index = data->sel_pcm_idx; + data->status[data->sel_card_idx].prepared = true; + data->status[data->sel_card_idx].session_id = + snd_soc_usb_prepare_session(data->usb, data->sel_card_idx, + data->sel_pcm_idx); out: mutex_unlock(&data->mutex); return ret; } +static int q6usb_prepare(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct q6usb_port_data *data = dev_get_drvdata(dai->dev); + + mutex_lock(&data->mutex); + data->status[data->sel_card_idx].running = true; + snd_soc_usb_set_session_state(data->usb, + data->status[data->sel_card_idx].session_id, + SND_SOC_USB_RUNNING); + mutex_unlock(&data->mutex); + + return 0; +} + +static void q6usb_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct q6usb_port_data *data = dev_get_drvdata(dai->dev); + + mutex_lock(&data->mutex); + data->status[data->sel_card_idx].running = false; + data->status[data->sel_card_idx].prepared = false; + snd_soc_usb_shutdown_session(data->usb, + data->status[data->sel_card_idx].session_id); + mutex_unlock(&data->mutex); +} + static const struct snd_soc_dai_ops q6usb_ops = { .hw_params = q6usb_hw_params, + .prepare = q6usb_prepare, + .shutdown = q6usb_shutdown, }; static struct snd_soc_dai_driver q6usb_be_dais[] = { @@ -149,10 +186,15 @@ static int q6usb_put_offload_dev(struct snd_kcontrol *kcontrol, int pcmidx; int cardidx; + mutex_lock(&data->mutex); + + /* Don't allow changes to the offloading devices if session is busy */ + if (data->sel_card_idx >= 0 && data->status[data->sel_card_idx].prepared) + goto out; + cardidx = ucontrol->value.integer.value[0]; pcmidx = ucontrol->value.integer.value[1]; - mutex_lock(&data->mutex); if ((cardidx >= 0 && test_bit(cardidx, &data->available_card_slot))) { data->sel_card_idx = cardidx; changed = 1; @@ -203,8 +245,12 @@ static int q6usb_alsa_connection_cb(struct snd_soc_usb *usb, mutex_lock(&data->mutex); if (connected) { - /* We only track the latest USB headset plugged in */ - if (!data->idx_valid) { + /* + * Update the latest USB headset plugged in, if session is + * idle. + */ + if (!data->idx_valid && + !data->status[data->sel_card_idx].prepared) { data->sel_card_idx = sdev->card_idx; data->sel_pcm_idx = 0; }