From patchwork Fri Jul 20 15:26:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 142483 Delivered-To: patch@linaro.org Received: by 2002:a2e:9754:0:0:0:0:0 with SMTP id f20-v6csp3101158ljj; Fri, 20 Jul 2018 08:26:42 -0700 (PDT) X-Google-Smtp-Source: AAOMgpfVa2+sPoo6/smTuxdDn/fkmIhHZtvCcHw2l3eGJRmPdP5iJA/nFBj+FU2KDlum6aPRwqNN X-Received: by 2002:a17:902:7894:: with SMTP id q20-v6mr2571095pll.3.1532100402737; Fri, 20 Jul 2018 08:26:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532100402; cv=none; d=google.com; s=arc-20160816; b=egb8jEVws6Zxo03a48N0oYqxgHWbATs8iNgqW68U7O/VhXqqKdkcz3HcAX8hBFOeKv zsJOH3F2QguEVpj7i0yqAzWnJ6jYATtrb4a1zXAGuX5/5HSKPM19XSOPDeOS0RIQL8s0 a0F4iAvXP7yogMZObu82DE0jKafp3smSxOp9caxLb8BCO+Lcba+Nrns20bpQ3kStwYzE CvQvB8AXcxKA4yGePrYDutLOGpb701zEu8h5qvsU86P0MEwJmdlpsrPk+EJbzuXLkgaQ MBcntB3Qx5LBa/ZFYrAMSj8+i0O4Kss8gi3FBiJ/PFR/eDq5x9kQY/SySL2Djwh0K80S HZiA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=8Mnd9WDzPE20kA4WQIFs1Us1LViBkWi+ux2ONow/9sc=; b=HLhVmqGvsOXh5BSWWuIMWQFQR0uAV82ExdfFsfAWO4QXu9HFnpbgZqO4IaRmQk3rBG xNQOwbVrShMOly6ZLwH1SCU4O4mYIl8INIRerBd7svBevQMfKNc5vY63MrdeYuxblqIZ pys7os/WC3UJpk9V+DT+asvE+rBlB5ia00R5onFzGRIMoY5KC6AAMxvBuIifOeLq7FyQ xlwJJ/GYcY/JwTbHrn4O9krYuVAP+3kYB4BtYCvH0l5OIbuSSgjLO+c2yattWy0Wz+jN awaY9PB/ZwhiXRyE9g8bcV9mvpEU7qLKGid/Mt0EKkPKBmyyyqQ5SFja1k8/b8xBTHYy DTQQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=mw7tWl5v; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i4-v6si2043867pgk.2.2018.07.20.08.26.42; Fri, 20 Jul 2018 08:26:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=mw7tWl5v; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731863AbeGTQP2 (ORCPT + 5 others); Fri, 20 Jul 2018 12:15:28 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:44592 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728384AbeGTQP2 (ORCPT ); Fri, 20 Jul 2018 12:15:28 -0400 Received: by mail-wr1-f66.google.com with SMTP id r16-v6so11663039wrt.11 for ; Fri, 20 Jul 2018 08:26:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=y8DkA5i11ty12x5YlIUfAc512h2Xpa0Q8ESkN1MFWaQ=; b=mw7tWl5vvUf82tIMoecQlH0KLX7rb1eOM3KtBicJJznO76iacvGFdXymj4vP3nSNCz DlLlbZ7O7L0EFJmV5HCWjqRzyrtSk2QA8Cvng0SL9sJ726fBbZM/PGoRjeDayzFt47Wn PwqfRayQoBkZX29StgpXKFZyLs5rNbkw+XJj/KoIiDAaM97p0EirZWkFG+gIwHo5H1vj BqeceAsEsWrHvlTl+yIUCmS8Mju8ezZtmCR51zwYMzH7eHcgMrqNWBMJvfUC15D79xX1 gzXQaOxxlllx1cyfDisvlKCT5dRji275XKjgrmXv1sXpUCBaUUv1Sbbj3LnQO1cJa87V 2RTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=y8DkA5i11ty12x5YlIUfAc512h2Xpa0Q8ESkN1MFWaQ=; b=U+TeZgJQwIdaGjvWi9FWSfCCqKdx1ywFsqgVOxqd/7IsX7N0qVwHm+Wqbyy74TGtQL 99uTqtTsExaTrWfIAL7lRMhy/+2r8mNUt/qPnLc/XTwp13+gih21RhZzB3h0xIRWpaXc 2ra7zQirOhriC6SprT5Z0UqRHNcfcrko+skEmLMFTpz5WfFcaXAW6nWYvkeOekUvsa5/ B5APhlRkDhitNlxC0/FANlGgqkFuCRdnUPkymDUBhK2/+g5WHCy2/DhSoz1oC40Gy/4J y8ZXbU/cjSNWbFdAvT/OE++IEe4qVae6nhed8Y5v6FeeQ0Tbk7unl2SCMKCdG24cEMFa peRA== X-Gm-Message-State: AOUpUlE8EbLOTqjLnZQKsG2+159Lv5ft3j6HeuY7MoewLqFGjp2Kkd+j Ik72rTGrxfuJFsBx5FdABH7FOA== X-Received: by 2002:adf:8325:: with SMTP id 34-v6mr1776367wrd.67.1532100398687; Fri, 20 Jul 2018 08:26:38 -0700 (PDT) Received: from boomer.baylibre.local (uluru.liltaz.com. [163.172.81.188]) by smtp.googlemail.com with ESMTPSA id j3-v6sm2910051wrt.70.2018.07.20.08.26.37 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 20 Jul 2018 08:26:38 -0700 (PDT) From: Jerome Brunet To: Philipp Zabel , Kevin Hilman , Carlo Caione Cc: Jerome Brunet , devicetree@vger.kernel.org, linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/2] reset: meson: add meson audio arb driver Date: Fri, 20 Jul 2018 17:26:33 +0200 Message-Id: <20180720152633.6227-3-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.4 In-Reply-To: <20180720152633.6227-1-jbrunet@baylibre.com> References: <20180720152633.6227-1-jbrunet@baylibre.com> Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org The Amlogic Audio ARB is a simple device which enables or disables the access of Audio FIFOs to DDR on AXG based SoC. Signed-off-by: Jerome Brunet --- drivers/reset/Kconfig | 7 ++ drivers/reset/Makefile | 1 + drivers/reset/reset-meson-audio-arb.c | 168 ++++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 drivers/reset/reset-meson-audio-arb.c -- 2.14.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index c0b292be1b72..782dc59b3855 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig @@ -73,6 +73,13 @@ config RESET_MESON help This enables the reset driver for Amlogic Meson SoCs. +config RESET_MESON_AUDIO_ARB + tristate "Meson Audio Memory Arbiter Reset Driver" + depends on ARCH_MESON || COMPILE_TEST + help + This enables the reset driver for Audio Memory Arbiter of + Amlogic's A113 based SoCs + config RESET_OXNAS bool diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index c1261dcfe9ad..aca2240b48aa 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile @@ -12,6 +12,7 @@ obj-$(CONFIG_RESET_IMX7) += reset-imx7.o obj-$(CONFIG_RESET_LANTIQ) += reset-lantiq.o obj-$(CONFIG_RESET_LPC18XX) += reset-lpc18xx.o obj-$(CONFIG_RESET_MESON) += reset-meson.o +obj-$(CONFIG_RESET_MESON_AUDIO_ARB) += reset-meson-audio-arb.o obj-$(CONFIG_RESET_OXNAS) += reset-oxnas.o obj-$(CONFIG_RESET_PISTACHIO) += reset-pistachio.o obj-$(CONFIG_RESET_SIMPLE) += reset-simple.o diff --git a/drivers/reset/reset-meson-audio-arb.c b/drivers/reset/reset-meson-audio-arb.c new file mode 100644 index 000000000000..91751617b37a --- /dev/null +++ b/drivers/reset/reset-meson-audio-arb.c @@ -0,0 +1,168 @@ +// SPDX-License-Identifier: (GPL-2.0 OR MIT) +// Copyright (c) 2018 BayLibre, SAS. +// Author: Jerome Brunet + +#include +#include +#include +#include +#include +#include + +#include + +struct meson_audio_arb_data { + struct reset_controller_dev rstc; + void __iomem *regs; + struct clk *clk; + const unsigned int *reset_bits; + spinlock_t lock; +}; + +#define ARB_GENERAL_BIT 31 + +static const unsigned int axg_audio_arb_reset_bits[] = { + [AXG_ARB_TODDR_A] = 0, + [AXG_ARB_TODDR_B] = 1, + [AXG_ARB_TODDR_C] = 2, + [AXG_ARB_FRDDR_A] = 4, + [AXG_ARB_FRDDR_B] = 5, + [AXG_ARB_FRDDR_C] = 6, +}; + +static int meson_audio_arb_update(struct reset_controller_dev *rcdev, + unsigned long id, bool assert) +{ + u32 val; + struct meson_audio_arb_data *arb = + container_of(rcdev, struct meson_audio_arb_data, rstc); + + spin_lock(&arb->lock); + val = readl(arb->regs); + + if (assert) + val &= ~BIT(arb->reset_bits[id]); + else + val |= BIT(arb->reset_bits[id]); + + writel(val, arb->regs); + spin_unlock(&arb->lock); + + return 0; +} + +static int meson_audio_arb_status(struct reset_controller_dev *rcdev, + unsigned long id) +{ + u32 val; + struct meson_audio_arb_data *arb = + container_of(rcdev, struct meson_audio_arb_data, rstc); + + val = readl(arb->regs); + + return !(val & BIT(arb->reset_bits[id])); +} + +static int meson_audio_arb_assert(struct reset_controller_dev *rcdev, + unsigned long id) +{ + return meson_audio_arb_update(rcdev, id, true); +} + +static int meson_audio_arb_deassert(struct reset_controller_dev *rcdev, + unsigned long id) +{ + return meson_audio_arb_update(rcdev, id, false); +} + +static const struct reset_control_ops meson_audio_arb_rstc_ops = { + .assert = meson_audio_arb_assert, + .deassert = meson_audio_arb_deassert, + .status = meson_audio_arb_status, +}; + +static const struct of_device_id meson_audio_arb_of_match[] = { + { .compatible = "amlogic,meson-axg-audio-arb", }, + {} +}; +MODULE_DEVICE_TABLE(of, meson_audio_arb_of_match); + +static int meson_audio_arb_remove(struct platform_device *pdev) +{ + struct meson_audio_arb_data *arb = platform_get_drvdata(pdev); + + /* Disable all access */ + spin_lock(&arb->lock); + writel(0, arb->regs); + spin_unlock(&arb->lock); + + clk_disable_unprepare(arb->clk); + + return 0; +} + +static int meson_audio_arb_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct meson_audio_arb_data *arb; + struct resource *res; + int ret; + + arb = devm_kzalloc(dev, sizeof(*arb), GFP_KERNEL); + if (!arb) + return -ENOMEM; + platform_set_drvdata(pdev, arb); + + arb->clk = devm_clk_get(dev, NULL); + if (IS_ERR(arb->clk)) { + if (PTR_ERR(arb->clk) != -EPROBE_DEFER) + dev_err(dev, "failed to get clock\n"); + return PTR_ERR(arb->clk); + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + arb->regs = devm_ioremap_resource(dev, res); + if (IS_ERR(arb->regs)) + return PTR_ERR(arb->regs); + + spin_lock_init(&arb->lock); + arb->reset_bits = axg_audio_arb_reset_bits; + arb->rstc.nr_resets = ARRAY_SIZE(axg_audio_arb_reset_bits); + arb->rstc.ops = &meson_audio_arb_rstc_ops; + arb->rstc.of_node = dev->of_node; + + /* + * Enable general : + * In the initial state, all memory interfaces are disabled + * and the general bit is on + */ + ret = clk_prepare_enable(arb->clk); + if (ret) { + dev_err(dev, "failed to enable arb clock\n"); + return ret; + } + writel(BIT(ARB_GENERAL_BIT), arb->regs); + + /* Register reset controller */ + ret = devm_reset_controller_register(dev, &arb->rstc); + if (ret) { + dev_err(dev, "failed to register arb reset controller\n"); + meson_audio_arb_remove(pdev); + } + + return ret; +} + +static struct platform_driver meson_audio_arb_pdrv = { + .probe = meson_audio_arb_probe, + .remove = meson_audio_arb_remove, + .driver = { + .name = "meson-audio-arb-reset", + .of_match_table = meson_audio_arb_of_match, + }, +}; +module_platform_driver(meson_audio_arb_pdrv); + +MODULE_DESCRIPTION("Amlogic A113 Audio Memory Arbiter"); +MODULE_AUTHOR("Jerome Brunet "); +MODULE_LICENSE("GPL v2");