From patchwork Thu Nov 11 03:33:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Hung X-Patchwork-Id: 1553739 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=l3kbNj9a; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HqS473gskz9sR4 for ; Thu, 11 Nov 2021 14:33:43 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1ml0qB-00018p-Tl; Thu, 11 Nov 2021 03:33:31 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1ml0q6-00013i-Ui for kernel-team@lists.ubuntu.com; Thu, 11 Nov 2021 03:33:26 +0000 Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 8BD2D3F1A7 for ; Thu, 11 Nov 2021 03:33:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1636601606; bh=ByBVb9DQmZV4pQ1u6ZJk5OsMRf8c1E6D+a1RRAolp20=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=l3kbNj9a156UmxiHzvBav/yV97avcp+SqTQuwFk/UFFHiz2FDiFtuoOEw1GF4hNrt +KgaIOjeVVAAdRXiW4Ar1rR3RjO0GvuZ/MgEgUlZMPNNcGRlUa30MSkJ+muJEtx00e PT9O53jQ3R4jjLhrieAT8h1KLnAyJMMepPnpzMlia7mqgpDdl50sZACq6zixOJJ6x0 2DnTSRytOA5SzlNUecuQx+OLH5Yv1JRzp+SJE5yBShILkh8uhG+optQ4vkF7++JjvP jGjldiiOA9F2claQV6uqhCkHwvGuvflb6H9dGoOUEV2wQND8DTByZCLkqns4ItdrK2 +p7k/7eFNb8Gg== Received: by mail-pf1-f199.google.com with SMTP id p123-20020a622981000000b004a00d95bb44so3237642pfp.0 for ; Wed, 10 Nov 2021 19:33:26 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ByBVb9DQmZV4pQ1u6ZJk5OsMRf8c1E6D+a1RRAolp20=; b=C0VTxKo1f4xkVxUOa2g1FJ7s+JDYsJVZ1Wb5gmvzrhv8Xa2aTPODUVo2bdjf9CDUw2 p4+miD2PhnJHti1eZ1hMu4wCYaoZ7gl6xhNqfkxD1GFOhZ3HRHPMJHRUmKhDk//FCqCt 2puCPsbPdHDLWw79zQpdn1IevQ7Vc3M6Ez8agPxTFeDmjHazHccGhcXKrsJgxKoTTsjo vHHp1v+eJwB1sGMzx4WvwSD0xufUJcKQv3WEcRI8HFldpt6AVBOntAeXDRgaI9ZmrJB2 3u1Jt7QQqdcKrO+vWojdN/3NpTWm616jzJwi3qt+szA/ahFSbc1krcb1hfrKNGlOGBaA Q0rA== X-Gm-Message-State: AOAM5301sa4zFXu62wcjpptnqSriJZ9zVxuDkSLAiTMC5IIkuQRJSu3U WaQgUfsQadB/Bq5eL/9qq7Y/Hyp7hMRCMfyxYSKNfhokeulZULmDEpJqB1rl1bHaFhqp90XhAZf FtsGHYn+EL5LLflADclrF4Nd6uMbXyZ0cqvZwgi6AoA== X-Received: by 2002:a05:6a00:2186:b0:473:5a61:a7f6 with SMTP id h6-20020a056a00218600b004735a61a7f6mr3959290pfi.15.1636601604955; Wed, 10 Nov 2021 19:33:24 -0800 (PST) X-Google-Smtp-Source: ABdhPJwlsL741BTgQccIIVaGAKz1u0SjGbfT26TqHCFifgixBjLU3TYrjI5Q5xuP6YNib/cyqJAfyw== X-Received: by 2002:a05:6a00:2186:b0:473:5a61:a7f6 with SMTP id h6-20020a056a00218600b004735a61a7f6mr3959261pfi.15.1636601604630; Wed, 10 Nov 2021 19:33:24 -0800 (PST) Received: from canonical.com (node-1w7jr9yebujeq5th4a1ypmet6.ipv6.telus.net. [2001:56a:78ed:fb00::57a]) by smtp.gmail.com with ESMTPSA id e15sm1033206pfv.131.2021.11.10.19.33.23 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 19:33:24 -0800 (PST) From: Alex Hung To: kernel-team@lists.ubuntu.com Subject: [PATCH 04/14][SRU][UNSTABLE] ASoC: amd: add platform devices for acp6x pdm driver and dmic driver Date: Wed, 10 Nov 2021 20:33:08 -0700 Message-Id: <20211111033318.1200557-5-alex.hung@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211111033318.1200557-1-alex.hung@canonical.com> References: <20211111033318.1200557-1-alex.hung@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Vijendar Mukunda BugLink: https://bugs.launchpad.net/bugs/1949245 ACP6.x IP has PDM decoder block. Create a platform device for it, so that the PDM platform driver can be bound to this device. Pass PCI resources like MMIO to this platform device. Create a platform device for generic dmic codec driver. Signed-off-by: Vijendar Mukunda Link: https://lore.kernel.org/r/20211018112044.1705805-5-Vijendar.Mukunda@amd.com Signed-off-by: Mark Brown (cherry picked from commit fc329c1de49825a30d5381e18316a3fd45aac7a9 linux-next) Signed-off-by: Alex Hung --- sound/soc/amd/yc/acp6x.h | 23 +++++++++++++++ sound/soc/amd/yc/pci-acp6x.c | 68 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/sound/soc/amd/yc/acp6x.h b/sound/soc/amd/yc/acp6x.h index 76e9e86..63bdea3 100644 --- a/sound/soc/amd/yc/acp6x.h +++ b/sound/soc/amd/yc/acp6x.h @@ -9,6 +9,10 @@ #define ACP_DEVICE_ID 0x15E2 #define ACP6x_PHY_BASE_ADDRESS 0x1240000 +#define ACP6x_REG_START 0x1240000 +#define ACP6x_REG_END 0x1250200 +#define ACP6x_DEVS 2 +#define ACP6x_PDM_MODE 1 #define ACP_SOFT_RESET_SOFTRESET_AUDDONE_MASK 0x00010001 #define ACP_PGFSM_CNTL_POWER_ON_MASK 1 @@ -22,6 +26,25 @@ #define ACP_ERROR_MASK 0x20000000 #define ACP_EXT_INTR_STAT_CLEAR_MASK 0xFFFFFFFF +enum acp_config { + ACP_CONFIG_0 = 0, + ACP_CONFIG_1, + ACP_CONFIG_2, + ACP_CONFIG_3, + ACP_CONFIG_4, + ACP_CONFIG_5, + ACP_CONFIG_6, + ACP_CONFIG_7, + ACP_CONFIG_8, + ACP_CONFIG_9, + ACP_CONFIG_10, + ACP_CONFIG_11, + ACP_CONFIG_12, + ACP_CONFIG_13, + ACP_CONFIG_14, + ACP_CONFIG_15, +}; + static inline u32 acp6x_readl(void __iomem *base_addr) { return readl(base_addr - ACP6x_PHY_BASE_ADDRESS); diff --git a/sound/soc/amd/yc/pci-acp6x.c b/sound/soc/amd/yc/pci-acp6x.c index 03af347..bb66b4c 100644 --- a/sound/soc/amd/yc/pci-acp6x.c +++ b/sound/soc/amd/yc/pci-acp6x.c @@ -9,11 +9,15 @@ #include #include #include +#include #include "acp6x.h" struct acp6x_dev_data { void __iomem *acp6x_base; + struct resource *res; + bool acp6x_audio_mode; + struct platform_device *pdev[ACP6x_DEVS]; }; static int acp6x_power_on(void __iomem *acp_base) @@ -117,7 +121,9 @@ static int snd_acp6x_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) { struct acp6x_dev_data *adata; - int ret; + struct platform_device_info pdevinfo[ACP6x_DEVS]; + int ret, index; + int val = 0x00; u32 addr; /* Yellow Carp device check */ @@ -154,8 +160,62 @@ static int snd_acp6x_probe(struct pci_dev *pci, ret = acp6x_init(adata->acp6x_base); if (ret) goto release_regions; + val = acp6x_readl(adata->acp6x_base + ACP_PIN_CONFIG); + switch (val) { + case ACP_CONFIG_0: + case ACP_CONFIG_1: + case ACP_CONFIG_2: + case ACP_CONFIG_3: + case ACP_CONFIG_9: + case ACP_CONFIG_15: + dev_info(&pci->dev, "Audio Mode %d\n", val); + break; + default: + adata->res = devm_kzalloc(&pci->dev, + sizeof(struct resource), + GFP_KERNEL); + if (!adata->res) { + ret = -ENOMEM; + goto de_init; + } + + adata->res->name = "acp_iomem"; + adata->res->flags = IORESOURCE_MEM; + adata->res->start = addr; + adata->res->end = addr + (ACP6x_REG_END - ACP6x_REG_START); + + adata->acp6x_audio_mode = ACP6x_PDM_MODE; + + memset(&pdevinfo, 0, sizeof(pdevinfo)); + pdevinfo[0].name = "acp_yc_pdm_dma"; + pdevinfo[0].id = 0; + pdevinfo[0].parent = &pci->dev; + pdevinfo[0].num_res = 1; + pdevinfo[0].res = adata->res; + + pdevinfo[1].name = "dmic-codec"; + pdevinfo[1].id = 0; + pdevinfo[1].parent = &pci->dev; + for (index = 0; index < ACP6x_DEVS; index++) { + adata->pdev[index] = + platform_device_register_full(&pdevinfo[index]); + if (IS_ERR(adata->pdev[index])) { + dev_err(&pci->dev, "cannot register %s device\n", + pdevinfo[index].name); + ret = PTR_ERR(adata->pdev[index]); + goto unregister_devs; + } + } + break; + } return 0; +unregister_devs: + for (--index; index >= 0; index--) + platform_device_unregister(adata->pdev[index]); +de_init: + if (acp6x_deinit(adata->acp6x_base)) + dev_err(&pci->dev, "ACP de-init failed\n"); release_regions: pci_release_regions(pci); disable_pci: @@ -167,9 +227,13 @@ static int snd_acp6x_probe(struct pci_dev *pci, static void snd_acp6x_remove(struct pci_dev *pci) { struct acp6x_dev_data *adata; - int ret; + int ret, index; adata = pci_get_drvdata(pci); + if (adata->acp6x_audio_mode == ACP6x_PDM_MODE) { + for (index = 0; index < ACP6x_DEVS; index++) + platform_device_unregister(adata->pdev[index]); + } ret = acp6x_deinit(adata->acp6x_base); if (ret) dev_err(&pci->dev, "ACP de-init failed\n");