mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-28 21:26:49 +00:00
Merge pull request #4220 from chewitt/amlogic-upstream
bump Amlogic to Linux 5.6
This commit is contained in:
commit
9f00cd296d
45
licenses/QCA.txt
Normal file
45
licenses/QCA.txt
Normal file
@ -0,0 +1,45 @@
|
||||
Copyright (c) 2013-2017 Qualcomm Atheros, Inc.
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in binary forms, without
|
||||
modification, are permitted (subject to the limitations in the
|
||||
disclaimer below) provided that the following conditions are met:
|
||||
|
||||
* Redistributions must reproduce the above copyright notice, this list
|
||||
of conditions, and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of Qualcomm Atheros, Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
* No Reverse engineering, decompiling, decrypting, or disassembling of
|
||||
this software is permitted.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. NO LICENSES OR OTHER RIGHTS,
|
||||
WHETHER EXPRESS, IMPLIED, BASED ON ESTOPPEL OR OTHERWISE, ARE GRANTED
|
||||
TO ANY PARTY'S PATENTS, PATENT APPLICATIONS, OR PATENTABLE INVENTIONS
|
||||
BY VIRTUE OF THIS LICENSE OR THE DELIVERY OR PROVISION BY QUALCOMM
|
||||
ATHEROS, INC. OF THE SOFTWARE.
|
||||
|
||||
IN NO EVENT SHALL THE COPYRIGHT OWNER OR ANY CONTRIBUTOR BE LIABLE FOR
|
||||
ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND REGARDLESS OF ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF OR RESULTING FROM THE USE OF THE
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN ANY
|
||||
EVENT, THE TOTAL AGGREGATE LIABILITY THAT MAY BE IMPOSED ON QUALCOMM
|
||||
ATHEROS, INC. FOR ANY DIRECT DAMAGES ARISING UNDER OR RESULTING FROM
|
||||
THIS AGREEMENT OR IN CONNECTION WITH ANY USE OF THE SOFTWARE SHALL NOT
|
||||
EXCEED A TOTAL AMOUNT OF US$5.00.
|
||||
|
||||
IF ANY OF THE ABOVE PROVISIONS ARE HELD TO BE VOID, INVALID,
|
||||
UNENFORCEABLE, OR ILLEGAL, THE OTHER PROVISIONS SHALL CONTINUE IN FULL
|
||||
FORCE AND EFFECT.
|
||||
|
@ -140,6 +140,10 @@ else
|
||||
mixer $card 'FRDDR_B SRC 1 EN' on
|
||||
mixer $card 'SPDIFOUT SRC SEL' 'IN 1'
|
||||
mixer $card 'SPDIFOUT Playback' on
|
||||
|
||||
# Amlogic GX HDMI and S/PDIF
|
||||
mixer $card 'AIU HDMI CTRL SRC' 'I2S'
|
||||
mixer $card 'AIU SPDIF SRC SEL' 'SPDIF'
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="mali-bifrost"
|
||||
PKG_VERSION="61bf5319dfd266b72a96c9c2d518dbbde8514d66" # BX301A01B-SW-99002-r16p0-01rel0
|
||||
PKG_SHA256="b21d840586f24638d76d5a9684b812a4cb9415006f320a34db6f8b389cfb0a1c"
|
||||
PKG_VERSION="af7c8d8bcdedd792a8d101d3a11876bb8bcbe3da" # BX301A01B-SW-99002-r16p0-01rel0
|
||||
PKG_SHA256="712ba83f28bf687e2147f0f586678421b0d2cb5620423e93e7b7c9ddf35c1da5"
|
||||
PKG_ARCH="arm aarch64"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://developer.arm.com/products/software/mali-drivers/bifrost-kernel"
|
||||
|
@ -1 +0,0 @@
|
||||
meson/*
|
@ -1,43 +0,0 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="meson-firmware"
|
||||
PKG_VERSION="edd24b481293b93814494508cd4952b67f15acb3"
|
||||
PKG_SHA256="2092c71a5eb106725784dadcc2cfea7be60254539a41fafebf311235283259e4"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/LibreELEC/meson-firmware"
|
||||
PKG_URL="https://github.com/LibreELEC/meson-firmware/archive/$PKG_VERSION.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain"
|
||||
PKG_LONGDESC="meson-firmware: Amlogic microcode firmware for the V4L2 mem2mem vdec driver"
|
||||
PKG_TOOLCHAIN="manual"
|
||||
|
||||
makeinstall_target() {
|
||||
FW_TARGET_DIR=$INSTALL/$(get_full_firmware_dir)
|
||||
|
||||
if find_file_path config/$PKG_NAME.dat; then
|
||||
FW_LISTS="${FOUND_PATH}"
|
||||
else
|
||||
FW_LISTS="${PKG_DIR}/firmwares/any.dat ${PKG_DIR}/firmwares/${TARGET_ARCH}.dat"
|
||||
fi
|
||||
|
||||
for fwlist in ${FW_LISTS}; do
|
||||
[ -f ${fwlist} ] || continue
|
||||
while read -r fwline; do
|
||||
[ -z "${fwline}" ] && continue
|
||||
[[ ${fwline} =~ ^#.* ]] && continue
|
||||
[[ ${fwline} =~ ^[[:space:]] ]] && continue
|
||||
|
||||
for fwfile in $(cd ${PKG_BUILD} && eval "find ${fwline}"); do
|
||||
[ -d ${PKG_BUILD}/${fwfile} ] && continue
|
||||
|
||||
if [ -f ${PKG_BUILD}/${fwfile} ]; then
|
||||
mkdir -p $(dirname ${FW_TARGET_DIR}/${fwfile})
|
||||
cp -Lv ${PKG_BUILD}/${fwfile} ${FW_TARGET_DIR}/${fwfile}
|
||||
else
|
||||
echo "ERROR: Firmware file ${fwfile} does not exist - aborting"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
done < ${fwlist}
|
||||
done
|
||||
}
|
16
packages/linux-firmware/qca-firmware/package.mk
Normal file
16
packages/linux-firmware/qca-firmware/package.mk
Normal file
@ -0,0 +1,16 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="qca-firmware"
|
||||
PKG_VERSION="39d025c6d52085c529568c4e110ca6d0b290fef6"
|
||||
PKG_SHA256="7af9e815f0cc5136819c9f7e02c548ea736d34c9a67ca065e5a693f4fdadb312"
|
||||
PKG_LICENSE="QCA"
|
||||
PKG_URL="https://github.com/LibreELEC/qca-firmware/archive/$PKG_VERSION.tar.gz"
|
||||
PKG_LONGDESC="qca-firmware: WiFi/BT firmware for QCA9377 SDIO modules"
|
||||
PKG_TOOLCHAIN="manual"
|
||||
|
||||
makeinstall_target() {
|
||||
mkdir -p $INSTALL/$(get_full_firmware_dir)
|
||||
cp -a ath10k $INSTALL/$(get_full_firmware_dir)
|
||||
cp -a qca $INSTALL/$(get_full_firmware_dir)
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
[Unit]
|
||||
Description=QCA Bluetooth Firmware Service
|
||||
ConditionPathExists=/dev/ttyAML1
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/usr/bin/hciattach -n -s 115200 /dev/ttyAML1 qca 2000000
|
||||
Restart=always
|
||||
RestartSec=2
|
||||
StartLimitInterval=0
|
||||
LimitNPROC=1
|
||||
TimeoutStopSec=1s
|
@ -0,0 +1,6 @@
|
||||
########################################################
|
||||
# udev rules file for loading QCA9377 bluetooth firmware
|
||||
########################################################
|
||||
|
||||
ACTION=="add", SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x0271", ATTRS{device}=="0x0701", \
|
||||
TAG+="systemd", ENV{SYSTEMD_WANTS}+="qca-firmware.service"
|
@ -16,8 +16,8 @@ PKG_PATCH_DIRS="$LINUX"
|
||||
|
||||
case "$LINUX" in
|
||||
amlogic)
|
||||
PKG_VERSION="4d856f72c10ecb060868ed10ff1b1453943fc6c8" # 5.3.0
|
||||
PKG_SHA256="d3d49f2f7c06dd5acfd0f3337690e10eb2a3401be12154d470b41c255e603b3b"
|
||||
PKG_VERSION="98d54f81e36ba3bf92172791eba5ca5bd813989b" # 5.6-rc4
|
||||
PKG_SHA256="93d86760f8c2bc694c3a0ac6ceaa78034fe7d4026221d8480cd9696074d59a46"
|
||||
PKG_URL="https://github.com/torvalds/linux/archive/$PKG_VERSION.tar.gz"
|
||||
PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz"
|
||||
PKG_PATCH_DIRS="amlogic"
|
||||
|
@ -1,110 +0,0 @@
|
||||
From 4169a8c1d272251a1897ca3072ec9b27a04e90dc Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Wed, 12 Jun 2019 10:51:47 +0200
|
||||
Subject: [PATCH 001/187] FROMGIT: drm/bridge: dw-hdmi: Use automatic CTS
|
||||
generation mode when using non-AHB audio
|
||||
|
||||
When using an I2S source using a different clock source (usually the I2S
|
||||
audio HW uses dedicated PLLs, different from the HDMI PHY PLL), fixed
|
||||
CTS values will cause some frequent audio drop-out and glitches as
|
||||
reported on Amlogic, Allwinner and Rockchip SoCs setups.
|
||||
|
||||
Setting the CTS in automatic mode will let the HDMI controller generate
|
||||
automatically the CTS value to match the input audio clock.
|
||||
|
||||
The DesignWare DW-HDMI User Guide explains:
|
||||
For Automatic CTS generation
|
||||
Write "0" on the bit field "CTS_manual", Register 0x3205: AUD_CTS3
|
||||
|
||||
The DesignWare DW-HDMI Databook explains :
|
||||
If "CTS_manual" bit equals 0b this registers contains "audCTS[19:0]"
|
||||
generated by the Cycle time counter according to specified timing.
|
||||
|
||||
Cc: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Cc: Maxime Ripard <maxime.ripard@bootlin.com>
|
||||
Cc: Jonas Karlman <jonas@kwiboo.se>
|
||||
Cc: Heiko Stuebner <heiko@sntech.de>
|
||||
Cc: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Tested-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Reviewed-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Tested-by: Douglas Anderson <dianders@chromium.org>
|
||||
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20190612085147.26971-1-narmstrong@baylibre.com
|
||||
(cherry-picked from fdbdcc83ffd7d00265a531e71f1d166566c09d66
|
||||
git://anongit.freedesktop.org/drm/drm-misc)
|
||||
---
|
||||
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 45 +++++++++++++++--------
|
||||
1 file changed, 30 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
index c6490949d9db..218a7b2308f7 100644
|
||||
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
@@ -508,8 +508,14 @@ static void hdmi_set_cts_n(struct dw_hdmi *hdmi, unsigned int cts,
|
||||
/* nshift factor = 0 */
|
||||
hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_N_SHIFT_MASK, HDMI_AUD_CTS3);
|
||||
|
||||
- hdmi_writeb(hdmi, ((cts >> 16) & HDMI_AUD_CTS3_AUDCTS19_16_MASK) |
|
||||
- HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
|
||||
+ /* Use automatic CTS generation mode when CTS is not set */
|
||||
+ if (cts)
|
||||
+ hdmi_writeb(hdmi, ((cts >> 16) &
|
||||
+ HDMI_AUD_CTS3_AUDCTS19_16_MASK) |
|
||||
+ HDMI_AUD_CTS3_CTS_MANUAL,
|
||||
+ HDMI_AUD_CTS3);
|
||||
+ else
|
||||
+ hdmi_writeb(hdmi, 0, HDMI_AUD_CTS3);
|
||||
hdmi_writeb(hdmi, (cts >> 8) & 0xff, HDMI_AUD_CTS2);
|
||||
hdmi_writeb(hdmi, cts & 0xff, HDMI_AUD_CTS1);
|
||||
|
||||
@@ -579,24 +585,33 @@ static void hdmi_set_clk_regenerator(struct dw_hdmi *hdmi,
|
||||
{
|
||||
unsigned long ftdms = pixel_clk;
|
||||
unsigned int n, cts;
|
||||
+ u8 config3;
|
||||
u64 tmp;
|
||||
|
||||
n = hdmi_compute_n(sample_rate, pixel_clk);
|
||||
|
||||
- /*
|
||||
- * Compute the CTS value from the N value. Note that CTS and N
|
||||
- * can be up to 20 bits in total, so we need 64-bit math. Also
|
||||
- * note that our TDMS clock is not fully accurate; it is accurate
|
||||
- * to kHz. This can introduce an unnecessary remainder in the
|
||||
- * calculation below, so we don't try to warn about that.
|
||||
- */
|
||||
- tmp = (u64)ftdms * n;
|
||||
- do_div(tmp, 128 * sample_rate);
|
||||
- cts = tmp;
|
||||
+ config3 = hdmi_readb(hdmi, HDMI_CONFIG3_ID);
|
||||
|
||||
- dev_dbg(hdmi->dev, "%s: fs=%uHz ftdms=%lu.%03luMHz N=%d cts=%d\n",
|
||||
- __func__, sample_rate, ftdms / 1000000, (ftdms / 1000) % 1000,
|
||||
- n, cts);
|
||||
+ /* Only compute CTS when using internal AHB audio */
|
||||
+ if (config3 & HDMI_CONFIG3_AHBAUDDMA) {
|
||||
+ /*
|
||||
+ * Compute the CTS value from the N value. Note that CTS and N
|
||||
+ * can be up to 20 bits in total, so we need 64-bit math. Also
|
||||
+ * note that our TDMS clock is not fully accurate; it is
|
||||
+ * accurate to kHz. This can introduce an unnecessary remainder
|
||||
+ * in the calculation below, so we don't try to warn about that.
|
||||
+ */
|
||||
+ tmp = (u64)ftdms * n;
|
||||
+ do_div(tmp, 128 * sample_rate);
|
||||
+ cts = tmp;
|
||||
+
|
||||
+ dev_dbg(hdmi->dev, "%s: fs=%uHz ftdms=%lu.%03luMHz N=%d cts=%d\n",
|
||||
+ __func__, sample_rate,
|
||||
+ ftdms / 1000000, (ftdms / 1000) % 1000,
|
||||
+ n, cts);
|
||||
+ } else {
|
||||
+ cts = 0;
|
||||
+ }
|
||||
|
||||
spin_lock_irq(&hdmi->audio_lock);
|
||||
hdmi->audio_n = n;
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,77 @@
|
||||
From 42f3bbd03e5f991da0e42d827addc859f3b9b117 Mon Sep 17 00:00:00 2001
|
||||
From: Tomeu Vizoso <tomeu.vizoso@collabora.com>
|
||||
Date: Mon, 24 Feb 2020 02:01:13 +0000
|
||||
Subject: [PATCH 001/146] FROMLIST: drm/panfrost: Don't try to map on error
|
||||
faults
|
||||
|
||||
If the exception type isn't a translation fault, don't try to map and
|
||||
instead go straight to a terminal fault.
|
||||
|
||||
Otherwise, we can get flooded by kernel warnings and further faults.
|
||||
|
||||
Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
|
||||
Signed-off-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
drivers/gpu/drm/panfrost/panfrost_mmu.c | 44 +++++++++++--------------
|
||||
1 file changed, 19 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c b/drivers/gpu/drm/panfrost/panfrost_mmu.c
|
||||
index 3107b0738e40..5d75f8cf6477 100644
|
||||
--- a/drivers/gpu/drm/panfrost/panfrost_mmu.c
|
||||
+++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c
|
||||
@@ -601,33 +601,27 @@ static irqreturn_t panfrost_mmu_irq_handler_thread(int irq, void *data)
|
||||
source_id = (fault_status >> 16);
|
||||
|
||||
/* Page fault only */
|
||||
- if ((status & mask) == BIT(i)) {
|
||||
- WARN_ON(exception_type < 0xC1 || exception_type > 0xC4);
|
||||
-
|
||||
+ ret = -1;
|
||||
+ if ((status & mask) == BIT(i) && (exception_type & 0xF8) == 0xC0)
|
||||
ret = panfrost_mmu_map_fault_addr(pfdev, i, addr);
|
||||
- if (!ret) {
|
||||
- mmu_write(pfdev, MMU_INT_CLEAR, BIT(i));
|
||||
- status &= ~mask;
|
||||
- continue;
|
||||
- }
|
||||
- }
|
||||
|
||||
- /* terminal fault, print info about the fault */
|
||||
- dev_err(pfdev->dev,
|
||||
- "Unhandled Page fault in AS%d at VA 0x%016llX\n"
|
||||
- "Reason: %s\n"
|
||||
- "raw fault status: 0x%X\n"
|
||||
- "decoded fault status: %s\n"
|
||||
- "exception type 0x%X: %s\n"
|
||||
- "access type 0x%X: %s\n"
|
||||
- "source id 0x%X\n",
|
||||
- i, addr,
|
||||
- "TODO",
|
||||
- fault_status,
|
||||
- (fault_status & (1 << 10) ? "DECODER FAULT" : "SLAVE FAULT"),
|
||||
- exception_type, panfrost_exception_name(pfdev, exception_type),
|
||||
- access_type, access_type_name(pfdev, fault_status),
|
||||
- source_id);
|
||||
+ if (ret)
|
||||
+ /* terminal fault, print info about the fault */
|
||||
+ dev_err(pfdev->dev,
|
||||
+ "Unhandled Page fault in AS%d at VA 0x%016llX\n"
|
||||
+ "Reason: %s\n"
|
||||
+ "raw fault status: 0x%X\n"
|
||||
+ "decoded fault status: %s\n"
|
||||
+ "exception type 0x%X: %s\n"
|
||||
+ "access type 0x%X: %s\n"
|
||||
+ "source id 0x%X\n",
|
||||
+ i, addr,
|
||||
+ "TODO",
|
||||
+ fault_status,
|
||||
+ (fault_status & (1 << 10) ? "DECODER FAULT" : "SLAVE FAULT"),
|
||||
+ exception_type, panfrost_exception_name(pfdev, exception_type),
|
||||
+ access_type, access_type_name(pfdev, fault_status),
|
||||
+ source_id);
|
||||
|
||||
mmu_write(pfdev, MMU_INT_CLEAR, mask);
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,36 +0,0 @@
|
||||
From 0d38ee3d8b2f937e774b0072711fe6b49fc66cd0 Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Date: Fri, 24 May 2019 11:15:32 +0200
|
||||
Subject: [PATCH 002/187] FROMGIT: clk: meson: g12a: fix hifi typo in mali
|
||||
parent_names
|
||||
|
||||
Replace hihi by hifi in the mali parent_names of the g12a SoC family.
|
||||
|
||||
Fixes: 085a4ea93d54 ("clk: meson: g12a: add peripheral clock controller")
|
||||
Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit b6297d9e078a4127fb608ede4d0944855dde667d
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/g12a.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c
|
||||
index db1c4ed9d54e..7bc5566b66f7 100644
|
||||
--- a/drivers/clk/meson/g12a.c
|
||||
+++ b/drivers/clk/meson/g12a.c
|
||||
@@ -2888,7 +2888,7 @@ static struct clk_regmap g12a_hdmi = {
|
||||
*/
|
||||
|
||||
static const char * const g12a_mali_0_1_parent_names[] = {
|
||||
- IN_PREFIX "xtal", "gp0_pll", "hihi_pll", "fclk_div2p5",
|
||||
+ IN_PREFIX "xtal", "gp0_pll", "hifi_pll", "fclk_div2p5",
|
||||
"fclk_div3", "fclk_div4", "fclk_div5", "fclk_div7"
|
||||
};
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,30 @@
|
||||
From 72475ec15080b4a976c3815261723a91bb9a755b Mon Sep 17 00:00:00 2001
|
||||
From: Qiang Yu <yuq825@gmail.com>
|
||||
Date: Thu, 16 Jan 2020 21:11:53 +0800
|
||||
Subject: [PATCH 002/146] FROMGIT: drm/lima: update register info
|
||||
|
||||
From Mali r10p0 kernel driver source code.
|
||||
|
||||
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||
Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
|
||||
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20200116131157.13346-2-yuq825@gmail.com
|
||||
---
|
||||
drivers/gpu/drm/lima/lima_regs.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/lima/lima_regs.h b/drivers/gpu/drm/lima/lima_regs.h
|
||||
index ace8ecefbe90..0124c90e0153 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_regs.h
|
||||
+++ b/drivers/gpu/drm/lima/lima_regs.h
|
||||
@@ -239,6 +239,7 @@
|
||||
#define LIMA_MMU_STATUS_REPLAY_BUFFER_EMPTY BIT(4)
|
||||
#define LIMA_MMU_STATUS_PAGE_FAULT_IS_WRITE BIT(5)
|
||||
#define LIMA_MMU_STATUS_BUS_ID(x) ((x >> 6) & 0x1F)
|
||||
+#define LIMA_MMU_STATUS_STALL_NOT_ACTIVE BIT(31)
|
||||
#define LIMA_MMU_COMMAND 0x0008
|
||||
#define LIMA_MMU_COMMAND_ENABLE_PAGING 0x00
|
||||
#define LIMA_MMU_COMMAND_DISABLE_PAGING 0x01
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,534 +0,0 @@
|
||||
From 2ae77fa279fc6bf3006d0d28b3c809cb3f09813e Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Date: Thu, 25 Jul 2019 18:40:23 +0200
|
||||
Subject: [PATCH 003/187] FROMGIT: clk: meson: axg-audio: migrate to the new
|
||||
parent description method
|
||||
|
||||
This clock controller use the string comparison method to describe parent
|
||||
relation between the clocks, which is not optimized. A recent patch [0]
|
||||
allows parents to be specified without string names or with device-tree
|
||||
clock name by using a new assignment structure.
|
||||
|
||||
Migrate to the new way by using .parent_hws where possible (when parent
|
||||
clocks are localy declared in the controller) and use .parent_data
|
||||
otherwise.
|
||||
|
||||
Remove clk input helper and all bypass clocks (declared in probe function)
|
||||
which are no longer used since we are able to use device-tree clock name
|
||||
directly.
|
||||
|
||||
[0] commit fc0c209c147f ("clk: Allow parents to be specified without string names")
|
||||
|
||||
Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
[jbrunet@baylibre.com: remove CLK_SET_RATE_PARENT from mst muxes]
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit 282420eed23f237963f2033b2f2bedb90fbcc5e1
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/Kconfig | 1 -
|
||||
drivers/clk/meson/axg-audio.c | 261 ++++++++++++++++------------------
|
||||
2 files changed, 120 insertions(+), 142 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
|
||||
index a6b20e123e0c..ee0b84b6b329 100644
|
||||
--- a/drivers/clk/meson/Kconfig
|
||||
+++ b/drivers/clk/meson/Kconfig
|
||||
@@ -86,7 +86,6 @@ config COMMON_CLK_AXG
|
||||
config COMMON_CLK_AXG_AUDIO
|
||||
tristate "Meson AXG Audio Clock Controller Driver"
|
||||
depends on ARCH_MESON
|
||||
- select COMMON_CLK_MESON_INPUT
|
||||
select COMMON_CLK_MESON_REGMAP
|
||||
select COMMON_CLK_MESON_PHASE
|
||||
select COMMON_CLK_MESON_SCLK_DIV
|
||||
diff --git a/drivers/clk/meson/axg-audio.c b/drivers/clk/meson/axg-audio.c
|
||||
index 8028ff6f6610..741df7e955ca 100644
|
||||
--- a/drivers/clk/meson/axg-audio.c
|
||||
+++ b/drivers/clk/meson/axg-audio.c
|
||||
@@ -15,7 +15,6 @@
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "axg-audio.h"
|
||||
-#include "clk-input.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-phase.h"
|
||||
#include "sclk-div.h"
|
||||
@@ -24,7 +23,7 @@
|
||||
#define AUD_SLV_SCLK_COUNT 10
|
||||
#define AUD_SLV_LRCLK_COUNT 10
|
||||
|
||||
-#define AUD_GATE(_name, _reg, _bit, _pname, _iflags) \
|
||||
+#define AUD_GATE(_name, _reg, _bit, _phws, _iflags) \
|
||||
struct clk_regmap aud_##_name = { \
|
||||
.data = &(struct clk_regmap_gate_data){ \
|
||||
.offset = (_reg), \
|
||||
@@ -33,13 +32,13 @@ struct clk_regmap aud_##_name = { \
|
||||
.hw.init = &(struct clk_init_data) { \
|
||||
.name = "aud_"#_name, \
|
||||
.ops = &clk_regmap_gate_ops, \
|
||||
- .parent_names = (const char *[]){ _pname }, \
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &_phws.hw }, \
|
||||
.num_parents = 1, \
|
||||
.flags = CLK_DUTY_CYCLE_PARENT | (_iflags), \
|
||||
}, \
|
||||
}
|
||||
|
||||
-#define AUD_MUX(_name, _reg, _mask, _shift, _dflags, _pnames, _iflags) \
|
||||
+#define AUD_MUX(_name, _reg, _mask, _shift, _dflags, _pdata, _iflags) \
|
||||
struct clk_regmap aud_##_name = { \
|
||||
.data = &(struct clk_regmap_mux_data){ \
|
||||
.offset = (_reg), \
|
||||
@@ -50,13 +49,13 @@ struct clk_regmap aud_##_name = { \
|
||||
.hw.init = &(struct clk_init_data){ \
|
||||
.name = "aud_"#_name, \
|
||||
.ops = &clk_regmap_mux_ops, \
|
||||
- .parent_names = (_pnames), \
|
||||
- .num_parents = ARRAY_SIZE(_pnames), \
|
||||
+ .parent_data = _pdata, \
|
||||
+ .num_parents = ARRAY_SIZE(_pdata), \
|
||||
.flags = CLK_DUTY_CYCLE_PARENT | (_iflags), \
|
||||
}, \
|
||||
}
|
||||
|
||||
-#define AUD_DIV(_name, _reg, _shift, _width, _dflags, _pname, _iflags) \
|
||||
+#define AUD_DIV(_name, _reg, _shift, _width, _dflags, _phws, _iflags) \
|
||||
struct clk_regmap aud_##_name = { \
|
||||
.data = &(struct clk_regmap_div_data){ \
|
||||
.offset = (_reg), \
|
||||
@@ -67,15 +66,27 @@ struct clk_regmap aud_##_name = { \
|
||||
.hw.init = &(struct clk_init_data){ \
|
||||
.name = "aud_"#_name, \
|
||||
.ops = &clk_regmap_divider_ops, \
|
||||
- .parent_names = (const char *[]) { _pname }, \
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &_phws.hw }, \
|
||||
.num_parents = 1, \
|
||||
.flags = (_iflags), \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define AUD_PCLK_GATE(_name, _bit) \
|
||||
- AUD_GATE(_name, AUDIO_CLK_GATE_EN, _bit, "audio_pclk", 0)
|
||||
-
|
||||
+struct clk_regmap aud_##_name = { \
|
||||
+ .data = &(struct clk_regmap_gate_data){ \
|
||||
+ .offset = (AUDIO_CLK_GATE_EN), \
|
||||
+ .bit_idx = (_bit), \
|
||||
+ }, \
|
||||
+ .hw.init = &(struct clk_init_data) { \
|
||||
+ .name = "aud_"#_name, \
|
||||
+ .ops = &clk_regmap_gate_ops, \
|
||||
+ .parent_data = &(const struct clk_parent_data) { \
|
||||
+ .fw_name = "pclk", \
|
||||
+ }, \
|
||||
+ .num_parents = 1, \
|
||||
+ }, \
|
||||
+}
|
||||
/* Audio peripheral clocks */
|
||||
static AUD_PCLK_GATE(ddr_arb, 0);
|
||||
static AUD_PCLK_GATE(pdm, 1);
|
||||
@@ -100,14 +111,20 @@ static AUD_PCLK_GATE(power_detect, 19);
|
||||
static AUD_PCLK_GATE(spdifout_b, 21);
|
||||
|
||||
/* Audio Master Clocks */
|
||||
-static const char * const mst_mux_parent_names[] = {
|
||||
- "aud_mst_in0", "aud_mst_in1", "aud_mst_in2", "aud_mst_in3",
|
||||
- "aud_mst_in4", "aud_mst_in5", "aud_mst_in6", "aud_mst_in7",
|
||||
+static const struct clk_parent_data mst_mux_parent_data[] = {
|
||||
+ { .fw_name = "mst_in0", },
|
||||
+ { .fw_name = "mst_in1", },
|
||||
+ { .fw_name = "mst_in2", },
|
||||
+ { .fw_name = "mst_in3", },
|
||||
+ { .fw_name = "mst_in4", },
|
||||
+ { .fw_name = "mst_in5", },
|
||||
+ { .fw_name = "mst_in6", },
|
||||
+ { .fw_name = "mst_in7", },
|
||||
};
|
||||
|
||||
#define AUD_MST_MUX(_name, _reg, _flag) \
|
||||
AUD_MUX(_name##_sel, _reg, 0x7, 24, _flag, \
|
||||
- mst_mux_parent_names, CLK_SET_RATE_PARENT)
|
||||
+ mst_mux_parent_data, 0)
|
||||
|
||||
#define AUD_MST_MCLK_MUX(_name, _reg) \
|
||||
AUD_MST_MUX(_name, _reg, CLK_MUX_ROUND_CLOSEST)
|
||||
@@ -129,7 +146,7 @@ static AUD_MST_MCLK_MUX(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL);
|
||||
|
||||
#define AUD_MST_DIV(_name, _reg, _flag) \
|
||||
AUD_DIV(_name##_div, _reg, 0, 16, _flag, \
|
||||
- "aud_"#_name"_sel", CLK_SET_RATE_PARENT) \
|
||||
+ aud_##_name##_sel, CLK_SET_RATE_PARENT) \
|
||||
|
||||
#define AUD_MST_MCLK_DIV(_name, _reg) \
|
||||
AUD_MST_DIV(_name, _reg, CLK_DIVIDER_ROUND_CLOSEST)
|
||||
@@ -150,7 +167,7 @@ static AUD_MST_SYS_DIV(pdm_sysclk, AUDIO_CLK_PDMIN_CTRL1);
|
||||
static AUD_MST_MCLK_DIV(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL);
|
||||
|
||||
#define AUD_MST_MCLK_GATE(_name, _reg) \
|
||||
- AUD_GATE(_name, _reg, 31, "aud_"#_name"_div", \
|
||||
+ AUD_GATE(_name, _reg, 31, aud_##_name##_div, \
|
||||
CLK_SET_RATE_PARENT)
|
||||
|
||||
static AUD_MST_MCLK_GATE(mst_a_mclk, AUDIO_MCLK_A_CTRL);
|
||||
@@ -168,7 +185,7 @@ static AUD_MST_MCLK_GATE(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL);
|
||||
/* Sample Clocks */
|
||||
#define AUD_MST_SCLK_PRE_EN(_name, _reg) \
|
||||
AUD_GATE(mst_##_name##_sclk_pre_en, _reg, 31, \
|
||||
- "aud_mst_"#_name"_mclk", 0)
|
||||
+ aud_mst_##_name##_mclk, 0)
|
||||
|
||||
static AUD_MST_SCLK_PRE_EN(a, AUDIO_MST_A_SCLK_CTRL0);
|
||||
static AUD_MST_SCLK_PRE_EN(b, AUDIO_MST_B_SCLK_CTRL0);
|
||||
@@ -178,7 +195,7 @@ static AUD_MST_SCLK_PRE_EN(e, AUDIO_MST_E_SCLK_CTRL0);
|
||||
static AUD_MST_SCLK_PRE_EN(f, AUDIO_MST_F_SCLK_CTRL0);
|
||||
|
||||
#define AUD_SCLK_DIV(_name, _reg, _div_shift, _div_width, \
|
||||
- _hi_shift, _hi_width, _pname, _iflags) \
|
||||
+ _hi_shift, _hi_width, _phws, _iflags) \
|
||||
struct clk_regmap aud_##_name = { \
|
||||
.data = &(struct meson_sclk_div_data) { \
|
||||
.div = { \
|
||||
@@ -195,7 +212,7 @@ struct clk_regmap aud_##_name = { \
|
||||
.hw.init = &(struct clk_init_data) { \
|
||||
.name = "aud_"#_name, \
|
||||
.ops = &meson_sclk_div_ops, \
|
||||
- .parent_names = (const char *[]) { _pname }, \
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &_phws.hw }, \
|
||||
.num_parents = 1, \
|
||||
.flags = (_iflags), \
|
||||
}, \
|
||||
@@ -203,7 +220,7 @@ struct clk_regmap aud_##_name = { \
|
||||
|
||||
#define AUD_MST_SCLK_DIV(_name, _reg) \
|
||||
AUD_SCLK_DIV(mst_##_name##_sclk_div, _reg, 20, 10, 0, 0, \
|
||||
- "aud_mst_"#_name"_sclk_pre_en", \
|
||||
+ aud_mst_##_name##_sclk_pre_en, \
|
||||
CLK_SET_RATE_PARENT)
|
||||
|
||||
static AUD_MST_SCLK_DIV(a, AUDIO_MST_A_SCLK_CTRL0);
|
||||
@@ -214,8 +231,8 @@ static AUD_MST_SCLK_DIV(e, AUDIO_MST_E_SCLK_CTRL0);
|
||||
static AUD_MST_SCLK_DIV(f, AUDIO_MST_F_SCLK_CTRL0);
|
||||
|
||||
#define AUD_MST_SCLK_POST_EN(_name, _reg) \
|
||||
- AUD_GATE(mst_##_name##_sclk_post_en, _reg, 30, \
|
||||
- "aud_mst_"#_name"_sclk_div", CLK_SET_RATE_PARENT)
|
||||
+ AUD_GATE(mst_##_name##_sclk_post_en, _reg, 30, \
|
||||
+ aud_mst_##_name##_sclk_div, CLK_SET_RATE_PARENT)
|
||||
|
||||
static AUD_MST_SCLK_POST_EN(a, AUDIO_MST_A_SCLK_CTRL0);
|
||||
static AUD_MST_SCLK_POST_EN(b, AUDIO_MST_B_SCLK_CTRL0);
|
||||
@@ -224,8 +241,8 @@ static AUD_MST_SCLK_POST_EN(d, AUDIO_MST_D_SCLK_CTRL0);
|
||||
static AUD_MST_SCLK_POST_EN(e, AUDIO_MST_E_SCLK_CTRL0);
|
||||
static AUD_MST_SCLK_POST_EN(f, AUDIO_MST_F_SCLK_CTRL0);
|
||||
|
||||
-#define AUD_TRIPHASE(_name, _reg, _width, _shift0, _shift1, _shift2, \
|
||||
- _pname, _iflags) \
|
||||
+#define AUD_TRIPHASE(_name, _reg, _width, _shift0, _shift1, _shift2, \
|
||||
+ _phws, _iflags) \
|
||||
struct clk_regmap aud_##_name = { \
|
||||
.data = &(struct meson_clk_triphase_data) { \
|
||||
.ph0 = { \
|
||||
@@ -247,7 +264,7 @@ struct clk_regmap aud_##_name = { \
|
||||
.hw.init = &(struct clk_init_data) { \
|
||||
.name = "aud_"#_name, \
|
||||
.ops = &meson_clk_triphase_ops, \
|
||||
- .parent_names = (const char *[]) { _pname }, \
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &_phws.hw }, \
|
||||
.num_parents = 1, \
|
||||
.flags = CLK_DUTY_CYCLE_PARENT | (_iflags), \
|
||||
}, \
|
||||
@@ -255,7 +272,7 @@ struct clk_regmap aud_##_name = { \
|
||||
|
||||
#define AUD_MST_SCLK(_name, _reg) \
|
||||
AUD_TRIPHASE(mst_##_name##_sclk, _reg, 1, 0, 2, 4, \
|
||||
- "aud_mst_"#_name"_sclk_post_en", CLK_SET_RATE_PARENT)
|
||||
+ aud_mst_##_name##_sclk_post_en, CLK_SET_RATE_PARENT)
|
||||
|
||||
static AUD_MST_SCLK(a, AUDIO_MST_A_SCLK_CTRL1);
|
||||
static AUD_MST_SCLK(b, AUDIO_MST_B_SCLK_CTRL1);
|
||||
@@ -266,7 +283,7 @@ static AUD_MST_SCLK(f, AUDIO_MST_F_SCLK_CTRL1);
|
||||
|
||||
#define AUD_MST_LRCLK_DIV(_name, _reg) \
|
||||
AUD_SCLK_DIV(mst_##_name##_lrclk_div, _reg, 0, 10, 10, 10, \
|
||||
- "aud_mst_"#_name"_sclk_post_en", 0) \
|
||||
+ aud_mst_##_name##_sclk_post_en, 0) \
|
||||
|
||||
static AUD_MST_LRCLK_DIV(a, AUDIO_MST_A_SCLK_CTRL0);
|
||||
static AUD_MST_LRCLK_DIV(b, AUDIO_MST_B_SCLK_CTRL0);
|
||||
@@ -277,7 +294,7 @@ static AUD_MST_LRCLK_DIV(f, AUDIO_MST_F_SCLK_CTRL0);
|
||||
|
||||
#define AUD_MST_LRCLK(_name, _reg) \
|
||||
AUD_TRIPHASE(mst_##_name##_lrclk, _reg, 1, 1, 3, 5, \
|
||||
- "aud_mst_"#_name"_lrclk_div", CLK_SET_RATE_PARENT)
|
||||
+ aud_mst_##_name##_lrclk_div, CLK_SET_RATE_PARENT)
|
||||
|
||||
static AUD_MST_LRCLK(a, AUDIO_MST_A_SCLK_CTRL1);
|
||||
static AUD_MST_LRCLK(b, AUDIO_MST_B_SCLK_CTRL1);
|
||||
@@ -286,19 +303,29 @@ static AUD_MST_LRCLK(d, AUDIO_MST_D_SCLK_CTRL1);
|
||||
static AUD_MST_LRCLK(e, AUDIO_MST_E_SCLK_CTRL1);
|
||||
static AUD_MST_LRCLK(f, AUDIO_MST_F_SCLK_CTRL1);
|
||||
|
||||
-static const char * const tdm_sclk_parent_names[] = {
|
||||
- "aud_mst_a_sclk", "aud_mst_b_sclk", "aud_mst_c_sclk",
|
||||
- "aud_mst_d_sclk", "aud_mst_e_sclk", "aud_mst_f_sclk",
|
||||
- "aud_slv_sclk0", "aud_slv_sclk1", "aud_slv_sclk2",
|
||||
- "aud_slv_sclk3", "aud_slv_sclk4", "aud_slv_sclk5",
|
||||
- "aud_slv_sclk6", "aud_slv_sclk7", "aud_slv_sclk8",
|
||||
- "aud_slv_sclk9"
|
||||
+static const struct clk_parent_data tdm_sclk_parent_data[] = {
|
||||
+ { .hw = &aud_mst_a_sclk.hw, },
|
||||
+ { .hw = &aud_mst_b_sclk.hw, },
|
||||
+ { .hw = &aud_mst_c_sclk.hw, },
|
||||
+ { .hw = &aud_mst_d_sclk.hw, },
|
||||
+ { .hw = &aud_mst_e_sclk.hw, },
|
||||
+ { .hw = &aud_mst_f_sclk.hw, },
|
||||
+ { .fw_name = "slv_sclk0", },
|
||||
+ { .fw_name = "slv_sclk1", },
|
||||
+ { .fw_name = "slv_sclk2", },
|
||||
+ { .fw_name = "slv_sclk3", },
|
||||
+ { .fw_name = "slv_sclk4", },
|
||||
+ { .fw_name = "slv_sclk5", },
|
||||
+ { .fw_name = "slv_sclk6", },
|
||||
+ { .fw_name = "slv_sclk7", },
|
||||
+ { .fw_name = "slv_sclk8", },
|
||||
+ { .fw_name = "slv_sclk9", },
|
||||
};
|
||||
|
||||
#define AUD_TDM_SCLK_MUX(_name, _reg) \
|
||||
AUD_MUX(tdm##_name##_sclk_sel, _reg, 0xf, 24, \
|
||||
CLK_MUX_ROUND_CLOSEST, \
|
||||
- tdm_sclk_parent_names, 0)
|
||||
+ tdm_sclk_parent_data, 0)
|
||||
|
||||
static AUD_TDM_SCLK_MUX(in_a, AUDIO_CLK_TDMIN_A_CTRL);
|
||||
static AUD_TDM_SCLK_MUX(in_b, AUDIO_CLK_TDMIN_B_CTRL);
|
||||
@@ -310,7 +337,7 @@ static AUD_TDM_SCLK_MUX(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
|
||||
|
||||
#define AUD_TDM_SCLK_PRE_EN(_name, _reg) \
|
||||
AUD_GATE(tdm##_name##_sclk_pre_en, _reg, 31, \
|
||||
- "aud_tdm"#_name"_sclk_sel", CLK_SET_RATE_PARENT)
|
||||
+ aud_tdm##_name##_sclk_sel, CLK_SET_RATE_PARENT)
|
||||
|
||||
static AUD_TDM_SCLK_PRE_EN(in_a, AUDIO_CLK_TDMIN_A_CTRL);
|
||||
static AUD_TDM_SCLK_PRE_EN(in_b, AUDIO_CLK_TDMIN_B_CTRL);
|
||||
@@ -322,7 +349,7 @@ static AUD_TDM_SCLK_PRE_EN(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
|
||||
|
||||
#define AUD_TDM_SCLK_POST_EN(_name, _reg) \
|
||||
AUD_GATE(tdm##_name##_sclk_post_en, _reg, 30, \
|
||||
- "aud_tdm"#_name"_sclk_pre_en", CLK_SET_RATE_PARENT)
|
||||
+ aud_tdm##_name##_sclk_pre_en, CLK_SET_RATE_PARENT)
|
||||
|
||||
static AUD_TDM_SCLK_POST_EN(in_a, AUDIO_CLK_TDMIN_A_CTRL);
|
||||
static AUD_TDM_SCLK_POST_EN(in_b, AUDIO_CLK_TDMIN_B_CTRL);
|
||||
@@ -344,8 +371,9 @@ static AUD_TDM_SCLK_POST_EN(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
|
||||
.hw.init = &(struct clk_init_data) { \
|
||||
.name = "aud_tdm"#_name"_sclk", \
|
||||
.ops = &meson_clk_phase_ops, \
|
||||
- .parent_names = (const char *[]) \
|
||||
- { "aud_tdm"#_name"_sclk_post_en" }, \
|
||||
+ .parent_hws = (const struct clk_hw *[]) { \
|
||||
+ &aud_tdm##_name##_sclk_post_en.hw \
|
||||
+ }, \
|
||||
.num_parents = 1, \
|
||||
.flags = CLK_DUTY_CYCLE_PARENT | CLK_SET_RATE_PARENT, \
|
||||
}, \
|
||||
@@ -359,19 +387,29 @@ static AUD_TDM_SCLK(out_a, AUDIO_CLK_TDMOUT_A_CTRL);
|
||||
static AUD_TDM_SCLK(out_b, AUDIO_CLK_TDMOUT_B_CTRL);
|
||||
static AUD_TDM_SCLK(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
|
||||
|
||||
-static const char * const tdm_lrclk_parent_names[] = {
|
||||
- "aud_mst_a_lrclk", "aud_mst_b_lrclk", "aud_mst_c_lrclk",
|
||||
- "aud_mst_d_lrclk", "aud_mst_e_lrclk", "aud_mst_f_lrclk",
|
||||
- "aud_slv_lrclk0", "aud_slv_lrclk1", "aud_slv_lrclk2",
|
||||
- "aud_slv_lrclk3", "aud_slv_lrclk4", "aud_slv_lrclk5",
|
||||
- "aud_slv_lrclk6", "aud_slv_lrclk7", "aud_slv_lrclk8",
|
||||
- "aud_slv_lrclk9"
|
||||
+static const struct clk_parent_data tdm_lrclk_parent_data[] = {
|
||||
+ { .hw = &aud_mst_a_lrclk.hw, },
|
||||
+ { .hw = &aud_mst_b_lrclk.hw, },
|
||||
+ { .hw = &aud_mst_c_lrclk.hw, },
|
||||
+ { .hw = &aud_mst_d_lrclk.hw, },
|
||||
+ { .hw = &aud_mst_e_lrclk.hw, },
|
||||
+ { .hw = &aud_mst_f_lrclk.hw, },
|
||||
+ { .fw_name = "slv_lrclk0", },
|
||||
+ { .fw_name = "slv_lrclk1", },
|
||||
+ { .fw_name = "slv_lrclk2", },
|
||||
+ { .fw_name = "slv_lrclk3", },
|
||||
+ { .fw_name = "slv_lrclk4", },
|
||||
+ { .fw_name = "slv_lrclk5", },
|
||||
+ { .fw_name = "slv_lrclk6", },
|
||||
+ { .fw_name = "slv_lrclk7", },
|
||||
+ { .fw_name = "slv_lrclk8", },
|
||||
+ { .fw_name = "slv_lrclk9", },
|
||||
};
|
||||
|
||||
-#define AUD_TDM_LRLCK(_name, _reg) \
|
||||
- AUD_MUX(tdm##_name##_lrclk, _reg, 0xf, 20, \
|
||||
- CLK_MUX_ROUND_CLOSEST, \
|
||||
- tdm_lrclk_parent_names, 0)
|
||||
+#define AUD_TDM_LRLCK(_name, _reg) \
|
||||
+ AUD_MUX(tdm##_name##_lrclk, _reg, 0xf, 20, \
|
||||
+ CLK_MUX_ROUND_CLOSEST, \
|
||||
+ tdm_lrclk_parent_data, 0)
|
||||
|
||||
static AUD_TDM_LRLCK(in_a, AUDIO_CLK_TDMIN_A_CTRL);
|
||||
static AUD_TDM_LRLCK(in_b, AUDIO_CLK_TDMIN_B_CTRL);
|
||||
@@ -386,39 +424,51 @@ static AUD_TDM_LRLCK(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
|
||||
AUD_MUX(tdm_##_name, _reg, 0x7, _shift, 0, _parents, \
|
||||
CLK_SET_RATE_NO_REPARENT)
|
||||
|
||||
-static const char * const mclk_pad_ctrl_parent_names[] = {
|
||||
- "aud_mst_a_mclk", "aud_mst_b_mclk", "aud_mst_c_mclk",
|
||||
- "aud_mst_d_mclk", "aud_mst_e_mclk", "aud_mst_f_mclk",
|
||||
+static const struct clk_parent_data mclk_pad_ctrl_parent_data[] = {
|
||||
+ { .hw = &aud_mst_a_mclk.hw },
|
||||
+ { .hw = &aud_mst_b_mclk.hw },
|
||||
+ { .hw = &aud_mst_c_mclk.hw },
|
||||
+ { .hw = &aud_mst_d_mclk.hw },
|
||||
+ { .hw = &aud_mst_e_mclk.hw },
|
||||
+ { .hw = &aud_mst_f_mclk.hw },
|
||||
};
|
||||
|
||||
static AUD_TDM_PAD_CTRL(mclk_pad_0, AUDIO_MST_PAD_CTRL0, 0,
|
||||
- mclk_pad_ctrl_parent_names);
|
||||
+ mclk_pad_ctrl_parent_data);
|
||||
static AUD_TDM_PAD_CTRL(mclk_pad_1, AUDIO_MST_PAD_CTRL0, 4,
|
||||
- mclk_pad_ctrl_parent_names);
|
||||
-
|
||||
-static const char * const lrclk_pad_ctrl_parent_names[] = {
|
||||
- "aud_mst_a_lrclk", "aud_mst_b_lrclk", "aud_mst_c_lrclk",
|
||||
- "aud_mst_d_lrclk", "aud_mst_e_lrclk", "aud_mst_f_lrclk",
|
||||
+ mclk_pad_ctrl_parent_data);
|
||||
+
|
||||
+static const struct clk_parent_data lrclk_pad_ctrl_parent_data[] = {
|
||||
+ { .hw = &aud_mst_a_lrclk.hw },
|
||||
+ { .hw = &aud_mst_b_lrclk.hw },
|
||||
+ { .hw = &aud_mst_c_lrclk.hw },
|
||||
+ { .hw = &aud_mst_d_lrclk.hw },
|
||||
+ { .hw = &aud_mst_e_lrclk.hw },
|
||||
+ { .hw = &aud_mst_f_lrclk.hw },
|
||||
};
|
||||
|
||||
static AUD_TDM_PAD_CTRL(lrclk_pad_0, AUDIO_MST_PAD_CTRL1, 16,
|
||||
- lrclk_pad_ctrl_parent_names);
|
||||
+ lrclk_pad_ctrl_parent_data);
|
||||
static AUD_TDM_PAD_CTRL(lrclk_pad_1, AUDIO_MST_PAD_CTRL1, 20,
|
||||
- lrclk_pad_ctrl_parent_names);
|
||||
+ lrclk_pad_ctrl_parent_data);
|
||||
static AUD_TDM_PAD_CTRL(lrclk_pad_2, AUDIO_MST_PAD_CTRL1, 24,
|
||||
- lrclk_pad_ctrl_parent_names);
|
||||
-
|
||||
-static const char * const sclk_pad_ctrl_parent_names[] = {
|
||||
- "aud_mst_a_sclk", "aud_mst_b_sclk", "aud_mst_c_sclk",
|
||||
- "aud_mst_d_sclk", "aud_mst_e_sclk", "aud_mst_f_sclk",
|
||||
+ lrclk_pad_ctrl_parent_data);
|
||||
+
|
||||
+static const struct clk_parent_data sclk_pad_ctrl_parent_data[] = {
|
||||
+ { .hw = &aud_mst_a_sclk.hw },
|
||||
+ { .hw = &aud_mst_b_sclk.hw },
|
||||
+ { .hw = &aud_mst_c_sclk.hw },
|
||||
+ { .hw = &aud_mst_d_sclk.hw },
|
||||
+ { .hw = &aud_mst_e_sclk.hw },
|
||||
+ { .hw = &aud_mst_f_sclk.hw },
|
||||
};
|
||||
|
||||
static AUD_TDM_PAD_CTRL(sclk_pad_0, AUDIO_MST_PAD_CTRL1, 0,
|
||||
- sclk_pad_ctrl_parent_names);
|
||||
+ sclk_pad_ctrl_parent_data);
|
||||
static AUD_TDM_PAD_CTRL(sclk_pad_1, AUDIO_MST_PAD_CTRL1, 4,
|
||||
- sclk_pad_ctrl_parent_names);
|
||||
+ sclk_pad_ctrl_parent_data);
|
||||
static AUD_TDM_PAD_CTRL(sclk_pad_2, AUDIO_MST_PAD_CTRL1, 8,
|
||||
- sclk_pad_ctrl_parent_names);
|
||||
+ sclk_pad_ctrl_parent_data);
|
||||
|
||||
/*
|
||||
* Array of all clocks provided by this provider
|
||||
@@ -868,54 +918,6 @@ static int devm_clk_get_enable(struct device *dev, char *id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int axg_register_clk_hw_input(struct device *dev,
|
||||
- const char *name)
|
||||
-{
|
||||
- char *clk_name;
|
||||
- struct clk_hw *hw;
|
||||
- int err = 0;
|
||||
-
|
||||
- clk_name = kasprintf(GFP_KERNEL, "aud_%s", name);
|
||||
- if (!clk_name)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- hw = meson_clk_hw_register_input(dev, name, clk_name, 0);
|
||||
- if (IS_ERR(hw)) {
|
||||
- /* It is ok if an input clock is missing */
|
||||
- if (PTR_ERR(hw) == -ENOENT) {
|
||||
- dev_dbg(dev, "%s not provided", name);
|
||||
- } else {
|
||||
- err = PTR_ERR(hw);
|
||||
- if (err != -EPROBE_DEFER)
|
||||
- dev_err(dev, "failed to get %s clock", name);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- kfree(clk_name);
|
||||
- return err;
|
||||
-}
|
||||
-
|
||||
-static int axg_register_clk_hw_inputs(struct device *dev,
|
||||
- const char *basename,
|
||||
- unsigned int count)
|
||||
-{
|
||||
- char *name;
|
||||
- int i, ret;
|
||||
-
|
||||
- for (i = 0; i < count; i++) {
|
||||
- name = kasprintf(GFP_KERNEL, "%s%d", basename, i);
|
||||
- if (!name)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- ret = axg_register_clk_hw_input(dev, name);
|
||||
- kfree(name);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
static const struct regmap_config axg_audio_regmap_cfg = {
|
||||
.reg_bits = 32,
|
||||
.val_bits = 32,
|
||||
@@ -963,29 +965,6 @@ static int axg_audio_clkc_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- /* Register the peripheral input clock */
|
||||
- hw = meson_clk_hw_register_input(dev, "pclk", "audio_pclk", 0);
|
||||
- if (IS_ERR(hw))
|
||||
- return PTR_ERR(hw);
|
||||
-
|
||||
- /* Register optional input master clocks */
|
||||
- ret = axg_register_clk_hw_inputs(dev, "mst_in",
|
||||
- AUD_MST_IN_COUNT);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- /* Register optional input slave sclks */
|
||||
- ret = axg_register_clk_hw_inputs(dev, "slv_sclk",
|
||||
- AUD_SLV_SCLK_COUNT);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- /* Register optional input slave lrclks */
|
||||
- ret = axg_register_clk_hw_inputs(dev, "slv_lrclk",
|
||||
- AUD_SLV_LRCLK_COUNT);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
/* Populate regmap for the regmap backed clocks */
|
||||
for (i = 0; i < ARRAY_SIZE(aud_clk_regmaps); i++)
|
||||
aud_clk_regmaps[i]->map = map;
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,81 @@
|
||||
From afbc6ad4851f6df5e6e0befa8d3fe8d664e688e7 Mon Sep 17 00:00:00 2001
|
||||
From: Qiang Yu <yuq825@gmail.com>
|
||||
Date: Thu, 16 Jan 2020 21:11:54 +0800
|
||||
Subject: [PATCH 003/146] FROMGIT: drm/lima: add lima_vm_map_bo
|
||||
|
||||
For dynamically mapping added backup memory of lima_bo to vm.
|
||||
This is a preparation for adding heap buffer support.
|
||||
|
||||
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||
Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
|
||||
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20200116131157.13346-3-yuq825@gmail.com
|
||||
---
|
||||
drivers/gpu/drm/lima/lima_vm.c | 42 ++++++++++++++++++++++++++++++++++
|
||||
drivers/gpu/drm/lima/lima_vm.h | 1 +
|
||||
2 files changed, 43 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/lima/lima_vm.c b/drivers/gpu/drm/lima/lima_vm.c
|
||||
index 840e2350d872..2e513841de6c 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_vm.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_vm.c
|
||||
@@ -277,3 +277,45 @@ void lima_vm_print(struct lima_vm *vm)
|
||||
}
|
||||
}
|
||||
}
|
||||
+
|
||||
+int lima_vm_map_bo(struct lima_vm *vm, struct lima_bo *bo, int pageoff)
|
||||
+{
|
||||
+ struct lima_bo_va *bo_va;
|
||||
+ struct sg_dma_page_iter sg_iter;
|
||||
+ int offset = 0, err;
|
||||
+ u32 base;
|
||||
+
|
||||
+ mutex_lock(&bo->lock);
|
||||
+
|
||||
+ bo_va = lima_vm_bo_find(vm, bo);
|
||||
+ if (!bo_va) {
|
||||
+ err = -ENOENT;
|
||||
+ goto err_out0;
|
||||
+ }
|
||||
+
|
||||
+ mutex_lock(&vm->lock);
|
||||
+
|
||||
+ base = bo_va->node.start + (pageoff << PAGE_SHIFT);
|
||||
+ for_each_sg_dma_page(bo->base.sgt->sgl, &sg_iter,
|
||||
+ bo->base.sgt->nents, pageoff) {
|
||||
+ err = lima_vm_map_page(vm, sg_page_iter_dma_address(&sg_iter),
|
||||
+ base + offset);
|
||||
+ if (err)
|
||||
+ goto err_out1;
|
||||
+
|
||||
+ offset += PAGE_SIZE;
|
||||
+ }
|
||||
+
|
||||
+ mutex_unlock(&vm->lock);
|
||||
+
|
||||
+ mutex_unlock(&bo->lock);
|
||||
+ return 0;
|
||||
+
|
||||
+err_out1:
|
||||
+ if (offset)
|
||||
+ lima_vm_unmap_range(vm, base, base + offset - 1);
|
||||
+ mutex_unlock(&vm->lock);
|
||||
+err_out0:
|
||||
+ mutex_unlock(&bo->lock);
|
||||
+ return err;
|
||||
+}
|
||||
diff --git a/drivers/gpu/drm/lima/lima_vm.h b/drivers/gpu/drm/lima/lima_vm.h
|
||||
index e0bdedcf14dd..22aeec77d84d 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_vm.h
|
||||
+++ b/drivers/gpu/drm/lima/lima_vm.h
|
||||
@@ -58,5 +58,6 @@ static inline void lima_vm_put(struct lima_vm *vm)
|
||||
}
|
||||
|
||||
void lima_vm_print(struct lima_vm *vm);
|
||||
+int lima_vm_map_bo(struct lima_vm *vm, struct lima_bo *bo, int pageoff);
|
||||
|
||||
#endif
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,240 +0,0 @@
|
||||
From e33fbafaf171bc40295804d9e1d55056be910618 Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Date: Thu, 25 Jul 2019 18:41:23 +0200
|
||||
Subject: [PATCH 004/187] FROMGIT: clk: meson: g12a-aoclk: migrate to the new
|
||||
parent description method
|
||||
|
||||
This clock controller use the string comparison method to describe parent
|
||||
relation between the clocks, which is not optimized.
|
||||
|
||||
Migrate to the new way by using .parent_hws where possible (when parent
|
||||
clocks are localy declared in the controller) and use .parent_data
|
||||
otherwise.
|
||||
|
||||
Remove clk input helper and all bypass clocks (declared in probe function)
|
||||
which are no longer used since we are able to use device-tree clock name
|
||||
directly.
|
||||
|
||||
Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit ba626081107dceacff554e5ca2efc7cea7326b6e
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/g12a-aoclk.c | 81 +++++++++++++++++++++-------------
|
||||
1 file changed, 50 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/g12a-aoclk.c b/drivers/clk/meson/g12a-aoclk.c
|
||||
index 1994e735396b..62499563e4f5 100644
|
||||
--- a/drivers/clk/meson/g12a-aoclk.c
|
||||
+++ b/drivers/clk/meson/g12a-aoclk.c
|
||||
@@ -18,8 +18,6 @@
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-dualdiv.h"
|
||||
|
||||
-#define IN_PREFIX "ao-in-"
|
||||
-
|
||||
/*
|
||||
* AO Configuration Clock registers offsets
|
||||
* Register offsets from the data sheet must be multiplied by 4.
|
||||
@@ -51,7 +49,9 @@ static struct clk_regmap g12a_aoclk_##_name = { \
|
||||
.hw.init = &(struct clk_init_data) { \
|
||||
.name = "g12a_ao_" #_name, \
|
||||
.ops = &clk_regmap_gate_ops, \
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "mpeg-clk" }, \
|
||||
+ .parent_data = &(const struct clk_parent_data) { \
|
||||
+ .fw_name = "mpeg-clk", \
|
||||
+ }, \
|
||||
.num_parents = 1, \
|
||||
.flags = CLK_IGNORE_UNUSED, \
|
||||
}, \
|
||||
@@ -81,7 +81,9 @@ static struct clk_regmap g12a_aoclk_cts_oscin = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cts_oscin",
|
||||
.ops = &clk_regmap_gate_ro_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "xtal" },
|
||||
+ .parent_data = &(const struct clk_parent_data) {
|
||||
+ .fw_name = "xtal",
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -106,7 +108,9 @@ static struct clk_regmap g12a_aoclk_32k_by_oscin_pre = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_32k_by_oscin_pre",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "cts_oscin" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &g12a_aoclk_cts_oscin.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -143,7 +147,9 @@ static struct clk_regmap g12a_aoclk_32k_by_oscin_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_32k_by_oscin_div",
|
||||
.ops = &meson_clk_dualdiv_ops,
|
||||
- .parent_names = (const char *[]){ "g12a_ao_32k_by_oscin_pre" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &g12a_aoclk_32k_by_oscin_pre.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -158,8 +164,10 @@ static struct clk_regmap g12a_aoclk_32k_by_oscin_sel = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_32k_by_oscin_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = (const char *[]){ "g12a_ao_32k_by_oscin_div",
|
||||
- "g12a_ao_32k_by_oscin_pre" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &g12a_aoclk_32k_by_oscin_div.hw,
|
||||
+ &g12a_aoclk_32k_by_oscin_pre.hw,
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -173,7 +181,9 @@ static struct clk_regmap g12a_aoclk_32k_by_oscin = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_32k_by_oscin",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "g12a_ao_32k_by_oscin_sel" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &g12a_aoclk_32k_by_oscin_sel.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -189,7 +199,9 @@ static struct clk_regmap g12a_aoclk_cec_pre = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_cec_pre",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "cts_oscin" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &g12a_aoclk_cts_oscin.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -226,7 +238,9 @@ static struct clk_regmap g12a_aoclk_cec_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_cec_div",
|
||||
.ops = &meson_clk_dualdiv_ops,
|
||||
- .parent_names = (const char *[]){ "g12a_ao_cec_pre" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &g12a_aoclk_cec_pre.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -241,8 +255,10 @@ static struct clk_regmap g12a_aoclk_cec_sel = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_cec_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = (const char *[]){ "g12a_ao_cec_div",
|
||||
- "g12a_ao_cec_pre" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &g12a_aoclk_cec_div.hw,
|
||||
+ &g12a_aoclk_cec_pre.hw,
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -256,7 +272,9 @@ static struct clk_regmap g12a_aoclk_cec = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_cec",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "g12a_ao_cec_sel" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &g12a_aoclk_cec_sel.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -272,8 +290,10 @@ static struct clk_regmap g12a_aoclk_cts_rtc_oscin = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_cts_rtc_oscin",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = (const char *[]){ "g12a_ao_32k_by_oscin",
|
||||
- IN_PREFIX "ext_32k-0" },
|
||||
+ .parent_data = (const struct clk_parent_data []) {
|
||||
+ { .hw = &g12a_aoclk_32k_by_oscin.hw },
|
||||
+ { .fw_name = "ext-32k-0", },
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -289,8 +309,10 @@ static struct clk_regmap g12a_aoclk_clk81 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_clk81",
|
||||
.ops = &clk_regmap_mux_ro_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "mpeg-clk",
|
||||
- "g12a_ao_cts_rtc_oscin"},
|
||||
+ .parent_data = (const struct clk_parent_data []) {
|
||||
+ { .fw_name = "mpeg-clk", },
|
||||
+ { .hw = &g12a_aoclk_cts_rtc_oscin.hw },
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -305,8 +327,10 @@ static struct clk_regmap g12a_aoclk_saradc_mux = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_saradc_mux",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "xtal",
|
||||
- "g12a_ao_clk81" },
|
||||
+ .parent_data = (const struct clk_parent_data []) {
|
||||
+ { .fw_name = "xtal", },
|
||||
+ { .hw = &g12a_aoclk_clk81.hw },
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
},
|
||||
};
|
||||
@@ -320,7 +344,9 @@ static struct clk_regmap g12a_aoclk_saradc_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_saradc_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
- .parent_names = (const char *[]){ "g12a_ao_saradc_mux" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &g12a_aoclk_saradc_mux.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -334,7 +360,9 @@ static struct clk_regmap g12a_aoclk_saradc_gate = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "g12a_ao_saradc_gate",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "g12a_ao_saradc_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &g12a_aoclk_saradc_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -417,12 +445,6 @@ static const struct clk_hw_onecell_data g12a_aoclk_onecell_data = {
|
||||
.num = NR_CLKS,
|
||||
};
|
||||
|
||||
-static const struct meson_aoclk_input g12a_aoclk_inputs[] = {
|
||||
- { .name = "xtal", .required = true },
|
||||
- { .name = "mpeg-clk", .required = true },
|
||||
- { .name = "ext-32k-0", .required = false },
|
||||
-};
|
||||
-
|
||||
static const struct meson_aoclk_data g12a_aoclkc_data = {
|
||||
.reset_reg = AO_RTI_GEN_CNTL_REG0,
|
||||
.num_reset = ARRAY_SIZE(g12a_aoclk_reset),
|
||||
@@ -430,9 +452,6 @@ static const struct meson_aoclk_data g12a_aoclkc_data = {
|
||||
.num_clks = ARRAY_SIZE(g12a_aoclk_regmap),
|
||||
.clks = g12a_aoclk_regmap,
|
||||
.hw_data = &g12a_aoclk_onecell_data,
|
||||
- .inputs = g12a_aoclk_inputs,
|
||||
- .num_inputs = ARRAY_SIZE(g12a_aoclk_inputs),
|
||||
- .input_prefix = IN_PREFIX,
|
||||
};
|
||||
|
||||
static const struct of_device_id g12a_aoclkc_match_table[] = {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,327 @@
|
||||
From e2058aea7a06fbc3cf41e49173b973ff620d33e2 Mon Sep 17 00:00:00 2001
|
||||
From: Qiang Yu <yuq825@gmail.com>
|
||||
Date: Thu, 16 Jan 2020 21:11:55 +0800
|
||||
Subject: [PATCH 004/146] FROMGIT: drm/lima: support heap buffer creation
|
||||
|
||||
heap buffer is used as output of GP and input of PP for
|
||||
Mali Utgard GPU. Size of heap buffer depends on the task
|
||||
so is a runtime variable.
|
||||
|
||||
Previously we just create a large enough buffer as heap
|
||||
buffer. Now we add a heap buffer type to be able to
|
||||
increase the backup memory dynamically when GP fail due
|
||||
to lack of heap memory.
|
||||
|
||||
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||
Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
|
||||
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20200116131157.13346-4-yuq825@gmail.com
|
||||
---
|
||||
drivers/gpu/drm/lima/lima_drv.c | 6 +-
|
||||
drivers/gpu/drm/lima/lima_drv.h | 1 +
|
||||
drivers/gpu/drm/lima/lima_gem.c | 134 ++++++++++++++++++++++++++++++--
|
||||
drivers/gpu/drm/lima/lima_gem.h | 4 +
|
||||
drivers/gpu/drm/lima/lima_vm.c | 4 +-
|
||||
include/uapi/drm/lima_drm.h | 9 ++-
|
||||
6 files changed, 147 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c
|
||||
index 124efe4fa97b..18f88aaef1a2 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_drv.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_drv.c
|
||||
@@ -15,10 +15,14 @@
|
||||
#include "lima_vm.h"
|
||||
|
||||
int lima_sched_timeout_ms;
|
||||
+uint lima_heap_init_nr_pages = 8;
|
||||
|
||||
MODULE_PARM_DESC(sched_timeout_ms, "task run timeout in ms");
|
||||
module_param_named(sched_timeout_ms, lima_sched_timeout_ms, int, 0444);
|
||||
|
||||
+MODULE_PARM_DESC(heap_init_nr_pages, "heap buffer init number of pages");
|
||||
+module_param_named(heap_init_nr_pages, lima_heap_init_nr_pages, uint, 0444);
|
||||
+
|
||||
static int lima_ioctl_get_param(struct drm_device *dev, void *data, struct drm_file *file)
|
||||
{
|
||||
struct drm_lima_get_param *args = data;
|
||||
@@ -68,7 +72,7 @@ static int lima_ioctl_gem_create(struct drm_device *dev, void *data, struct drm_
|
||||
if (args->pad)
|
||||
return -EINVAL;
|
||||
|
||||
- if (args->flags)
|
||||
+ if (args->flags & ~(LIMA_BO_FLAG_HEAP))
|
||||
return -EINVAL;
|
||||
|
||||
if (args->size == 0)
|
||||
diff --git a/drivers/gpu/drm/lima/lima_drv.h b/drivers/gpu/drm/lima/lima_drv.h
|
||||
index 69c7344715c9..f492ecc6a5d9 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_drv.h
|
||||
+++ b/drivers/gpu/drm/lima/lima_drv.h
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "lima_ctx.h"
|
||||
|
||||
extern int lima_sched_timeout_ms;
|
||||
+extern uint lima_heap_init_nr_pages;
|
||||
|
||||
struct lima_vm;
|
||||
struct lima_bo;
|
||||
diff --git a/drivers/gpu/drm/lima/lima_gem.c b/drivers/gpu/drm/lima/lima_gem.c
|
||||
index d0059d8c97d8..5404e0d668db 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_gem.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_gem.c
|
||||
@@ -4,6 +4,8 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sync_file.h>
|
||||
#include <linux/pagemap.h>
|
||||
+#include <linux/shmem_fs.h>
|
||||
+#include <linux/dma-mapping.h>
|
||||
|
||||
#include <drm/drm_file.h>
|
||||
#include <drm/drm_syncobj.h>
|
||||
@@ -15,6 +17,83 @@
|
||||
#include "lima_gem.h"
|
||||
#include "lima_vm.h"
|
||||
|
||||
+int lima_heap_alloc(struct lima_bo *bo, struct lima_vm *vm)
|
||||
+{
|
||||
+ struct page **pages;
|
||||
+ struct address_space *mapping = bo->base.base.filp->f_mapping;
|
||||
+ struct device *dev = bo->base.base.dev->dev;
|
||||
+ size_t old_size = bo->heap_size;
|
||||
+ size_t new_size = bo->heap_size ? bo->heap_size * 2 :
|
||||
+ (lima_heap_init_nr_pages << PAGE_SHIFT);
|
||||
+ struct sg_table sgt;
|
||||
+ int i, ret;
|
||||
+
|
||||
+ if (bo->heap_size >= bo->base.base.size)
|
||||
+ return -ENOSPC;
|
||||
+
|
||||
+ new_size = min(new_size, bo->base.base.size);
|
||||
+
|
||||
+ mutex_lock(&bo->base.pages_lock);
|
||||
+
|
||||
+ if (bo->base.pages) {
|
||||
+ pages = bo->base.pages;
|
||||
+ } else {
|
||||
+ pages = kvmalloc_array(bo->base.base.size >> PAGE_SHIFT,
|
||||
+ sizeof(*pages), GFP_KERNEL | __GFP_ZERO);
|
||||
+ if (!pages) {
|
||||
+ mutex_unlock(&bo->base.pages_lock);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ bo->base.pages = pages;
|
||||
+ bo->base.pages_use_count = 1;
|
||||
+
|
||||
+ mapping_set_unevictable(mapping);
|
||||
+ }
|
||||
+
|
||||
+ for (i = old_size >> PAGE_SHIFT; i < new_size >> PAGE_SHIFT; i++) {
|
||||
+ struct page *page = shmem_read_mapping_page(mapping, i);
|
||||
+
|
||||
+ if (IS_ERR(page)) {
|
||||
+ mutex_unlock(&bo->base.pages_lock);
|
||||
+ return PTR_ERR(page);
|
||||
+ }
|
||||
+ pages[i] = page;
|
||||
+ }
|
||||
+
|
||||
+ mutex_unlock(&bo->base.pages_lock);
|
||||
+
|
||||
+ ret = sg_alloc_table_from_pages(&sgt, pages, i, 0,
|
||||
+ new_size, GFP_KERNEL);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (bo->base.sgt) {
|
||||
+ dma_unmap_sg(dev, bo->base.sgt->sgl,
|
||||
+ bo->base.sgt->nents, DMA_BIDIRECTIONAL);
|
||||
+ sg_free_table(bo->base.sgt);
|
||||
+ } else {
|
||||
+ bo->base.sgt = kmalloc(sizeof(*bo->base.sgt), GFP_KERNEL);
|
||||
+ if (!bo->base.sgt) {
|
||||
+ sg_free_table(&sgt);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ dma_map_sg(dev, sgt.sgl, sgt.nents, DMA_BIDIRECTIONAL);
|
||||
+
|
||||
+ *bo->base.sgt = sgt;
|
||||
+
|
||||
+ if (vm) {
|
||||
+ ret = lima_vm_map_bo(vm, bo, old_size >> PAGE_SHIFT);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ bo->heap_size = new_size;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int lima_gem_create_handle(struct drm_device *dev, struct drm_file *file,
|
||||
u32 size, u32 flags, u32 *handle)
|
||||
{
|
||||
@@ -22,7 +101,8 @@ int lima_gem_create_handle(struct drm_device *dev, struct drm_file *file,
|
||||
gfp_t mask;
|
||||
struct drm_gem_shmem_object *shmem;
|
||||
struct drm_gem_object *obj;
|
||||
- struct sg_table *sgt;
|
||||
+ struct lima_bo *bo;
|
||||
+ bool is_heap = flags & LIMA_BO_FLAG_HEAP;
|
||||
|
||||
shmem = drm_gem_shmem_create(dev, size);
|
||||
if (IS_ERR(shmem))
|
||||
@@ -36,10 +116,18 @@ int lima_gem_create_handle(struct drm_device *dev, struct drm_file *file,
|
||||
mask |= __GFP_DMA32;
|
||||
mapping_set_gfp_mask(obj->filp->f_mapping, mask);
|
||||
|
||||
- sgt = drm_gem_shmem_get_pages_sgt(obj);
|
||||
- if (IS_ERR(sgt)) {
|
||||
- err = PTR_ERR(sgt);
|
||||
- goto out;
|
||||
+ if (is_heap) {
|
||||
+ bo = to_lima_bo(obj);
|
||||
+ err = lima_heap_alloc(bo, NULL);
|
||||
+ if (err)
|
||||
+ goto out;
|
||||
+ } else {
|
||||
+ struct sg_table *sgt = drm_gem_shmem_get_pages_sgt(obj);
|
||||
+
|
||||
+ if (IS_ERR(sgt)) {
|
||||
+ err = PTR_ERR(sgt);
|
||||
+ goto out;
|
||||
+ }
|
||||
}
|
||||
|
||||
err = drm_gem_handle_create(file, obj, handle);
|
||||
@@ -79,17 +167,47 @@ static void lima_gem_object_close(struct drm_gem_object *obj, struct drm_file *f
|
||||
lima_vm_bo_del(vm, bo);
|
||||
}
|
||||
|
||||
+static int lima_gem_pin(struct drm_gem_object *obj)
|
||||
+{
|
||||
+ struct lima_bo *bo = to_lima_bo(obj);
|
||||
+
|
||||
+ if (bo->heap_size)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return drm_gem_shmem_pin(obj);
|
||||
+}
|
||||
+
|
||||
+static void *lima_gem_vmap(struct drm_gem_object *obj)
|
||||
+{
|
||||
+ struct lima_bo *bo = to_lima_bo(obj);
|
||||
+
|
||||
+ if (bo->heap_size)
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+
|
||||
+ return drm_gem_shmem_vmap(obj);
|
||||
+}
|
||||
+
|
||||
+static int lima_gem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
|
||||
+{
|
||||
+ struct lima_bo *bo = to_lima_bo(obj);
|
||||
+
|
||||
+ if (bo->heap_size)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return drm_gem_shmem_mmap(obj, vma);
|
||||
+}
|
||||
+
|
||||
static const struct drm_gem_object_funcs lima_gem_funcs = {
|
||||
.free = lima_gem_free_object,
|
||||
.open = lima_gem_object_open,
|
||||
.close = lima_gem_object_close,
|
||||
.print_info = drm_gem_shmem_print_info,
|
||||
- .pin = drm_gem_shmem_pin,
|
||||
+ .pin = lima_gem_pin,
|
||||
.unpin = drm_gem_shmem_unpin,
|
||||
.get_sg_table = drm_gem_shmem_get_sg_table,
|
||||
- .vmap = drm_gem_shmem_vmap,
|
||||
+ .vmap = lima_gem_vmap,
|
||||
.vunmap = drm_gem_shmem_vunmap,
|
||||
- .mmap = drm_gem_shmem_mmap,
|
||||
+ .mmap = lima_gem_mmap,
|
||||
};
|
||||
|
||||
struct drm_gem_object *lima_gem_create_object(struct drm_device *dev, size_t size)
|
||||
diff --git a/drivers/gpu/drm/lima/lima_gem.h b/drivers/gpu/drm/lima/lima_gem.h
|
||||
index 1800feb3e47f..ccea06142f4b 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_gem.h
|
||||
+++ b/drivers/gpu/drm/lima/lima_gem.h
|
||||
@@ -7,12 +7,15 @@
|
||||
#include <drm/drm_gem_shmem_helper.h>
|
||||
|
||||
struct lima_submit;
|
||||
+struct lima_vm;
|
||||
|
||||
struct lima_bo {
|
||||
struct drm_gem_shmem_object base;
|
||||
|
||||
struct mutex lock;
|
||||
struct list_head va;
|
||||
+
|
||||
+ size_t heap_size;
|
||||
};
|
||||
|
||||
static inline struct lima_bo *
|
||||
@@ -31,6 +34,7 @@ static inline struct dma_resv *lima_bo_resv(struct lima_bo *bo)
|
||||
return bo->base.base.resv;
|
||||
}
|
||||
|
||||
+int lima_heap_alloc(struct lima_bo *bo, struct lima_vm *vm);
|
||||
struct drm_gem_object *lima_gem_create_object(struct drm_device *dev, size_t size);
|
||||
int lima_gem_create_handle(struct drm_device *dev, struct drm_file *file,
|
||||
u32 size, u32 flags, u32 *handle);
|
||||
diff --git a/drivers/gpu/drm/lima/lima_vm.c b/drivers/gpu/drm/lima/lima_vm.c
|
||||
index 2e513841de6c..5b92fb82674a 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_vm.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_vm.c
|
||||
@@ -155,6 +155,7 @@ int lima_vm_bo_add(struct lima_vm *vm, struct lima_bo *bo, bool create)
|
||||
void lima_vm_bo_del(struct lima_vm *vm, struct lima_bo *bo)
|
||||
{
|
||||
struct lima_bo_va *bo_va;
|
||||
+ u32 size;
|
||||
|
||||
mutex_lock(&bo->lock);
|
||||
|
||||
@@ -166,8 +167,9 @@ void lima_vm_bo_del(struct lima_vm *vm, struct lima_bo *bo)
|
||||
|
||||
mutex_lock(&vm->lock);
|
||||
|
||||
+ size = bo->heap_size ? bo->heap_size : bo_va->node.size;
|
||||
lima_vm_unmap_range(vm, bo_va->node.start,
|
||||
- bo_va->node.start + bo_va->node.size - 1);
|
||||
+ bo_va->node.start + size - 1);
|
||||
|
||||
drm_mm_remove_node(&bo_va->node);
|
||||
|
||||
diff --git a/include/uapi/drm/lima_drm.h b/include/uapi/drm/lima_drm.h
|
||||
index 95a00fb867e6..1ec58d652a5a 100644
|
||||
--- a/include/uapi/drm/lima_drm.h
|
||||
+++ b/include/uapi/drm/lima_drm.h
|
||||
@@ -32,12 +32,19 @@ struct drm_lima_get_param {
|
||||
__u64 value; /* out, parameter value */
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * heap buffer dynamically increase backup memory size when GP task fail
|
||||
+ * due to lack of heap memory. size field of heap buffer is an up bound of
|
||||
+ * the backup memory which can be set to a fairly large value.
|
||||
+ */
|
||||
+#define LIMA_BO_FLAG_HEAP (1 << 0)
|
||||
+
|
||||
/**
|
||||
* create a buffer for used by GPU
|
||||
*/
|
||||
struct drm_lima_gem_create {
|
||||
__u32 size; /* in, buffer size */
|
||||
- __u32 flags; /* in, currently no flags, must be zero */
|
||||
+ __u32 flags; /* in, buffer flags */
|
||||
__u32 handle; /* out, GEM buffer handle */
|
||||
__u32 pad; /* pad, must be zero */
|
||||
};
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,172 +0,0 @@
|
||||
From 0e852bd3494390d165f8e79386a9eb9ef666db5b Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Date: Thu, 25 Jul 2019 18:41:24 +0200
|
||||
Subject: [PATCH 005/187] FROMGIT: clk: meson: gxbb-aoclk: migrate to the new
|
||||
parent description method
|
||||
|
||||
This clock controller use the string comparison method to describe parent
|
||||
relation between the clocks, which is not optimized.
|
||||
|
||||
Migrate to the new way by using .parent_hws where possible (when parent
|
||||
clocks are localy declared in the controller) and use .parent_data
|
||||
otherwise.
|
||||
|
||||
Remove clk input helper and all bypass clocks (declared in probe function)
|
||||
which are no longer used since we are able to use device-tree clock name
|
||||
directly.
|
||||
|
||||
Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit 6e2bfc352e7a3a9b22f13c36627545d5f4caf3e9
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/gxbb-aoclk.c | 55 +++++++++++++++++-----------------
|
||||
1 file changed, 27 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/gxbb-aoclk.c b/drivers/clk/meson/gxbb-aoclk.c
|
||||
index 449f6ac189d8..e940861a396b 100644
|
||||
--- a/drivers/clk/meson/gxbb-aoclk.c
|
||||
+++ b/drivers/clk/meson/gxbb-aoclk.c
|
||||
@@ -11,8 +11,6 @@
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-dualdiv.h"
|
||||
|
||||
-#define IN_PREFIX "ao-in-"
|
||||
-
|
||||
/* AO Configuration Clock registers offsets */
|
||||
#define AO_RTI_PWR_CNTL_REG1 0x0c
|
||||
#define AO_RTI_PWR_CNTL_REG0 0x10
|
||||
@@ -31,7 +29,9 @@ static struct clk_regmap _name##_ao = { \
|
||||
.hw.init = &(struct clk_init_data) { \
|
||||
.name = #_name "_ao", \
|
||||
.ops = &clk_regmap_gate_ops, \
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "mpeg-clk" }, \
|
||||
+ .parent_data = &(const struct clk_parent_data) { \
|
||||
+ .fw_name = "mpeg-clk", \
|
||||
+ }, \
|
||||
.num_parents = 1, \
|
||||
.flags = CLK_IGNORE_UNUSED, \
|
||||
}, \
|
||||
@@ -52,7 +52,9 @@ static struct clk_regmap ao_cts_oscin = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "ao_cts_oscin",
|
||||
.ops = &clk_regmap_gate_ro_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "xtal" },
|
||||
+ .parent_data = &(const struct clk_parent_data) {
|
||||
+ .fw_name = "xtal",
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -65,7 +67,7 @@ static struct clk_regmap ao_32k_pre = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "ao_32k_pre",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "ao_cts_oscin" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &ao_cts_oscin.hw },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -112,7 +114,7 @@ static struct clk_regmap ao_32k_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "ao_32k_div",
|
||||
.ops = &meson_clk_dualdiv_ops,
|
||||
- .parent_names = (const char *[]){ "ao_32k_pre" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &ao_32k_pre.hw },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -127,8 +129,10 @@ static struct clk_regmap ao_32k_sel = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "ao_32k_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = (const char *[]){ "ao_32k_div",
|
||||
- "ao_32k_pre" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &ao_32k_div.hw,
|
||||
+ &ao_32k_pre.hw
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -142,7 +146,7 @@ static struct clk_regmap ao_32k = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "ao_32k",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "ao_32k_sel" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &ao_32k_sel.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -159,10 +163,12 @@ static struct clk_regmap ao_cts_rtc_oscin = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "ao_cts_rtc_oscin",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "ext-32k-0",
|
||||
- IN_PREFIX "ext-32k-1",
|
||||
- IN_PREFIX "ext-32k-2",
|
||||
- "ao_32k" },
|
||||
+ .parent_data = (const struct clk_parent_data []) {
|
||||
+ { .fw_name = "ext-32k-0", },
|
||||
+ { .fw_name = "ext-32k-1", },
|
||||
+ { .fw_name = "ext-32k-2", },
|
||||
+ { .hw = &ao_32k.hw },
|
||||
+ },
|
||||
.num_parents = 4,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -178,8 +184,10 @@ static struct clk_regmap ao_clk81 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "ao_clk81",
|
||||
.ops = &clk_regmap_mux_ro_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "mpeg-clk",
|
||||
- "ao_cts_rtc_oscin" },
|
||||
+ .parent_data = (const struct clk_parent_data []) {
|
||||
+ { .fw_name = "mpeg-clk", },
|
||||
+ { .hw = &ao_cts_rtc_oscin.hw },
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -208,8 +216,10 @@ static struct clk_regmap ao_cts_cec = {
|
||||
* Until CCF gets fixed, adding this fake parent that won't
|
||||
* ever be registered should work around the problem
|
||||
*/
|
||||
- .parent_names = (const char *[]){ "fixme",
|
||||
- "ao_cts_rtc_oscin" },
|
||||
+ .parent_data = (const struct clk_parent_data []) {
|
||||
+ { .name = "fixme", .index = -1, },
|
||||
+ { .hw = &ao_cts_rtc_oscin.hw },
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -261,14 +271,6 @@ static const struct clk_hw_onecell_data gxbb_aoclk_onecell_data = {
|
||||
.num = NR_CLKS,
|
||||
};
|
||||
|
||||
-static const struct meson_aoclk_input gxbb_aoclk_inputs[] = {
|
||||
- { .name = "xtal", .required = true, },
|
||||
- { .name = "mpeg-clk", .required = true, },
|
||||
- {. name = "ext-32k-0", .required = false, },
|
||||
- {. name = "ext-32k-1", .required = false, },
|
||||
- {. name = "ext-32k-2", .required = false, },
|
||||
-};
|
||||
-
|
||||
static const struct meson_aoclk_data gxbb_aoclkc_data = {
|
||||
.reset_reg = AO_RTI_GEN_CNTL_REG0,
|
||||
.num_reset = ARRAY_SIZE(gxbb_aoclk_reset),
|
||||
@@ -276,9 +278,6 @@ static const struct meson_aoclk_data gxbb_aoclkc_data = {
|
||||
.num_clks = ARRAY_SIZE(gxbb_aoclk),
|
||||
.clks = gxbb_aoclk,
|
||||
.hw_data = &gxbb_aoclk_onecell_data,
|
||||
- .inputs = gxbb_aoclk_inputs,
|
||||
- .num_inputs = ARRAY_SIZE(gxbb_aoclk_inputs),
|
||||
- .input_prefix = IN_PREFIX,
|
||||
};
|
||||
|
||||
static const struct of_device_id gxbb_aoclkc_match_table[] = {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,247 @@
|
||||
From 1205d670359f3cb93770adf7b23dc4e71de605fc Mon Sep 17 00:00:00 2001
|
||||
From: Qiang Yu <yuq825@gmail.com>
|
||||
Date: Thu, 16 Jan 2020 21:11:56 +0800
|
||||
Subject: [PATCH 005/146] FROMGIT: drm/lima: recover task by enlarging heap
|
||||
buffer
|
||||
|
||||
Increase heap buffer backup memory when GP receive PLBU
|
||||
out of memory interrupt, then resume the task.
|
||||
|
||||
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||
Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
|
||||
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20200116131157.13346-5-yuq825@gmail.com
|
||||
---
|
||||
drivers/gpu/drm/lima/lima_gp.c | 58 +++++++++++++++++++++++++++++--
|
||||
drivers/gpu/drm/lima/lima_mmu.c | 5 +++
|
||||
drivers/gpu/drm/lima/lima_mmu.h | 1 +
|
||||
drivers/gpu/drm/lima/lima_sched.c | 35 ++++++++++++++++---
|
||||
drivers/gpu/drm/lima/lima_sched.h | 6 ++++
|
||||
5 files changed, 98 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/lima/lima_gp.c b/drivers/gpu/drm/lima/lima_gp.c
|
||||
index ccf49faedebf..52b210f9a605 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_gp.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_gp.c
|
||||
@@ -11,6 +11,8 @@
|
||||
#include "lima_device.h"
|
||||
#include "lima_gp.h"
|
||||
#include "lima_regs.h"
|
||||
+#include "lima_gem.h"
|
||||
+#include "lima_vm.h"
|
||||
|
||||
#define gp_write(reg, data) writel(data, ip->iomem + reg)
|
||||
#define gp_read(reg) readl(ip->iomem + reg)
|
||||
@@ -20,6 +22,7 @@ static irqreturn_t lima_gp_irq_handler(int irq, void *data)
|
||||
struct lima_ip *ip = data;
|
||||
struct lima_device *dev = ip->dev;
|
||||
struct lima_sched_pipe *pipe = dev->pipe + lima_pipe_gp;
|
||||
+ struct lima_sched_task *task = pipe->current_task;
|
||||
u32 state = gp_read(LIMA_GP_INT_STAT);
|
||||
u32 status = gp_read(LIMA_GP_STATUS);
|
||||
bool done = false;
|
||||
@@ -29,8 +32,16 @@ static irqreturn_t lima_gp_irq_handler(int irq, void *data)
|
||||
return IRQ_NONE;
|
||||
|
||||
if (state & LIMA_GP_IRQ_MASK_ERROR) {
|
||||
- dev_err(dev->dev, "gp error irq state=%x status=%x\n",
|
||||
- state, status);
|
||||
+ if ((state & LIMA_GP_IRQ_MASK_ERROR) ==
|
||||
+ LIMA_GP_IRQ_PLBU_OUT_OF_MEM) {
|
||||
+ dev_dbg(dev->dev, "gp out of heap irq status=%x\n",
|
||||
+ status);
|
||||
+ } else {
|
||||
+ dev_err(dev->dev, "gp error irq state=%x status=%x\n",
|
||||
+ state, status);
|
||||
+ if (task)
|
||||
+ task->recoverable = false;
|
||||
+ }
|
||||
|
||||
/* mask all interrupts before hard reset */
|
||||
gp_write(LIMA_GP_INT_MASK, 0);
|
||||
@@ -43,6 +54,7 @@ static irqreturn_t lima_gp_irq_handler(int irq, void *data)
|
||||
bool active = status & (LIMA_GP_STATUS_VS_ACTIVE |
|
||||
LIMA_GP_STATUS_PLBU_ACTIVE);
|
||||
done = valid && !active;
|
||||
+ pipe->error = false;
|
||||
}
|
||||
|
||||
gp_write(LIMA_GP_INT_CLEAR, state);
|
||||
@@ -121,6 +133,22 @@ static void lima_gp_task_run(struct lima_sched_pipe *pipe,
|
||||
u32 cmd = 0;
|
||||
int i;
|
||||
|
||||
+ /* update real heap buffer size for GP */
|
||||
+ for (i = 0; i < task->num_bos; i++) {
|
||||
+ struct lima_bo *bo = task->bos[i];
|
||||
+
|
||||
+ if (bo->heap_size &&
|
||||
+ lima_vm_get_va(task->vm, bo) ==
|
||||
+ f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2]) {
|
||||
+ f[LIMA_GP_PLBU_ALLOC_END_ADDR >> 2] =
|
||||
+ f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2] +
|
||||
+ bo->heap_size;
|
||||
+ task->recoverable = true;
|
||||
+ task->heap = bo;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (f[LIMA_GP_VSCL_START_ADDR >> 2] !=
|
||||
f[LIMA_GP_VSCL_END_ADDR >> 2])
|
||||
cmd |= LIMA_GP_CMD_START_VS;
|
||||
@@ -184,6 +212,31 @@ static void lima_gp_task_mmu_error(struct lima_sched_pipe *pipe)
|
||||
lima_sched_pipe_task_done(pipe);
|
||||
}
|
||||
|
||||
+static int lima_gp_task_recover(struct lima_sched_pipe *pipe)
|
||||
+{
|
||||
+ struct lima_ip *ip = pipe->processor[0];
|
||||
+ struct lima_sched_task *task = pipe->current_task;
|
||||
+ struct drm_lima_gp_frame *frame = task->frame;
|
||||
+ u32 *f = frame->frame;
|
||||
+ size_t fail_size =
|
||||
+ f[LIMA_GP_PLBU_ALLOC_END_ADDR >> 2] -
|
||||
+ f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2];
|
||||
+
|
||||
+ if (fail_size == task->heap->heap_size) {
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = lima_heap_alloc(task->heap, task->vm);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ gp_write(LIMA_GP_INT_MASK, LIMA_GP_IRQ_MASK_USED);
|
||||
+ gp_write(LIMA_GP_PLBU_ALLOC_END_ADDR,
|
||||
+ f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2] + task->heap->heap_size);
|
||||
+ gp_write(LIMA_GP_CMD, LIMA_GP_CMD_UPDATE_PLBU_ALLOC);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void lima_gp_print_version(struct lima_ip *ip)
|
||||
{
|
||||
u32 version, major, minor;
|
||||
@@ -270,6 +323,7 @@ int lima_gp_pipe_init(struct lima_device *dev)
|
||||
pipe->task_fini = lima_gp_task_fini;
|
||||
pipe->task_error = lima_gp_task_error;
|
||||
pipe->task_mmu_error = lima_gp_task_mmu_error;
|
||||
+ pipe->task_recover = lima_gp_task_recover;
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/drivers/gpu/drm/lima/lima_mmu.c b/drivers/gpu/drm/lima/lima_mmu.c
|
||||
index 97ec09dee572..f79d2af427e7 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_mmu.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_mmu.c
|
||||
@@ -99,6 +99,11 @@ void lima_mmu_fini(struct lima_ip *ip)
|
||||
|
||||
}
|
||||
|
||||
+void lima_mmu_flush_tlb(struct lima_ip *ip)
|
||||
+{
|
||||
+ mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_ZAP_CACHE);
|
||||
+}
|
||||
+
|
||||
void lima_mmu_switch_vm(struct lima_ip *ip, struct lima_vm *vm)
|
||||
{
|
||||
struct lima_device *dev = ip->dev;
|
||||
diff --git a/drivers/gpu/drm/lima/lima_mmu.h b/drivers/gpu/drm/lima/lima_mmu.h
|
||||
index 8c78319bcc8e..4f8ccbebcba1 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_mmu.h
|
||||
+++ b/drivers/gpu/drm/lima/lima_mmu.h
|
||||
@@ -10,6 +10,7 @@ struct lima_vm;
|
||||
int lima_mmu_init(struct lima_ip *ip);
|
||||
void lima_mmu_fini(struct lima_ip *ip);
|
||||
|
||||
+void lima_mmu_flush_tlb(struct lima_ip *ip);
|
||||
void lima_mmu_switch_vm(struct lima_ip *ip, struct lima_vm *vm);
|
||||
void lima_mmu_page_fault_resume(struct lima_ip *ip);
|
||||
|
||||
diff --git a/drivers/gpu/drm/lima/lima_sched.c b/drivers/gpu/drm/lima/lima_sched.c
|
||||
index b561dd05bd62..3886999b4533 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_sched.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_sched.c
|
||||
@@ -313,6 +313,26 @@ static const struct drm_sched_backend_ops lima_sched_ops = {
|
||||
.free_job = lima_sched_free_job,
|
||||
};
|
||||
|
||||
+static void lima_sched_recover_work(struct work_struct *work)
|
||||
+{
|
||||
+ struct lima_sched_pipe *pipe =
|
||||
+ container_of(work, struct lima_sched_pipe, recover_work);
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < pipe->num_l2_cache; i++)
|
||||
+ lima_l2_cache_flush(pipe->l2_cache[i]);
|
||||
+
|
||||
+ if (pipe->bcast_mmu) {
|
||||
+ lima_mmu_flush_tlb(pipe->bcast_mmu);
|
||||
+ } else {
|
||||
+ for (i = 0; i < pipe->num_mmu; i++)
|
||||
+ lima_mmu_flush_tlb(pipe->mmu[i]);
|
||||
+ }
|
||||
+
|
||||
+ if (pipe->task_recover(pipe))
|
||||
+ drm_sched_fault(&pipe->base);
|
||||
+}
|
||||
+
|
||||
int lima_sched_pipe_init(struct lima_sched_pipe *pipe, const char *name)
|
||||
{
|
||||
unsigned int timeout = lima_sched_timeout_ms > 0 ?
|
||||
@@ -321,6 +341,8 @@ int lima_sched_pipe_init(struct lima_sched_pipe *pipe, const char *name)
|
||||
pipe->fence_context = dma_fence_context_alloc(1);
|
||||
spin_lock_init(&pipe->fence_lock);
|
||||
|
||||
+ INIT_WORK(&pipe->recover_work, lima_sched_recover_work);
|
||||
+
|
||||
return drm_sched_init(&pipe->base, &lima_sched_ops, 1, 0,
|
||||
msecs_to_jiffies(timeout), name);
|
||||
}
|
||||
@@ -332,11 +354,14 @@ void lima_sched_pipe_fini(struct lima_sched_pipe *pipe)
|
||||
|
||||
void lima_sched_pipe_task_done(struct lima_sched_pipe *pipe)
|
||||
{
|
||||
- if (pipe->error)
|
||||
- drm_sched_fault(&pipe->base);
|
||||
- else {
|
||||
- struct lima_sched_task *task = pipe->current_task;
|
||||
-
|
||||
+ struct lima_sched_task *task = pipe->current_task;
|
||||
+
|
||||
+ if (pipe->error) {
|
||||
+ if (task && task->recoverable)
|
||||
+ schedule_work(&pipe->recover_work);
|
||||
+ else
|
||||
+ drm_sched_fault(&pipe->base);
|
||||
+ } else {
|
||||
pipe->task_fini(pipe);
|
||||
dma_fence_signal(task->fence);
|
||||
}
|
||||
diff --git a/drivers/gpu/drm/lima/lima_sched.h b/drivers/gpu/drm/lima/lima_sched.h
|
||||
index 1d814fecbcc0..d64393fb50a9 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_sched.h
|
||||
+++ b/drivers/gpu/drm/lima/lima_sched.h
|
||||
@@ -20,6 +20,9 @@ struct lima_sched_task {
|
||||
struct lima_bo **bos;
|
||||
int num_bos;
|
||||
|
||||
+ bool recoverable;
|
||||
+ struct lima_bo *heap;
|
||||
+
|
||||
/* pipe fence */
|
||||
struct dma_fence *fence;
|
||||
};
|
||||
@@ -68,6 +71,9 @@ struct lima_sched_pipe {
|
||||
void (*task_fini)(struct lima_sched_pipe *pipe);
|
||||
void (*task_error)(struct lima_sched_pipe *pipe);
|
||||
void (*task_mmu_error)(struct lima_sched_pipe *pipe);
|
||||
+ int (*task_recover)(struct lima_sched_pipe *pipe);
|
||||
+
|
||||
+ struct work_struct recover_work;
|
||||
};
|
||||
|
||||
int lima_sched_task_init(struct lima_sched_task *task,
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,194 +0,0 @@
|
||||
From bf0e0bbc0daea063465c686fcd7ad4c378df053a Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Date: Thu, 25 Jul 2019 18:41:25 +0200
|
||||
Subject: [PATCH 006/187] FROMGIT: clk: meson: axg-aoclk: migrate to the new
|
||||
parent description method
|
||||
|
||||
This clock controller use the string comparison method to describe parent
|
||||
relation between the clocks, which is not optimized.
|
||||
|
||||
Migrate to the new way by using .parent_hws where possible (when parent
|
||||
clocks are localy declared in the controller) and use .parent_data
|
||||
otherwise.
|
||||
|
||||
Remove clk input helper and all bypass clocks (declared in probe function)
|
||||
which are no longer used since we are able to use device-tree clock name
|
||||
directly.
|
||||
|
||||
Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit b90ec1e344a2dd4c1afebd75c1ce05afaf9e116b
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/axg-aoclk.c | 63 ++++++++++++++++++++---------------
|
||||
1 file changed, 37 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/axg-aoclk.c b/drivers/clk/meson/axg-aoclk.c
|
||||
index 0086f31288eb..b488b40c9d0e 100644
|
||||
--- a/drivers/clk/meson/axg-aoclk.c
|
||||
+++ b/drivers/clk/meson/axg-aoclk.c
|
||||
@@ -18,8 +18,6 @@
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-dualdiv.h"
|
||||
|
||||
-#define IN_PREFIX "ao-in-"
|
||||
-
|
||||
/*
|
||||
* AO Configuration Clock registers offsets
|
||||
* Register offsets from the data sheet must be multiplied by 4.
|
||||
@@ -42,7 +40,9 @@ static struct clk_regmap axg_aoclk_##_name = { \
|
||||
.hw.init = &(struct clk_init_data) { \
|
||||
.name = "axg_ao_" #_name, \
|
||||
.ops = &clk_regmap_gate_ops, \
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "mpeg-clk" }, \
|
||||
+ .parent_data = &(const struct clk_parent_data) { \
|
||||
+ .fw_name = "mpeg-clk", \
|
||||
+ }, \
|
||||
.num_parents = 1, \
|
||||
.flags = CLK_IGNORE_UNUSED, \
|
||||
}, \
|
||||
@@ -64,7 +64,9 @@ static struct clk_regmap axg_aoclk_cts_oscin = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cts_oscin",
|
||||
.ops = &clk_regmap_gate_ro_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "xtal" },
|
||||
+ .parent_data = &(const struct clk_parent_data) {
|
||||
+ .fw_name = "xtal",
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -77,7 +79,9 @@ static struct clk_regmap axg_aoclk_32k_pre = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "axg_ao_32k_pre",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "cts_oscin" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_aoclk_cts_oscin.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -124,7 +128,9 @@ static struct clk_regmap axg_aoclk_32k_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "axg_ao_32k_div",
|
||||
.ops = &meson_clk_dualdiv_ops,
|
||||
- .parent_names = (const char *[]){ "axg_ao_32k_pre" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_aoclk_32k_pre.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -139,8 +145,10 @@ static struct clk_regmap axg_aoclk_32k_sel = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "axg_ao_32k_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = (const char *[]){ "axg_ao_32k_div",
|
||||
- "axg_ao_32k_pre" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_aoclk_32k_div.hw,
|
||||
+ &axg_aoclk_32k_pre.hw,
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -154,7 +162,9 @@ static struct clk_regmap axg_aoclk_32k = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "axg_ao_32k",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "axg_ao_32k_sel" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_aoclk_32k_sel.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -170,8 +180,10 @@ static struct clk_regmap axg_aoclk_cts_rtc_oscin = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "axg_ao_cts_rtc_oscin",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = (const char *[]){ "axg_ao_32k",
|
||||
- IN_PREFIX "ext_32k-0" },
|
||||
+ .parent_data = (const struct clk_parent_data []) {
|
||||
+ { .hw = &axg_aoclk_32k.hw },
|
||||
+ { .fw_name = "ext_32k-0", },
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -187,8 +199,10 @@ static struct clk_regmap axg_aoclk_clk81 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "axg_ao_clk81",
|
||||
.ops = &clk_regmap_mux_ro_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "mpeg-clk",
|
||||
- "axg_ao_cts_rtc_oscin"},
|
||||
+ .parent_data = (const struct clk_parent_data []) {
|
||||
+ { .fw_name = "mpeg-clk", },
|
||||
+ { .hw = &axg_aoclk_cts_rtc_oscin.hw },
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -203,8 +217,10 @@ static struct clk_regmap axg_aoclk_saradc_mux = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "axg_ao_saradc_mux",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "xtal",
|
||||
- "axg_ao_clk81" },
|
||||
+ .parent_data = (const struct clk_parent_data []) {
|
||||
+ { .fw_name = "xtal", },
|
||||
+ { .hw = &axg_aoclk_clk81.hw },
|
||||
+ },
|
||||
.num_parents = 2,
|
||||
},
|
||||
};
|
||||
@@ -218,7 +234,9 @@ static struct clk_regmap axg_aoclk_saradc_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "axg_ao_saradc_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
- .parent_names = (const char *[]){ "axg_ao_saradc_mux" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_aoclk_saradc_mux.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -232,7 +250,9 @@ static struct clk_regmap axg_aoclk_saradc_gate = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "axg_ao_saradc_gate",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "axg_ao_saradc_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_aoclk_saradc_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -290,12 +310,6 @@ static const struct clk_hw_onecell_data axg_aoclk_onecell_data = {
|
||||
.num = NR_CLKS,
|
||||
};
|
||||
|
||||
-static const struct meson_aoclk_input axg_aoclk_inputs[] = {
|
||||
- { .name = "xtal", .required = true },
|
||||
- { .name = "mpeg-clk", .required = true },
|
||||
- { .name = "ext-32k-0", .required = false },
|
||||
-};
|
||||
-
|
||||
static const struct meson_aoclk_data axg_aoclkc_data = {
|
||||
.reset_reg = AO_RTI_GEN_CNTL_REG0,
|
||||
.num_reset = ARRAY_SIZE(axg_aoclk_reset),
|
||||
@@ -303,9 +317,6 @@ static const struct meson_aoclk_data axg_aoclkc_data = {
|
||||
.num_clks = ARRAY_SIZE(axg_aoclk_regmap),
|
||||
.clks = axg_aoclk_regmap,
|
||||
.hw_data = &axg_aoclk_onecell_data,
|
||||
- .inputs = axg_aoclk_inputs,
|
||||
- .num_inputs = ARRAY_SIZE(axg_aoclk_inputs),
|
||||
- .input_prefix = IN_PREFIX,
|
||||
};
|
||||
|
||||
static const struct of_device_id axg_aoclkc_match_table[] = {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,48 @@
|
||||
From b5da0390f260f6cfc633d496ee2ee1bc5233a877 Mon Sep 17 00:00:00 2001
|
||||
From: Qiang Yu <yuq825@gmail.com>
|
||||
Date: Thu, 16 Jan 2020 21:11:57 +0800
|
||||
Subject: [PATCH 006/146] FROMGIT: drm/lima: increase driver version to 1.1
|
||||
|
||||
Increase driver version for mesa driver to identify
|
||||
the support of new heap buffer interface.
|
||||
|
||||
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||
Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
|
||||
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20200116131157.13346-6-yuq825@gmail.com
|
||||
---
|
||||
drivers/gpu/drm/lima/lima_drv.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c
|
||||
index 18f88aaef1a2..2daac64d8955 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_drv.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_drv.c
|
||||
@@ -245,6 +245,12 @@ static const struct drm_ioctl_desc lima_drm_driver_ioctls[] = {
|
||||
|
||||
DEFINE_DRM_GEM_FOPS(lima_drm_driver_fops);
|
||||
|
||||
+/**
|
||||
+ * Changelog:
|
||||
+ *
|
||||
+ * - 1.1.0 - add heap buffer support
|
||||
+ */
|
||||
+
|
||||
static struct drm_driver lima_drm_driver = {
|
||||
.driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ,
|
||||
.open = lima_drm_driver_open,
|
||||
@@ -254,9 +260,9 @@ static struct drm_driver lima_drm_driver = {
|
||||
.fops = &lima_drm_driver_fops,
|
||||
.name = "lima",
|
||||
.desc = "lima DRM",
|
||||
- .date = "20190217",
|
||||
+ .date = "20191231",
|
||||
.major = 1,
|
||||
- .minor = 0,
|
||||
+ .minor = 1,
|
||||
.patchlevel = 0,
|
||||
|
||||
.gem_create_object = lima_gem_create_object,
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,130 +0,0 @@
|
||||
From 38016b418a556c21fbede6d4822c3ec5b2e3ec0e Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Date: Thu, 25 Jul 2019 18:41:26 +0200
|
||||
Subject: [PATCH 007/187] FROMGIT: clk: meson: remove ao input bypass clocks
|
||||
|
||||
During probe, bypass clocks (i.e. ao-in-xtal) are made from device-tree
|
||||
inputs to provide input clocks which can be access through global name.
|
||||
The cons of this method are the duplicated clocks, means more string
|
||||
comparison.
|
||||
|
||||
Specify parent directly with device-tree clock name.
|
||||
|
||||
Function to regiter bypass clocks is removed.
|
||||
|
||||
Input parameters from meson aoclk data structure are deprecated and then
|
||||
deleted since all aoclk files are migrated.
|
||||
|
||||
Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit 072a043f5a2e02441002fff34e3885e6026714eb
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/Kconfig | 1 -
|
||||
drivers/clk/meson/meson-aoclk.c | 37 ---------------------------------
|
||||
drivers/clk/meson/meson-aoclk.h | 8 -------
|
||||
3 files changed, 46 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
|
||||
index ee0b84b6b329..178ee72ba4bc 100644
|
||||
--- a/drivers/clk/meson/Kconfig
|
||||
+++ b/drivers/clk/meson/Kconfig
|
||||
@@ -33,7 +33,6 @@ config COMMON_CLK_MESON_VID_PLL_DIV
|
||||
config COMMON_CLK_MESON_AO_CLKC
|
||||
tristate
|
||||
select COMMON_CLK_MESON_REGMAP
|
||||
- select COMMON_CLK_MESON_INPUT
|
||||
select RESET_CONTROLLER
|
||||
|
||||
config COMMON_CLK_MESON_EE_CLKC
|
||||
diff --git a/drivers/clk/meson/meson-aoclk.c b/drivers/clk/meson/meson-aoclk.c
|
||||
index b67951909e04..bf8bea675d24 100644
|
||||
--- a/drivers/clk/meson/meson-aoclk.c
|
||||
+++ b/drivers/clk/meson/meson-aoclk.c
|
||||
@@ -17,8 +17,6 @@
|
||||
#include <linux/slab.h>
|
||||
#include "meson-aoclk.h"
|
||||
|
||||
-#include "clk-input.h"
|
||||
-
|
||||
static int meson_aoclk_do_reset(struct reset_controller_dev *rcdev,
|
||||
unsigned long id)
|
||||
{
|
||||
@@ -33,37 +31,6 @@ static const struct reset_control_ops meson_aoclk_reset_ops = {
|
||||
.reset = meson_aoclk_do_reset,
|
||||
};
|
||||
|
||||
-static int meson_aoclkc_register_inputs(struct device *dev,
|
||||
- struct meson_aoclk_data *data)
|
||||
-{
|
||||
- struct clk_hw *hw;
|
||||
- char *str;
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < data->num_inputs; i++) {
|
||||
- const struct meson_aoclk_input *in = &data->inputs[i];
|
||||
-
|
||||
- str = kasprintf(GFP_KERNEL, "%s%s", data->input_prefix,
|
||||
- in->name);
|
||||
- if (!str)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- hw = meson_clk_hw_register_input(dev, in->name, str, 0);
|
||||
- kfree(str);
|
||||
-
|
||||
- if (IS_ERR(hw)) {
|
||||
- if (!in->required && PTR_ERR(hw) == -ENOENT)
|
||||
- continue;
|
||||
- else if (PTR_ERR(hw) != -EPROBE_DEFER)
|
||||
- dev_err(dev, "failed to register input %s\n",
|
||||
- in->name);
|
||||
- return PTR_ERR(hw);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
int meson_aoclkc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct meson_aoclk_reset_controller *rstc;
|
||||
@@ -86,10 +53,6 @@ int meson_aoclkc_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
- ret = meson_aoclkc_register_inputs(dev, data);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
/* Reset Controller */
|
||||
rstc->data = data;
|
||||
rstc->regmap = regmap;
|
||||
diff --git a/drivers/clk/meson/meson-aoclk.h b/drivers/clk/meson/meson-aoclk.h
|
||||
index 999cde3868f7..605b43855a69 100644
|
||||
--- a/drivers/clk/meson/meson-aoclk.h
|
||||
+++ b/drivers/clk/meson/meson-aoclk.h
|
||||
@@ -18,20 +18,12 @@
|
||||
|
||||
#include "clk-regmap.h"
|
||||
|
||||
-struct meson_aoclk_input {
|
||||
- const char *name;
|
||||
- bool required;
|
||||
-};
|
||||
-
|
||||
struct meson_aoclk_data {
|
||||
const unsigned int reset_reg;
|
||||
const int num_reset;
|
||||
const unsigned int *reset;
|
||||
const int num_clks;
|
||||
struct clk_regmap **clks;
|
||||
- const int num_inputs;
|
||||
- const struct meson_aoclk_input *inputs;
|
||||
- const char *input_prefix;
|
||||
const struct clk_hw_onecell_data *hw_data;
|
||||
};
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,38 @@
|
||||
From 532b7e7f35698a33640bdf36914d0e0acd8270ef Mon Sep 17 00:00:00 2001
|
||||
From: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||
Date: Tue, 18 Feb 2020 22:09:52 +0000
|
||||
Subject: [PATCH 007/146] FROMGIT: drm/lima: fix recovering from PLBU out of
|
||||
memory
|
||||
|
||||
It looks like on PLBU_OUT_OF_MEM interrupt we need to resume from where we
|
||||
stopped, i.e. new PLBU heap start is old end. Also update end address
|
||||
in GP frame to grow heap on 2nd and subsequent out of memory interrupts.
|
||||
|
||||
Fixes: 2081e8dcf1ee ("drm/lima: recover task by enlarging heap buffer")
|
||||
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/lima/lima_gp.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/lima/lima_gp.c b/drivers/gpu/drm/lima/lima_gp.c
|
||||
index 52b210f9a605..d8841c870d90 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_gp.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_gp.c
|
||||
@@ -231,8 +231,13 @@ static int lima_gp_task_recover(struct lima_sched_pipe *pipe)
|
||||
}
|
||||
|
||||
gp_write(LIMA_GP_INT_MASK, LIMA_GP_IRQ_MASK_USED);
|
||||
+ /* Resume from where we stopped, i.e. new start is old end */
|
||||
+ gp_write(LIMA_GP_PLBU_ALLOC_START_ADDR,
|
||||
+ f[LIMA_GP_PLBU_ALLOC_END_ADDR >> 2]);
|
||||
+ f[LIMA_GP_PLBU_ALLOC_END_ADDR >> 2] =
|
||||
+ f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2] + task->heap->heap_size;
|
||||
gp_write(LIMA_GP_PLBU_ALLOC_END_ADDR,
|
||||
- f[LIMA_GP_PLBU_ALLOC_START_ADDR >> 2] + task->heap->heap_size);
|
||||
+ f[LIMA_GP_PLBU_ALLOC_END_ADDR >> 2]);
|
||||
gp_write(LIMA_GP_CMD, LIMA_GP_CMD_UPDATE_PLBU_ALLOC);
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,31 @@
|
||||
From bfbcca83970e75e1231347f1693e0884b17bec98 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Wed, 22 Jan 2020 10:25:26 +0100
|
||||
Subject: [PATCH 008/146] FROMGIT: dt-bindings: reset: meson: add gxl internal
|
||||
dac reset
|
||||
|
||||
Add the reset line of the internal DAC found on the amlogic gxl SoC family
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/dt-bindings/reset/amlogic,meson-gxbb-reset.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/dt-bindings/reset/amlogic,meson-gxbb-reset.h b/include/dt-bindings/reset/amlogic,meson-gxbb-reset.h
|
||||
index ea5058618863..883bfd3bcbad 100644
|
||||
--- a/include/dt-bindings/reset/amlogic,meson-gxbb-reset.h
|
||||
+++ b/include/dt-bindings/reset/amlogic,meson-gxbb-reset.h
|
||||
@@ -69,7 +69,7 @@
|
||||
#define RESET_SYS_CPU_L2 58
|
||||
#define RESET_SYS_CPU_P 59
|
||||
#define RESET_SYS_CPU_MBIST 60
|
||||
-/* 61 */
|
||||
+#define RESET_ACODEC 61
|
||||
/* 62 */
|
||||
/* 63 */
|
||||
/* RESET2 */
|
||||
--
|
||||
2.17.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,29 @@
|
||||
From 8502dc53c6d999458b198a953d52339411524c9c Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Wed, 22 Jan 2020 11:04:49 +0100
|
||||
Subject: [PATCH 009/146] FROMGIT: dt-bindings: clk: meson: add the gxl
|
||||
internal dac gate
|
||||
|
||||
Add the gxl ACODEC clock id to the gxbb clock controller bindings
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/dt-bindings/clock/gxbb-clkc.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/include/dt-bindings/clock/gxbb-clkc.h b/include/dt-bindings/clock/gxbb-clkc.h
|
||||
index db0763e96173..4073eb7a9da1 100644
|
||||
--- a/include/dt-bindings/clock/gxbb-clkc.h
|
||||
+++ b/include/dt-bindings/clock/gxbb-clkc.h
|
||||
@@ -146,5 +146,6 @@
|
||||
#define CLKID_CTS_VDAC 201
|
||||
#define CLKID_HDMI_TX 202
|
||||
#define CLKID_HDMI 205
|
||||
+#define CLKID_ACODEC 206
|
||||
|
||||
#endif /* __GXBB_CLKC_H */
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,579 +0,0 @@
|
||||
From 96ac190be753b21610c9c77676fee7c0dd4ecc2a Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Date: Thu, 25 Jul 2019 18:42:34 +0200
|
||||
Subject: [PATCH 010/187] FROMGIT: clk: meson: axg: migrate to the new parent
|
||||
description method
|
||||
|
||||
This clock controller use the string comparison method to describe parent
|
||||
relation between the clocks, which is not optimized.
|
||||
|
||||
Migrate to the new way by using .parent_hws where possible (ie. when
|
||||
all clocks are local to the controller) and use .parent_data otherwise.
|
||||
|
||||
Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit cc132d113dc589d8449fe2b53043b0f17029acac
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/axg.c | 204 ++++++++++++++++++++++++++++------------
|
||||
1 file changed, 144 insertions(+), 60 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/axg.c b/drivers/clk/meson/axg.c
|
||||
index 3ddd0efc9ee0..7a3d795cc614 100644
|
||||
--- a/drivers/clk/meson/axg.c
|
||||
+++ b/drivers/clk/meson/axg.c
|
||||
@@ -14,7 +14,6 @@
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
-#include "clk-input.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-pll.h"
|
||||
#include "clk-mpll.h"
|
||||
@@ -59,7 +58,9 @@ static struct clk_regmap axg_fixed_pll_dco = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fixed_pll_dco",
|
||||
.ops = &meson_clk_pll_ro_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "xtal" },
|
||||
+ .parent_data = &(const struct clk_parent_data) {
|
||||
+ .fw_name = "xtal",
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -74,7 +75,9 @@ static struct clk_regmap axg_fixed_pll = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fixed_pll",
|
||||
.ops = &clk_regmap_divider_ro_ops,
|
||||
- .parent_names = (const char *[]){ "fixed_pll_dco" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_fixed_pll_dco.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
/*
|
||||
* This clock won't ever change at runtime so
|
||||
@@ -114,7 +117,9 @@ static struct clk_regmap axg_sys_pll_dco = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "sys_pll_dco",
|
||||
.ops = &meson_clk_pll_ro_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "xtal" },
|
||||
+ .parent_data = &(const struct clk_parent_data) {
|
||||
+ .fw_name = "xtal",
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -129,7 +134,9 @@ static struct clk_regmap axg_sys_pll = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "sys_pll",
|
||||
.ops = &clk_regmap_divider_ro_ops,
|
||||
- .parent_names = (const char *[]){ "sys_pll_dco" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_sys_pll_dco.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -215,7 +222,9 @@ static struct clk_regmap axg_gp0_pll_dco = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gp0_pll_dco",
|
||||
.ops = &meson_clk_pll_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "xtal" },
|
||||
+ .parent_data = &(const struct clk_parent_data) {
|
||||
+ .fw_name = "xtal",
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -230,7 +239,9 @@ static struct clk_regmap axg_gp0_pll = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gp0_pll",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
- .parent_names = (const char *[]){ "gp0_pll_dco" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_gp0_pll_dco.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -284,7 +295,9 @@ static struct clk_regmap axg_hifi_pll_dco = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "hifi_pll_dco",
|
||||
.ops = &meson_clk_pll_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "xtal" },
|
||||
+ .parent_data = &(const struct clk_parent_data) {
|
||||
+ .fw_name = "xtal",
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -299,7 +312,9 @@ static struct clk_regmap axg_hifi_pll = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "hifi_pll",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
- .parent_names = (const char *[]){ "hifi_pll_dco" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_hifi_pll_dco.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -311,7 +326,7 @@ static struct clk_fixed_factor axg_fclk_div2_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fclk_div2_div",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
- .parent_names = (const char *[]){ "fixed_pll" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -324,7 +339,9 @@ static struct clk_regmap axg_fclk_div2 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fclk_div2",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "fclk_div2_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_fclk_div2_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_IS_CRITICAL,
|
||||
},
|
||||
@@ -336,7 +353,7 @@ static struct clk_fixed_factor axg_fclk_div3_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fclk_div3_div",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
- .parent_names = (const char *[]){ "fixed_pll" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -349,7 +366,9 @@ static struct clk_regmap axg_fclk_div3 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fclk_div3",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "fclk_div3_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_fclk_div3_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
/*
|
||||
* FIXME:
|
||||
@@ -372,7 +391,7 @@ static struct clk_fixed_factor axg_fclk_div4_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fclk_div4_div",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
- .parent_names = (const char *[]){ "fixed_pll" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -385,7 +404,9 @@ static struct clk_regmap axg_fclk_div4 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fclk_div4",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "fclk_div4_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_fclk_div4_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -396,7 +417,7 @@ static struct clk_fixed_factor axg_fclk_div5_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fclk_div5_div",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
- .parent_names = (const char *[]){ "fixed_pll" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -409,7 +430,9 @@ static struct clk_regmap axg_fclk_div5 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fclk_div5",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "fclk_div5_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_fclk_div5_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -420,7 +443,9 @@ static struct clk_fixed_factor axg_fclk_div7_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fclk_div7_div",
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
- .parent_names = (const char *[]){ "fixed_pll" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_fixed_pll.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -433,7 +458,9 @@ static struct clk_regmap axg_fclk_div7 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "fclk_div7",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "fclk_div7_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_fclk_div7_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -447,7 +474,9 @@ static struct clk_regmap axg_mpll_prediv = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mpll_prediv",
|
||||
.ops = &clk_regmap_divider_ro_ops,
|
||||
- .parent_names = (const char *[]){ "fixed_pll" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_fixed_pll.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -480,7 +509,9 @@ static struct clk_regmap axg_mpll0_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mpll0_div",
|
||||
.ops = &meson_clk_mpll_ops,
|
||||
- .parent_names = (const char *[]){ "mpll_prediv" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_mpll_prediv.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -493,7 +524,9 @@ static struct clk_regmap axg_mpll0 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mpll0",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "mpll0_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_mpll0_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -527,7 +560,9 @@ static struct clk_regmap axg_mpll1_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mpll1_div",
|
||||
.ops = &meson_clk_mpll_ops,
|
||||
- .parent_names = (const char *[]){ "mpll_prediv" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_mpll_prediv.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -540,7 +575,9 @@ static struct clk_regmap axg_mpll1 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mpll1",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "mpll1_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_mpll1_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -579,7 +616,9 @@ static struct clk_regmap axg_mpll2_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mpll2_div",
|
||||
.ops = &meson_clk_mpll_ops,
|
||||
- .parent_names = (const char *[]){ "mpll_prediv" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_mpll_prediv.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -592,7 +631,9 @@ static struct clk_regmap axg_mpll2 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mpll2",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "mpll2_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_mpll2_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -626,7 +667,9 @@ static struct clk_regmap axg_mpll3_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mpll3_div",
|
||||
.ops = &meson_clk_mpll_ops,
|
||||
- .parent_names = (const char *[]){ "mpll_prediv" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_mpll_prediv.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -639,7 +682,9 @@ static struct clk_regmap axg_mpll3 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mpll3",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "mpll3_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_mpll3_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -702,7 +747,9 @@ static struct clk_regmap axg_pcie_pll_dco = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "pcie_pll_dco",
|
||||
.ops = &meson_clk_pll_ops,
|
||||
- .parent_names = (const char *[]){ IN_PREFIX "xtal" },
|
||||
+ .parent_data = &(const struct clk_parent_data) {
|
||||
+ .fw_name = "xtal",
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -717,7 +764,9 @@ static struct clk_regmap axg_pcie_pll_od = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "pcie_pll_od",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
- .parent_names = (const char *[]){ "pcie_pll_dco" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_pcie_pll_dco.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -733,7 +782,9 @@ static struct clk_regmap axg_pcie_pll = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "pcie_pll",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
- .parent_names = (const char *[]){ "pcie_pll_od" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_pcie_pll_od.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -750,7 +801,7 @@ static struct clk_regmap axg_pcie_mux = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "pcie_mux",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = (const char *[]){ "pcie_pll" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &axg_pcie_pll.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -767,7 +818,7 @@ static struct clk_regmap axg_pcie_ref = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "pcie_ref",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = (const char *[]){ "pcie_mux" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &axg_pcie_mux.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -781,7 +832,7 @@ static struct clk_regmap axg_pcie_cml_en0 = {
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "pcie_cml_en0",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "pcie_ref" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
|
||||
@@ -796,16 +847,21 @@ static struct clk_regmap axg_pcie_cml_en1 = {
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "pcie_cml_en1",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "pcie_ref" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static u32 mux_table_clk81[] = { 0, 2, 3, 4, 5, 6, 7 };
|
||||
-static const char * const clk81_parent_names[] = {
|
||||
- IN_PREFIX "xtal", "fclk_div7", "mpll1", "mpll2", "fclk_div4",
|
||||
- "fclk_div3", "fclk_div5"
|
||||
+static const struct clk_parent_data clk81_parent_data[] = {
|
||||
+ { .fw_name = "xtal", },
|
||||
+ { .hw = &axg_fclk_div7.hw },
|
||||
+ { .hw = &axg_mpll1.hw },
|
||||
+ { .hw = &axg_mpll2.hw },
|
||||
+ { .hw = &axg_fclk_div4.hw },
|
||||
+ { .hw = &axg_fclk_div3.hw },
|
||||
+ { .hw = &axg_fclk_div5.hw },
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_mpeg_clk_sel = {
|
||||
@@ -818,8 +874,8 @@ static struct clk_regmap axg_mpeg_clk_sel = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mpeg_clk_sel",
|
||||
.ops = &clk_regmap_mux_ro_ops,
|
||||
- .parent_names = clk81_parent_names,
|
||||
- .num_parents = ARRAY_SIZE(clk81_parent_names),
|
||||
+ .parent_data = clk81_parent_data,
|
||||
+ .num_parents = ARRAY_SIZE(clk81_parent_data),
|
||||
},
|
||||
};
|
||||
|
||||
@@ -832,7 +888,9 @@ static struct clk_regmap axg_mpeg_clk_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mpeg_clk_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
- .parent_names = (const char *[]){ "mpeg_clk_sel" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_mpeg_clk_sel.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -846,15 +904,20 @@ static struct clk_regmap axg_clk81 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "clk81",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "mpeg_clk_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_mpeg_clk_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
|
||||
},
|
||||
};
|
||||
|
||||
-static const char * const axg_sd_emmc_clk0_parent_names[] = {
|
||||
- IN_PREFIX "xtal", "fclk_div2", "fclk_div3", "fclk_div5", "fclk_div7",
|
||||
-
|
||||
+static const struct clk_parent_data axg_sd_emmc_clk0_parent_data[] = {
|
||||
+ { .fw_name = "xtal", },
|
||||
+ { .hw = &axg_fclk_div2.hw },
|
||||
+ { .hw = &axg_fclk_div3.hw },
|
||||
+ { .hw = &axg_fclk_div5.hw },
|
||||
+ { .hw = &axg_fclk_div7.hw },
|
||||
/*
|
||||
* Following these parent clocks, we should also have had mpll2, mpll3
|
||||
* and gp0_pll but these clocks are too precious to be used here. All
|
||||
@@ -873,8 +936,8 @@ static struct clk_regmap axg_sd_emmc_b_clk0_sel = {
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "sd_emmc_b_clk0_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = axg_sd_emmc_clk0_parent_names,
|
||||
- .num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_names),
|
||||
+ .parent_data = axg_sd_emmc_clk0_parent_data,
|
||||
+ .num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
@@ -889,7 +952,9 @@ static struct clk_regmap axg_sd_emmc_b_clk0_div = {
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "sd_emmc_b_clk0_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
- .parent_names = (const char *[]){ "sd_emmc_b_clk0_sel" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_sd_emmc_b_clk0_sel.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -903,7 +968,9 @@ static struct clk_regmap axg_sd_emmc_b_clk0 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "sd_emmc_b_clk0",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "sd_emmc_b_clk0_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_sd_emmc_b_clk0_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -919,8 +986,8 @@ static struct clk_regmap axg_sd_emmc_c_clk0_sel = {
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "sd_emmc_c_clk0_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
- .parent_names = axg_sd_emmc_clk0_parent_names,
|
||||
- .num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_names),
|
||||
+ .parent_data = axg_sd_emmc_clk0_parent_data,
|
||||
+ .num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
@@ -935,7 +1002,9 @@ static struct clk_regmap axg_sd_emmc_c_clk0_div = {
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "sd_emmc_c_clk0_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
- .parent_names = (const char *[]){ "sd_emmc_c_clk0_sel" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_sd_emmc_c_clk0_sel.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -949,7 +1018,9 @@ static struct clk_regmap axg_sd_emmc_c_clk0 = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "sd_emmc_c_clk0",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "sd_emmc_c_clk0_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_sd_emmc_c_clk0_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -957,9 +1028,18 @@ static struct clk_regmap axg_sd_emmc_c_clk0 = {
|
||||
|
||||
static u32 mux_table_gen_clk[] = { 0, 4, 5, 6, 7, 8,
|
||||
9, 10, 11, 13, 14, };
|
||||
-static const char * const gen_clk_parent_names[] = {
|
||||
- IN_PREFIX "xtal", "hifi_pll", "mpll0", "mpll1", "mpll2", "mpll3",
|
||||
- "fclk_div4", "fclk_div3", "fclk_div5", "fclk_div7", "gp0_pll",
|
||||
+static const struct clk_parent_data gen_clk_parent_data[] = {
|
||||
+ { .fw_name = "xtal", },
|
||||
+ { .hw = &axg_hifi_pll.hw },
|
||||
+ { .hw = &axg_mpll0.hw },
|
||||
+ { .hw = &axg_mpll1.hw },
|
||||
+ { .hw = &axg_mpll2.hw },
|
||||
+ { .hw = &axg_mpll3.hw },
|
||||
+ { .hw = &axg_fclk_div4.hw },
|
||||
+ { .hw = &axg_fclk_div3.hw },
|
||||
+ { .hw = &axg_fclk_div5.hw },
|
||||
+ { .hw = &axg_fclk_div7.hw },
|
||||
+ { .hw = &axg_gp0_pll.hw },
|
||||
};
|
||||
|
||||
static struct clk_regmap axg_gen_clk_sel = {
|
||||
@@ -978,8 +1058,8 @@ static struct clk_regmap axg_gen_clk_sel = {
|
||||
* hifi_pll, mpll0, mpll1, mpll2, mpll3, fdiv4,
|
||||
* fdiv3, fdiv5, [cts_msr_clk], fdiv7, gp0_pll
|
||||
*/
|
||||
- .parent_names = gen_clk_parent_names,
|
||||
- .num_parents = ARRAY_SIZE(gen_clk_parent_names),
|
||||
+ .parent_data = gen_clk_parent_data,
|
||||
+ .num_parents = ARRAY_SIZE(gen_clk_parent_data),
|
||||
},
|
||||
};
|
||||
|
||||
@@ -992,7 +1072,9 @@ static struct clk_regmap axg_gen_clk_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gen_clk_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
- .parent_names = (const char *[]){ "gen_clk_sel" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_gen_clk_sel.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
@@ -1006,7 +1088,9 @@ static struct clk_regmap axg_gen_clk = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gen_clk",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
- .parent_names = (const char *[]){ "gen_clk_div" },
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &axg_gen_clk_div.hw
|
||||
+ },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,60 @@
|
||||
From 17b823e4687b26ffe35a17e26128631afe49d0b2 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Wed, 22 Jan 2020 11:04:50 +0100
|
||||
Subject: [PATCH 010/146] FROMGIT: clk: meson: gxbb: add the gxl internal dac
|
||||
gate
|
||||
|
||||
Add the ACODEC clock gate to the gxl clk controller driver
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/gxbb.c | 3 +++
|
||||
drivers/clk/meson/gxbb.h | 2 +-
|
||||
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c
|
||||
index 1f9c056e684c..47916c4f1700 100644
|
||||
--- a/drivers/clk/meson/gxbb.c
|
||||
+++ b/drivers/clk/meson/gxbb.c
|
||||
@@ -2613,6 +2613,7 @@ static MESON_GATE(gxbb_assist_misc, HHI_GCLK_MPEG0, 23);
|
||||
static MESON_GATE(gxbb_emmc_a, HHI_GCLK_MPEG0, 24);
|
||||
static MESON_GATE(gxbb_emmc_b, HHI_GCLK_MPEG0, 25);
|
||||
static MESON_GATE(gxbb_emmc_c, HHI_GCLK_MPEG0, 26);
|
||||
+static MESON_GATE(gxl_acodec, HHI_GCLK_MPEG0, 28);
|
||||
static MESON_GATE(gxbb_spi, HHI_GCLK_MPEG0, 30);
|
||||
|
||||
static MESON_GATE(gxbb_i2s_spdif, HHI_GCLK_MPEG1, 2);
|
||||
@@ -3100,6 +3101,7 @@ static struct clk_hw_onecell_data gxl_hw_onecell_data = {
|
||||
[CLKID_HDMI_SEL] = &gxbb_hdmi_sel.hw,
|
||||
[CLKID_HDMI_DIV] = &gxbb_hdmi_div.hw,
|
||||
[CLKID_HDMI] = &gxbb_hdmi.hw,
|
||||
+ [CLKID_ACODEC] = &gxl_acodec.hw,
|
||||
[NR_CLKS] = NULL,
|
||||
},
|
||||
.num = NR_CLKS,
|
||||
@@ -3491,6 +3493,7 @@ static struct clk_regmap *const gxl_clk_regmaps[] = {
|
||||
&gxl_hdmi_pll_od,
|
||||
&gxl_hdmi_pll_od2,
|
||||
&gxl_hdmi_pll_dco,
|
||||
+ &gxl_acodec,
|
||||
};
|
||||
|
||||
static const struct meson_eeclkc_data gxbb_clkc_data = {
|
||||
diff --git a/drivers/clk/meson/gxbb.h b/drivers/clk/meson/gxbb.h
|
||||
index b53584fe66cf..1ee8cb7e2f5a 100644
|
||||
--- a/drivers/clk/meson/gxbb.h
|
||||
+++ b/drivers/clk/meson/gxbb.h
|
||||
@@ -188,7 +188,7 @@
|
||||
#define CLKID_HDMI_SEL 203
|
||||
#define CLKID_HDMI_DIV 204
|
||||
|
||||
-#define NR_CLKS 206
|
||||
+#define NR_CLKS 207
|
||||
|
||||
/* include the CLKIDs that have been made part of the DT binding */
|
||||
#include <dt-bindings/clock/gxbb-clkc.h>
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,56 @@
|
||||
From d6a0ab839aaa36c6952e61e64500191126c74f40 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Wed, 22 Jan 2020 11:04:51 +0100
|
||||
Subject: [PATCH 011/146] FROMGIT: clk: meson: gxbb: set audio output clock
|
||||
hierarchy
|
||||
|
||||
The aiu devices peripheral clocks needs the aiu and aiu_glue clocks to
|
||||
operate. Reflect this hierarchy in the gxbb clock tree.
|
||||
|
||||
Fixes: 738f66d3211d ("clk: gxbb: add AmLogic GXBB clk controller driver")
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/gxbb.c | 18 ++++++++++--------
|
||||
1 file changed, 10 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c
|
||||
index 47916c4f1700..5fd6a574f8c3 100644
|
||||
--- a/drivers/clk/meson/gxbb.c
|
||||
+++ b/drivers/clk/meson/gxbb.c
|
||||
@@ -2619,14 +2619,6 @@ static MESON_GATE(gxbb_spi, HHI_GCLK_MPEG0, 30);
|
||||
static MESON_GATE(gxbb_i2s_spdif, HHI_GCLK_MPEG1, 2);
|
||||
static MESON_GATE(gxbb_eth, HHI_GCLK_MPEG1, 3);
|
||||
static MESON_GATE(gxbb_demux, HHI_GCLK_MPEG1, 4);
|
||||
-static MESON_GATE(gxbb_aiu_glue, HHI_GCLK_MPEG1, 6);
|
||||
-static MESON_GATE(gxbb_iec958, HHI_GCLK_MPEG1, 7);
|
||||
-static MESON_GATE(gxbb_i2s_out, HHI_GCLK_MPEG1, 8);
|
||||
-static MESON_GATE(gxbb_amclk, HHI_GCLK_MPEG1, 9);
|
||||
-static MESON_GATE(gxbb_aififo2, HHI_GCLK_MPEG1, 10);
|
||||
-static MESON_GATE(gxbb_mixer, HHI_GCLK_MPEG1, 11);
|
||||
-static MESON_GATE(gxbb_mixer_iface, HHI_GCLK_MPEG1, 12);
|
||||
-static MESON_GATE(gxbb_adc, HHI_GCLK_MPEG1, 13);
|
||||
static MESON_GATE(gxbb_blkmv, HHI_GCLK_MPEG1, 14);
|
||||
static MESON_GATE(gxbb_aiu, HHI_GCLK_MPEG1, 15);
|
||||
static MESON_GATE(gxbb_uart1, HHI_GCLK_MPEG1, 16);
|
||||
@@ -2681,6 +2673,16 @@ static MESON_GATE(gxbb_ao_ahb_bus, HHI_GCLK_AO, 2);
|
||||
static MESON_GATE(gxbb_ao_iface, HHI_GCLK_AO, 3);
|
||||
static MESON_GATE(gxbb_ao_i2c, HHI_GCLK_AO, 4);
|
||||
|
||||
+/* AIU gates */
|
||||
+static MESON_PCLK(gxbb_aiu_glue, HHI_GCLK_MPEG1, 6, &gxbb_aiu.hw);
|
||||
+static MESON_PCLK(gxbb_iec958, HHI_GCLK_MPEG1, 7, &gxbb_aiu_glue.hw);
|
||||
+static MESON_PCLK(gxbb_i2s_out, HHI_GCLK_MPEG1, 8, &gxbb_aiu_glue.hw);
|
||||
+static MESON_PCLK(gxbb_amclk, HHI_GCLK_MPEG1, 9, &gxbb_aiu_glue.hw);
|
||||
+static MESON_PCLK(gxbb_aififo2, HHI_GCLK_MPEG1, 10, &gxbb_aiu_glue.hw);
|
||||
+static MESON_PCLK(gxbb_mixer, HHI_GCLK_MPEG1, 11, &gxbb_aiu_glue.hw);
|
||||
+static MESON_PCLK(gxbb_mixer_iface, HHI_GCLK_MPEG1, 12, &gxbb_aiu_glue.hw);
|
||||
+static MESON_PCLK(gxbb_adc, HHI_GCLK_MPEG1, 13, &gxbb_aiu_glue.hw);
|
||||
+
|
||||
/* Array of all clocks provided by this provider */
|
||||
|
||||
static struct clk_hw_onecell_data gxbb_hw_onecell_data = {
|
||||
--
|
||||
2.17.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,42 @@
|
||||
From 25132741a2bda8a016d2d0870fbeb244d0cdd545 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Thu, 13 Feb 2020 16:51:51 +0100
|
||||
Subject: [PATCH 012/146] FROMGIT: ASoC: core: allow a dt node to provide
|
||||
several components
|
||||
|
||||
At the moment, querying the dai_name will stop of the first component
|
||||
matching the dt node. This does not allow a device (single dt node) to
|
||||
provide several ASoC components which could then be used through DT.
|
||||
|
||||
This change let the search go on if the xlate function of the component
|
||||
returns an error, giving the possibility to another component to match
|
||||
and return the dai_name.
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
sound/soc/soc-core.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
|
||||
index 068d809c349a..03b87427faa7 100644
|
||||
--- a/sound/soc/soc-core.c
|
||||
+++ b/sound/soc/soc-core.c
|
||||
@@ -3102,6 +3102,14 @@ int snd_soc_get_dai_name(struct of_phandle_args *args,
|
||||
*dai_name = dai->driver->name;
|
||||
if (!*dai_name)
|
||||
*dai_name = pos->name;
|
||||
+ } else if (ret) {
|
||||
+ /*
|
||||
+ * if another error than ENOTSUPP is returned go on and
|
||||
+ * check if another component is provided with the same
|
||||
+ * node. This may happen if a device provides several
|
||||
+ * components
|
||||
+ */
|
||||
+ continue;
|
||||
}
|
||||
|
||||
break;
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,121 +0,0 @@
|
||||
From 3020618a2f27eed92c22026b8f2a5f49215bb668 Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Date: Thu, 25 Jul 2019 18:42:36 +0200
|
||||
Subject: [PATCH 012/187] FROMGIT: clk: meson: clk-regmap: migrate to new
|
||||
parent description method
|
||||
|
||||
This clock controller use the string comparison method to describe parent
|
||||
relation between the clocks, which is not optimized.
|
||||
|
||||
Migrate to the new way by using .parent_hws where possible (ie. when
|
||||
all clocks are local to the controller) and use .parent_data otherwise.
|
||||
|
||||
Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit 3a36044e7f3909c7ddb7ddfc727ab8104a563439
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/axg.c | 3 +++
|
||||
drivers/clk/meson/clk-regmap.h | 12 ++++++------
|
||||
drivers/clk/meson/g12a.c | 6 ++++++
|
||||
drivers/clk/meson/gxbb.c | 3 +++
|
||||
drivers/clk/meson/meson8b.c | 3 +++
|
||||
5 files changed, 21 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/axg.c b/drivers/clk/meson/axg.c
|
||||
index 7a3d795cc614..13fc0006f63d 100644
|
||||
--- a/drivers/clk/meson/axg.c
|
||||
+++ b/drivers/clk/meson/axg.c
|
||||
@@ -1096,6 +1096,9 @@ static struct clk_regmap axg_gen_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
+#define MESON_GATE(_name, _reg, _bit) \
|
||||
+ MESON_PCLK(_name, _reg, _bit, &axg_clk81.hw)
|
||||
+
|
||||
/* Everything Else (EE) domain gates */
|
||||
static MESON_GATE(axg_ddr, HHI_GCLK_MPEG0, 0);
|
||||
static MESON_GATE(axg_audio_locker, HHI_GCLK_MPEG0, 2);
|
||||
diff --git a/drivers/clk/meson/clk-regmap.h b/drivers/clk/meson/clk-regmap.h
|
||||
index 1dd0abe3ba91..c4a39604cffd 100644
|
||||
--- a/drivers/clk/meson/clk-regmap.h
|
||||
+++ b/drivers/clk/meson/clk-regmap.h
|
||||
@@ -111,7 +111,7 @@ clk_get_regmap_mux_data(struct clk_regmap *clk)
|
||||
extern const struct clk_ops clk_regmap_mux_ops;
|
||||
extern const struct clk_ops clk_regmap_mux_ro_ops;
|
||||
|
||||
-#define __MESON_GATE(_name, _reg, _bit, _ops) \
|
||||
+#define __MESON_PCLK(_name, _reg, _bit, _ops, _pname) \
|
||||
struct clk_regmap _name = { \
|
||||
.data = &(struct clk_regmap_gate_data){ \
|
||||
.offset = (_reg), \
|
||||
@@ -120,15 +120,15 @@ struct clk_regmap _name = { \
|
||||
.hw.init = &(struct clk_init_data) { \
|
||||
.name = #_name, \
|
||||
.ops = _ops, \
|
||||
- .parent_names = (const char *[]){ "clk81" }, \
|
||||
+ .parent_hws = (const struct clk_hw *[]) { _pname }, \
|
||||
.num_parents = 1, \
|
||||
.flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED), \
|
||||
}, \
|
||||
}
|
||||
|
||||
-#define MESON_GATE(_name, _reg, _bit) \
|
||||
- __MESON_GATE(_name, _reg, _bit, &clk_regmap_gate_ops)
|
||||
+#define MESON_PCLK(_name, _reg, _bit, _pname) \
|
||||
+ __MESON_PCLK(_name, _reg, _bit, &clk_regmap_gate_ops, _pname)
|
||||
|
||||
-#define MESON_GATE_RO(_name, _reg, _bit) \
|
||||
- __MESON_GATE(_name, _reg, _bit, &clk_regmap_gate_ro_ops)
|
||||
+#define MESON_PCLK_RO(_name, _reg, _bit, _pname) \
|
||||
+ __MESON_PCLK(_name, _reg, _bit, &clk_regmap_gate_ro_ops, _pname)
|
||||
#endif /* __CLK_REGMAP_H */
|
||||
diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c
|
||||
index 8cc7f5acf7ab..a8f706de811b 100644
|
||||
--- a/drivers/clk/meson/g12a.c
|
||||
+++ b/drivers/clk/meson/g12a.c
|
||||
@@ -3325,6 +3325,12 @@ static struct clk_regmap g12a_ts = {
|
||||
},
|
||||
};
|
||||
|
||||
+#define MESON_GATE(_name, _reg, _bit) \
|
||||
+ MESON_PCLK(_name, _reg, _bit, &g12a_clk81.hw)
|
||||
+
|
||||
+#define MESON_GATE_RO(_name, _reg, _bit) \
|
||||
+ MESON_PCLK_RO(_name, _reg, _bit, &g12a_clk81.hw)
|
||||
+
|
||||
/* Everything Else (EE) domain gates */
|
||||
static MESON_GATE(g12a_ddr, HHI_GCLK_MPEG0, 0);
|
||||
static MESON_GATE(g12a_dos, HHI_GCLK_MPEG0, 1);
|
||||
diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c
|
||||
index 67e466356d4b..7cfb998eeb3e 100644
|
||||
--- a/drivers/clk/meson/gxbb.c
|
||||
+++ b/drivers/clk/meson/gxbb.c
|
||||
@@ -2587,6 +2587,9 @@ static struct clk_regmap gxbb_gen_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
+#define MESON_GATE(_name, _reg, _bit) \
|
||||
+ MESON_PCLK(_name, _reg, _bit, &gxbb_clk81.hw)
|
||||
+
|
||||
/* Everything Else (EE) domain gates */
|
||||
static MESON_GATE(gxbb_ddr, HHI_GCLK_MPEG0, 0);
|
||||
static MESON_GATE(gxbb_dos, HHI_GCLK_MPEG0, 1);
|
||||
diff --git a/drivers/clk/meson/meson8b.c b/drivers/clk/meson/meson8b.c
|
||||
index b30279a5bfcc..67e6691e080c 100644
|
||||
--- a/drivers/clk/meson/meson8b.c
|
||||
+++ b/drivers/clk/meson/meson8b.c
|
||||
@@ -2564,6 +2564,9 @@ static struct clk_regmap meson8b_cts_i958 = {
|
||||
},
|
||||
};
|
||||
|
||||
+#define MESON_GATE(_name, _reg, _bit) \
|
||||
+ MESON_PCLK(_name, _reg, _bit, &meson8b_clk81.hw)
|
||||
+
|
||||
/* Everything Else (EE) domain gates */
|
||||
|
||||
static MESON_GATE(meson8b_ddr, HHI_GCLK_MPEG0, 0);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,73 @@
|
||||
From 04c2c7ba6ac38afcca0dcee7b02dcad68912ec33 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Fri, 14 Feb 2020 14:47:04 +0100
|
||||
Subject: [PATCH 013/146] FROMGIT: ASoC: core: ensure component names are
|
||||
unique
|
||||
|
||||
Make sure each ASoC component is registered with a unique name.
|
||||
The component is derived from the device name. If a device registers more
|
||||
than one component, the component names will be the same.
|
||||
|
||||
This usually brings up a warning about the debugfs directory creation of
|
||||
the component since directory already exists.
|
||||
|
||||
In such case, start numbering the component of the device so the names
|
||||
don't collide anymore.
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Link: https://lore.kernel.org/r/20200214134704.342501-1-jbrunet@baylibre.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
sound/soc/soc-core.c | 29 ++++++++++++++++++++++++++++-
|
||||
1 file changed, 28 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
|
||||
index 03b87427faa7..6a58a8f6e3c4 100644
|
||||
--- a/sound/soc/soc-core.c
|
||||
+++ b/sound/soc/soc-core.c
|
||||
@@ -2446,6 +2446,33 @@ static int snd_soc_register_dais(struct snd_soc_component *component,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static char *snd_soc_component_unique_name(struct device *dev,
|
||||
+ struct snd_soc_component *component)
|
||||
+{
|
||||
+ struct snd_soc_component *pos;
|
||||
+ int count = 0;
|
||||
+ char *name, *unique;
|
||||
+
|
||||
+ name = fmt_single_name(dev, &component->id);
|
||||
+ if (!name)
|
||||
+ return name;
|
||||
+
|
||||
+ /* Count the number of components registred by the device */
|
||||
+ for_each_component(pos) {
|
||||
+ if (dev == pos->dev)
|
||||
+ count++;
|
||||
+ }
|
||||
+
|
||||
+ /* Keep naming as it is for the 1st component */
|
||||
+ if (!count)
|
||||
+ return name;
|
||||
+
|
||||
+ unique = devm_kasprintf(dev, GFP_KERNEL, "%s-%d", name, count);
|
||||
+ devm_kfree(dev, name);
|
||||
+
|
||||
+ return unique;
|
||||
+}
|
||||
+
|
||||
static int snd_soc_component_initialize(struct snd_soc_component *component,
|
||||
const struct snd_soc_component_driver *driver, struct device *dev)
|
||||
{
|
||||
@@ -2454,7 +2481,7 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
|
||||
INIT_LIST_HEAD(&component->card_list);
|
||||
mutex_init(&component->io_mutex);
|
||||
|
||||
- component->name = fmt_single_name(dev, &component->id);
|
||||
+ component->name = snd_soc_component_unique_name(dev, component);
|
||||
if (!component->name) {
|
||||
dev_err(dev, "ASoC: Failed to allocate name\n");
|
||||
return -ENOMEM;
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,88 +0,0 @@
|
||||
From 5cbe82e753b44cbc47686f739a3ca914963dbee2 Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Date: Thu, 25 Jul 2019 18:42:37 +0200
|
||||
Subject: [PATCH 013/187] FROMGIT: clk: meson: remove ee input bypass clocks
|
||||
|
||||
During probe, bypass clocks (i.e. ee-in-xtal) are made from device-tree
|
||||
inputs to provide input clocks which can be access through global name.
|
||||
The cons of this method are the duplicated clocks, means more string
|
||||
comparison.
|
||||
|
||||
Specify parent directly with device-tree clock name.
|
||||
|
||||
Remove the bypass clock registration from the ee probe function.
|
||||
|
||||
Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit b11cfaba5b4d6e287540a3d64c403e5b26dd2728
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/Kconfig | 1 -
|
||||
drivers/clk/meson/meson-eeclk.c | 10 ----------
|
||||
drivers/clk/meson/meson-eeclk.h | 2 --
|
||||
3 files changed, 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
|
||||
index 178ee72ba4bc..72a37572501f 100644
|
||||
--- a/drivers/clk/meson/Kconfig
|
||||
+++ b/drivers/clk/meson/Kconfig
|
||||
@@ -38,7 +38,6 @@ config COMMON_CLK_MESON_AO_CLKC
|
||||
config COMMON_CLK_MESON_EE_CLKC
|
||||
tristate
|
||||
select COMMON_CLK_MESON_REGMAP
|
||||
- select COMMON_CLK_MESON_INPUT
|
||||
|
||||
config COMMON_CLK_MESON8B
|
||||
bool
|
||||
diff --git a/drivers/clk/meson/meson-eeclk.c b/drivers/clk/meson/meson-eeclk.c
|
||||
index 6ba2094be257..a7cb1e7aedc4 100644
|
||||
--- a/drivers/clk/meson/meson-eeclk.c
|
||||
+++ b/drivers/clk/meson/meson-eeclk.c
|
||||
@@ -10,7 +10,6 @@
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
-#include "clk-input.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "meson-eeclk.h"
|
||||
|
||||
@@ -18,7 +17,6 @@ int meson_eeclkc_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct meson_eeclkc_data *data;
|
||||
struct device *dev = &pdev->dev;
|
||||
- struct clk_hw *input;
|
||||
struct regmap *map;
|
||||
int ret, i;
|
||||
|
||||
@@ -37,14 +35,6 @@ int meson_eeclkc_probe(struct platform_device *pdev)
|
||||
if (data->init_count)
|
||||
regmap_multi_reg_write(map, data->init_regs, data->init_count);
|
||||
|
||||
- input = meson_clk_hw_register_input(dev, "xtal", IN_PREFIX "xtal", 0);
|
||||
- if (IS_ERR(input)) {
|
||||
- ret = PTR_ERR(input);
|
||||
- if (ret != -EPROBE_DEFER)
|
||||
- dev_err(dev, "failed to get input clock");
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
/* Populate regmap for the regmap backed clocks */
|
||||
for (i = 0; i < data->regmap_clk_num; i++)
|
||||
data->regmap_clks[i]->map = map;
|
||||
diff --git a/drivers/clk/meson/meson-eeclk.h b/drivers/clk/meson/meson-eeclk.h
|
||||
index 9ab5d6fa7ccb..77316207bde1 100644
|
||||
--- a/drivers/clk/meson/meson-eeclk.h
|
||||
+++ b/drivers/clk/meson/meson-eeclk.h
|
||||
@@ -10,8 +10,6 @@
|
||||
#include <linux/clk-provider.h>
|
||||
#include "clk-regmap.h"
|
||||
|
||||
-#define IN_PREFIX "ee-in-"
|
||||
-
|
||||
struct platform_device;
|
||||
|
||||
struct meson_eeclkc_data {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,567 @@
|
||||
From 9fcc658d50b1951e08ab53ca28adb607dbb46c18 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Thu, 13 Feb 2020 16:51:52 +0100
|
||||
Subject: [PATCH 014/146] FROMGIT: ASoC: meson: g12a: extract codec-to-codec
|
||||
utils
|
||||
|
||||
The hdmi routing mechanism used on g12a hdmi is also used:
|
||||
* other Amlogic SoC types
|
||||
* for the internal DAC path
|
||||
|
||||
Each of these codec glues are slightly different but the idea
|
||||
behind it remains the same. This change extract some helper functions
|
||||
from the g12a-tohdmitx driver to make them available for other Amlogic
|
||||
codecs.
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/Kconfig | 4 +
|
||||
sound/soc/meson/Makefile | 2 +
|
||||
sound/soc/meson/g12a-tohdmitx.c | 219 ++++++-----------------------
|
||||
sound/soc/meson/meson-codec-glue.c | 149 ++++++++++++++++++++
|
||||
sound/soc/meson/meson-codec-glue.h | 32 +++++
|
||||
5 files changed, 230 insertions(+), 176 deletions(-)
|
||||
create mode 100644 sound/soc/meson/meson-codec-glue.c
|
||||
create mode 100644 sound/soc/meson/meson-codec-glue.h
|
||||
|
||||
diff --git a/sound/soc/meson/Kconfig b/sound/soc/meson/Kconfig
|
||||
index 2e3676147cea..ee6d53949d45 100644
|
||||
--- a/sound/soc/meson/Kconfig
|
||||
+++ b/sound/soc/meson/Kconfig
|
||||
@@ -85,9 +85,13 @@ config SND_MESON_AXG_PDM
|
||||
Select Y or M to add support for PDM input embedded
|
||||
in the Amlogic AXG SoC family
|
||||
|
||||
+config SND_MESON_CODEC_GLUE
|
||||
+ tristate
|
||||
+
|
||||
config SND_MESON_G12A_TOHDMITX
|
||||
tristate "Amlogic G12A To HDMI TX Control Support"
|
||||
select REGMAP_MMIO
|
||||
+ select SND_MESON_CODEC_GLUE
|
||||
imply SND_SOC_HDMI_CODEC
|
||||
help
|
||||
Select Y or M to add support for HDMI audio on the g12a SoC
|
||||
diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile
|
||||
index 1a8b1470ed84..529a807b3f37 100644
|
||||
--- a/sound/soc/meson/Makefile
|
||||
+++ b/sound/soc/meson/Makefile
|
||||
@@ -11,6 +11,7 @@ snd-soc-meson-axg-sound-card-objs := axg-card.o
|
||||
snd-soc-meson-axg-spdifin-objs := axg-spdifin.o
|
||||
snd-soc-meson-axg-spdifout-objs := axg-spdifout.o
|
||||
snd-soc-meson-axg-pdm-objs := axg-pdm.o
|
||||
+snd-soc-meson-codec-glue-objs := meson-codec-glue.o
|
||||
snd-soc-meson-g12a-tohdmitx-objs := g12a-tohdmitx.o
|
||||
|
||||
obj-$(CONFIG_SND_MESON_AXG_FIFO) += snd-soc-meson-axg-fifo.o
|
||||
@@ -24,4 +25,5 @@ obj-$(CONFIG_SND_MESON_AXG_SOUND_CARD) += snd-soc-meson-axg-sound-card.o
|
||||
obj-$(CONFIG_SND_MESON_AXG_SPDIFIN) += snd-soc-meson-axg-spdifin.o
|
||||
obj-$(CONFIG_SND_MESON_AXG_SPDIFOUT) += snd-soc-meson-axg-spdifout.o
|
||||
obj-$(CONFIG_SND_MESON_AXG_PDM) += snd-soc-meson-axg-pdm.o
|
||||
+obj-$(CONFIG_SND_MESON_CODEC_GLUE) += snd-soc-meson-codec-glue.o
|
||||
obj-$(CONFIG_SND_MESON_G12A_TOHDMITX) += snd-soc-meson-g12a-tohdmitx.o
|
||||
diff --git a/sound/soc/meson/g12a-tohdmitx.c b/sound/soc/meson/g12a-tohdmitx.c
|
||||
index 9cfbd343a00c..f8853f2fba08 100644
|
||||
--- a/sound/soc/meson/g12a-tohdmitx.c
|
||||
+++ b/sound/soc/meson/g12a-tohdmitx.c
|
||||
@@ -12,112 +12,51 @@
|
||||
#include <sound/soc-dai.h>
|
||||
|
||||
#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
|
||||
+#include "meson-codec-glue.h"
|
||||
|
||||
#define G12A_TOHDMITX_DRV_NAME "g12a-tohdmitx"
|
||||
|
||||
#define TOHDMITX_CTRL0 0x0
|
||||
#define CTRL0_ENABLE_SHIFT 31
|
||||
-#define CTRL0_I2S_DAT_SEL GENMASK(13, 12)
|
||||
+#define CTRL0_I2S_DAT_SEL_SHIFT 12
|
||||
+#define CTRL0_I2S_DAT_SEL (0x3 << CTRL0_I2S_DAT_SEL_SHIFT)
|
||||
#define CTRL0_I2S_LRCLK_SEL GENMASK(9, 8)
|
||||
#define CTRL0_I2S_BLK_CAP_INV BIT(7)
|
||||
#define CTRL0_I2S_BCLK_O_INV BIT(6)
|
||||
#define CTRL0_I2S_BCLK_SEL GENMASK(5, 4)
|
||||
#define CTRL0_SPDIF_CLK_CAP_INV BIT(3)
|
||||
#define CTRL0_SPDIF_CLK_O_INV BIT(2)
|
||||
-#define CTRL0_SPDIF_SEL BIT(1)
|
||||
+#define CTRL0_SPDIF_SEL_SHIFT 1
|
||||
+#define CTRL0_SPDIF_SEL (0x1 << CTRL0_SPDIF_SEL_SHIFT)
|
||||
#define CTRL0_SPDIF_CLK_SEL BIT(0)
|
||||
|
||||
-struct g12a_tohdmitx_input {
|
||||
- struct snd_soc_pcm_stream params;
|
||||
- unsigned int fmt;
|
||||
-};
|
||||
-
|
||||
-static struct snd_soc_dapm_widget *
|
||||
-g12a_tohdmitx_get_input(struct snd_soc_dapm_widget *w)
|
||||
-{
|
||||
- struct snd_soc_dapm_path *p = NULL;
|
||||
- struct snd_soc_dapm_widget *in;
|
||||
-
|
||||
- snd_soc_dapm_widget_for_each_source_path(w, p) {
|
||||
- if (!p->connect)
|
||||
- continue;
|
||||
-
|
||||
- /* Check that we still are in the same component */
|
||||
- if (snd_soc_dapm_to_component(w->dapm) !=
|
||||
- snd_soc_dapm_to_component(p->source->dapm))
|
||||
- continue;
|
||||
-
|
||||
- if (p->source->id == snd_soc_dapm_dai_in)
|
||||
- return p->source;
|
||||
-
|
||||
- in = g12a_tohdmitx_get_input(p->source);
|
||||
- if (in)
|
||||
- return in;
|
||||
- }
|
||||
-
|
||||
- return NULL;
|
||||
-}
|
||||
-
|
||||
-static struct g12a_tohdmitx_input *
|
||||
-g12a_tohdmitx_get_input_data(struct snd_soc_dapm_widget *w)
|
||||
-{
|
||||
- struct snd_soc_dapm_widget *in =
|
||||
- g12a_tohdmitx_get_input(w);
|
||||
- struct snd_soc_dai *dai;
|
||||
-
|
||||
- if (WARN_ON(!in))
|
||||
- return NULL;
|
||||
-
|
||||
- dai = in->priv;
|
||||
-
|
||||
- return dai->playback_dma_data;
|
||||
-}
|
||||
-
|
||||
static const char * const g12a_tohdmitx_i2s_mux_texts[] = {
|
||||
"I2S A", "I2S B", "I2S C",
|
||||
};
|
||||
|
||||
-static SOC_ENUM_SINGLE_EXT_DECL(g12a_tohdmitx_i2s_mux_enum,
|
||||
- g12a_tohdmitx_i2s_mux_texts);
|
||||
-
|
||||
-static int g12a_tohdmitx_get_input_val(struct snd_soc_component *component,
|
||||
- unsigned int mask)
|
||||
-{
|
||||
- unsigned int val;
|
||||
-
|
||||
- snd_soc_component_read(component, TOHDMITX_CTRL0, &val);
|
||||
- return (val & mask) >> __ffs(mask);
|
||||
-}
|
||||
-
|
||||
-static int g12a_tohdmitx_i2s_mux_get_enum(struct snd_kcontrol *kcontrol,
|
||||
- struct snd_ctl_elem_value *ucontrol)
|
||||
-{
|
||||
- struct snd_soc_component *component =
|
||||
- snd_soc_dapm_kcontrol_component(kcontrol);
|
||||
-
|
||||
- ucontrol->value.enumerated.item[0] =
|
||||
- g12a_tohdmitx_get_input_val(component, CTRL0_I2S_DAT_SEL);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
static int g12a_tohdmitx_i2s_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||
- struct snd_ctl_elem_value *ucontrol)
|
||||
+ struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_component *component =
|
||||
snd_soc_dapm_kcontrol_component(kcontrol);
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||
- unsigned int mux = ucontrol->value.enumerated.item[0];
|
||||
- unsigned int val = g12a_tohdmitx_get_input_val(component,
|
||||
- CTRL0_I2S_DAT_SEL);
|
||||
+ unsigned int mux, changed;
|
||||
+
|
||||
+ mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
|
||||
+ changed = snd_soc_component_test_bits(component, e->reg,
|
||||
+ CTRL0_I2S_DAT_SEL,
|
||||
+ FIELD_PREP(CTRL0_I2S_DAT_SEL,
|
||||
+ mux));
|
||||
+
|
||||
+ if (!changed)
|
||||
+ return 0;
|
||||
|
||||
/* Force disconnect of the mux while updating */
|
||||
- if (val != mux)
|
||||
- snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||
|
||||
- snd_soc_component_update_bits(component, TOHDMITX_CTRL0,
|
||||
+ snd_soc_component_update_bits(component, e->reg,
|
||||
CTRL0_I2S_DAT_SEL |
|
||||
CTRL0_I2S_LRCLK_SEL |
|
||||
CTRL0_I2S_BCLK_SEL,
|
||||
@@ -130,30 +69,19 @@ static int g12a_tohdmitx_i2s_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static SOC_ENUM_SINGLE_DECL(g12a_tohdmitx_i2s_mux_enum, TOHDMITX_CTRL0,
|
||||
+ CTRL0_I2S_DAT_SEL_SHIFT,
|
||||
+ g12a_tohdmitx_i2s_mux_texts);
|
||||
+
|
||||
static const struct snd_kcontrol_new g12a_tohdmitx_i2s_mux =
|
||||
SOC_DAPM_ENUM_EXT("I2S Source", g12a_tohdmitx_i2s_mux_enum,
|
||||
- g12a_tohdmitx_i2s_mux_get_enum,
|
||||
+ snd_soc_dapm_get_enum_double,
|
||||
g12a_tohdmitx_i2s_mux_put_enum);
|
||||
|
||||
static const char * const g12a_tohdmitx_spdif_mux_texts[] = {
|
||||
"SPDIF A", "SPDIF B",
|
||||
};
|
||||
|
||||
-static SOC_ENUM_SINGLE_EXT_DECL(g12a_tohdmitx_spdif_mux_enum,
|
||||
- g12a_tohdmitx_spdif_mux_texts);
|
||||
-
|
||||
-static int g12a_tohdmitx_spdif_mux_get_enum(struct snd_kcontrol *kcontrol,
|
||||
- struct snd_ctl_elem_value *ucontrol)
|
||||
-{
|
||||
- struct snd_soc_component *component =
|
||||
- snd_soc_dapm_kcontrol_component(kcontrol);
|
||||
-
|
||||
- ucontrol->value.enumerated.item[0] =
|
||||
- g12a_tohdmitx_get_input_val(component, CTRL0_SPDIF_SEL);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
static int g12a_tohdmitx_spdif_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
@@ -162,13 +90,18 @@ static int g12a_tohdmitx_spdif_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||
- unsigned int mux = ucontrol->value.enumerated.item[0];
|
||||
- unsigned int val = g12a_tohdmitx_get_input_val(component,
|
||||
- CTRL0_SPDIF_SEL);
|
||||
+ unsigned int mux, changed;
|
||||
+
|
||||
+ mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
|
||||
+ changed = snd_soc_component_test_bits(component, TOHDMITX_CTRL0,
|
||||
+ CTRL0_SPDIF_SEL,
|
||||
+ FIELD_PREP(CTRL0_SPDIF_SEL, mux));
|
||||
+
|
||||
+ if (!changed)
|
||||
+ return 0;
|
||||
|
||||
/* Force disconnect of the mux while updating */
|
||||
- if (val != mux)
|
||||
- snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||
|
||||
snd_soc_component_update_bits(component, TOHDMITX_CTRL0,
|
||||
CTRL0_SPDIF_SEL |
|
||||
@@ -181,9 +114,13 @@ static int g12a_tohdmitx_spdif_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static SOC_ENUM_SINGLE_DECL(g12a_tohdmitx_spdif_mux_enum, TOHDMITX_CTRL0,
|
||||
+ CTRL0_SPDIF_SEL_SHIFT,
|
||||
+ g12a_tohdmitx_spdif_mux_texts);
|
||||
+
|
||||
static const struct snd_kcontrol_new g12a_tohdmitx_spdif_mux =
|
||||
SOC_DAPM_ENUM_EXT("SPDIF Source", g12a_tohdmitx_spdif_mux_enum,
|
||||
- g12a_tohdmitx_spdif_mux_get_enum,
|
||||
+ snd_soc_dapm_get_enum_double,
|
||||
g12a_tohdmitx_spdif_mux_put_enum);
|
||||
|
||||
static const struct snd_kcontrol_new g12a_tohdmitx_out_enable =
|
||||
@@ -201,83 +138,13 @@ static const struct snd_soc_dapm_widget g12a_tohdmitx_widgets[] = {
|
||||
&g12a_tohdmitx_out_enable),
|
||||
};
|
||||
|
||||
-static int g12a_tohdmitx_input_probe(struct snd_soc_dai *dai)
|
||||
-{
|
||||
- struct g12a_tohdmitx_input *data;
|
||||
-
|
||||
- data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
- if (!data)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- dai->playback_dma_data = data;
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int g12a_tohdmitx_input_remove(struct snd_soc_dai *dai)
|
||||
-{
|
||||
- kfree(dai->playback_dma_data);
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int g12a_tohdmitx_input_hw_params(struct snd_pcm_substream *substream,
|
||||
- struct snd_pcm_hw_params *params,
|
||||
- struct snd_soc_dai *dai)
|
||||
-{
|
||||
- struct g12a_tohdmitx_input *data = dai->playback_dma_data;
|
||||
-
|
||||
- data->params.rates = snd_pcm_rate_to_rate_bit(params_rate(params));
|
||||
- data->params.rate_min = params_rate(params);
|
||||
- data->params.rate_max = params_rate(params);
|
||||
- data->params.formats = 1 << params_format(params);
|
||||
- data->params.channels_min = params_channels(params);
|
||||
- data->params.channels_max = params_channels(params);
|
||||
- data->params.sig_bits = dai->driver->playback.sig_bits;
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-
|
||||
-static int g12a_tohdmitx_input_set_fmt(struct snd_soc_dai *dai,
|
||||
- unsigned int fmt)
|
||||
-{
|
||||
- struct g12a_tohdmitx_input *data = dai->playback_dma_data;
|
||||
-
|
||||
- /* Save the source stream format for the downstream link */
|
||||
- data->fmt = fmt;
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int g12a_tohdmitx_output_startup(struct snd_pcm_substream *substream,
|
||||
- struct snd_soc_dai *dai)
|
||||
-{
|
||||
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
- struct g12a_tohdmitx_input *in_data =
|
||||
- g12a_tohdmitx_get_input_data(dai->capture_widget);
|
||||
-
|
||||
- if (!in_data)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- if (WARN_ON(!rtd->dai_link->params)) {
|
||||
- dev_warn(dai->dev, "codec2codec link expected\n");
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
- /* Replace link params with the input params */
|
||||
- rtd->dai_link->params = &in_data->params;
|
||||
-
|
||||
- if (!in_data->fmt)
|
||||
- return 0;
|
||||
-
|
||||
- return snd_soc_runtime_set_dai_fmt(rtd, in_data->fmt);
|
||||
-}
|
||||
-
|
||||
static const struct snd_soc_dai_ops g12a_tohdmitx_input_ops = {
|
||||
- .hw_params = g12a_tohdmitx_input_hw_params,
|
||||
- .set_fmt = g12a_tohdmitx_input_set_fmt,
|
||||
+ .hw_params = meson_codec_glue_input_hw_params,
|
||||
+ .set_fmt = meson_codec_glue_input_set_fmt,
|
||||
};
|
||||
|
||||
static const struct snd_soc_dai_ops g12a_tohdmitx_output_ops = {
|
||||
- .startup = g12a_tohdmitx_output_startup,
|
||||
+ .startup = meson_codec_glue_output_startup,
|
||||
};
|
||||
|
||||
#define TOHDMITX_SPDIF_FORMATS \
|
||||
@@ -304,8 +171,8 @@ static const struct snd_soc_dai_ops g12a_tohdmitx_output_ops = {
|
||||
.id = (xid), \
|
||||
.playback = TOHDMITX_STREAM(xname, "Playback", xfmt, xchmax), \
|
||||
.ops = &g12a_tohdmitx_input_ops, \
|
||||
- .probe = g12a_tohdmitx_input_probe, \
|
||||
- .remove = g12a_tohdmitx_input_remove, \
|
||||
+ .probe = meson_codec_glue_input_dai_probe, \
|
||||
+ .remove = meson_codec_glue_input_dai_remove, \
|
||||
}
|
||||
|
||||
#define TOHDMITX_OUT(xname, xid, xfmt, xchmax) { \
|
||||
diff --git a/sound/soc/meson/meson-codec-glue.c b/sound/soc/meson/meson-codec-glue.c
|
||||
new file mode 100644
|
||||
index 000000000000..97bbc967e176
|
||||
--- /dev/null
|
||||
+++ b/sound/soc/meson/meson-codec-glue.c
|
||||
@@ -0,0 +1,149 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+//
|
||||
+// Copyright (c) 2019 BayLibre, SAS.
|
||||
+// Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <sound/pcm_params.h>
|
||||
+#include <sound/soc.h>
|
||||
+#include <sound/soc-dai.h>
|
||||
+
|
||||
+#include "meson-codec-glue.h"
|
||||
+
|
||||
+static struct snd_soc_dapm_widget *
|
||||
+meson_codec_glue_get_input(struct snd_soc_dapm_widget *w)
|
||||
+{
|
||||
+ struct snd_soc_dapm_path *p = NULL;
|
||||
+ struct snd_soc_dapm_widget *in;
|
||||
+
|
||||
+ snd_soc_dapm_widget_for_each_source_path(w, p) {
|
||||
+ if (!p->connect)
|
||||
+ continue;
|
||||
+
|
||||
+ /* Check that we still are in the same component */
|
||||
+ if (snd_soc_dapm_to_component(w->dapm) !=
|
||||
+ snd_soc_dapm_to_component(p->source->dapm))
|
||||
+ continue;
|
||||
+
|
||||
+ if (p->source->id == snd_soc_dapm_dai_in)
|
||||
+ return p->source;
|
||||
+
|
||||
+ in = meson_codec_glue_get_input(p->source);
|
||||
+ if (in)
|
||||
+ return in;
|
||||
+ }
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static void meson_codec_glue_input_set_data(struct snd_soc_dai *dai,
|
||||
+ struct meson_codec_glue_input *data)
|
||||
+{
|
||||
+ dai->playback_dma_data = data;
|
||||
+}
|
||||
+
|
||||
+struct meson_codec_glue_input *
|
||||
+meson_codec_glue_input_get_data(struct snd_soc_dai *dai)
|
||||
+{
|
||||
+ return dai->playback_dma_data;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(meson_codec_glue_input_get_data);
|
||||
+
|
||||
+static struct meson_codec_glue_input *
|
||||
+meson_codec_glue_output_get_input_data(struct snd_soc_dapm_widget *w)
|
||||
+{
|
||||
+ struct snd_soc_dapm_widget *in =
|
||||
+ meson_codec_glue_get_input(w);
|
||||
+ struct snd_soc_dai *dai;
|
||||
+
|
||||
+ if (WARN_ON(!in))
|
||||
+ return NULL;
|
||||
+
|
||||
+ dai = in->priv;
|
||||
+
|
||||
+ return meson_codec_glue_input_get_data(dai);
|
||||
+}
|
||||
+
|
||||
+int meson_codec_glue_input_hw_params(struct snd_pcm_substream *substream,
|
||||
+ struct snd_pcm_hw_params *params,
|
||||
+ struct snd_soc_dai *dai)
|
||||
+{
|
||||
+ struct meson_codec_glue_input *data =
|
||||
+ meson_codec_glue_input_get_data(dai);
|
||||
+
|
||||
+ data->params.rates = snd_pcm_rate_to_rate_bit(params_rate(params));
|
||||
+ data->params.rate_min = params_rate(params);
|
||||
+ data->params.rate_max = params_rate(params);
|
||||
+ data->params.formats = 1 << params_format(params);
|
||||
+ data->params.channels_min = params_channels(params);
|
||||
+ data->params.channels_max = params_channels(params);
|
||||
+ data->params.sig_bits = dai->driver->playback.sig_bits;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(meson_codec_glue_input_hw_params);
|
||||
+
|
||||
+int meson_codec_glue_input_set_fmt(struct snd_soc_dai *dai,
|
||||
+ unsigned int fmt)
|
||||
+{
|
||||
+ struct meson_codec_glue_input *data =
|
||||
+ meson_codec_glue_input_get_data(dai);
|
||||
+
|
||||
+ /* Save the source stream format for the downstream link */
|
||||
+ data->fmt = fmt;
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(meson_codec_glue_input_set_fmt);
|
||||
+
|
||||
+int meson_codec_glue_output_startup(struct snd_pcm_substream *substream,
|
||||
+ struct snd_soc_dai *dai)
|
||||
+{
|
||||
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
+ struct meson_codec_glue_input *in_data =
|
||||
+ meson_codec_glue_output_get_input_data(dai->capture_widget);
|
||||
+
|
||||
+ if (!in_data)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ if (WARN_ON(!rtd->dai_link->params)) {
|
||||
+ dev_warn(dai->dev, "codec2codec link expected\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /* Replace link params with the input params */
|
||||
+ rtd->dai_link->params = &in_data->params;
|
||||
+
|
||||
+ if (!in_data->fmt)
|
||||
+ return 0;
|
||||
+
|
||||
+ return snd_soc_runtime_set_dai_fmt(rtd, in_data->fmt);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(meson_codec_glue_output_startup);
|
||||
+
|
||||
+int meson_codec_glue_input_dai_probe(struct snd_soc_dai *dai)
|
||||
+{
|
||||
+ struct meson_codec_glue_input *data;
|
||||
+
|
||||
+ data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
+ if (!data)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ meson_codec_glue_input_set_data(dai, data);
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(meson_codec_glue_input_dai_probe);
|
||||
+
|
||||
+int meson_codec_glue_input_dai_remove(struct snd_soc_dai *dai)
|
||||
+{
|
||||
+ struct meson_codec_glue_input *data =
|
||||
+ meson_codec_glue_input_get_data(dai);
|
||||
+
|
||||
+ kfree(data);
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(meson_codec_glue_input_dai_remove);
|
||||
+
|
||||
+MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
|
||||
+MODULE_DESCRIPTION("Amlogic Codec Glue Helpers");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
+
|
||||
diff --git a/sound/soc/meson/meson-codec-glue.h b/sound/soc/meson/meson-codec-glue.h
|
||||
new file mode 100644
|
||||
index 000000000000..07f99446c0c6
|
||||
--- /dev/null
|
||||
+++ b/sound/soc/meson/meson-codec-glue.h
|
||||
@@ -0,0 +1,32 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0
|
||||
+ *
|
||||
+ * Copyright (c) 2018 Baylibre SAS.
|
||||
+ * Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||
+ */
|
||||
+
|
||||
+#ifndef _MESON_CODEC_GLUE_H
|
||||
+#define _MESON_CODEC_GLUE_H
|
||||
+
|
||||
+#include <sound/soc.h>
|
||||
+
|
||||
+struct meson_codec_glue_input {
|
||||
+ struct snd_soc_pcm_stream params;
|
||||
+ unsigned int fmt;
|
||||
+};
|
||||
+
|
||||
+/* Input helpers */
|
||||
+struct meson_codec_glue_input *
|
||||
+meson_codec_glue_input_get_data(struct snd_soc_dai *dai);
|
||||
+int meson_codec_glue_input_hw_params(struct snd_pcm_substream *substream,
|
||||
+ struct snd_pcm_hw_params *params,
|
||||
+ struct snd_soc_dai *dai);
|
||||
+int meson_codec_glue_input_set_fmt(struct snd_soc_dai *dai,
|
||||
+ unsigned int fmt);
|
||||
+int meson_codec_glue_input_dai_probe(struct snd_soc_dai *dai);
|
||||
+int meson_codec_glue_input_dai_remove(struct snd_soc_dai *dai);
|
||||
+
|
||||
+/* Output helpers */
|
||||
+int meson_codec_glue_output_startup(struct snd_pcm_substream *substream,
|
||||
+ struct snd_soc_dai *dai);
|
||||
+
|
||||
+#endif /* _MESON_CODEC_GLUE_H */
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,130 +0,0 @@
|
||||
From 8d48d1551e26b76810bf19fc3aaad9033922f6d2 Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Date: Thu, 25 Jul 2019 18:42:38 +0200
|
||||
Subject: [PATCH 014/187] FROMGIT: clk: meson: remove clk input helper
|
||||
|
||||
The clk input function which allows clock controllers to register a bypass
|
||||
clock from a clock producer is no longer needed anymore since meson clock
|
||||
controllers have migrated to a new parent allocation method.
|
||||
|
||||
Signed-off-by: Alexandre Mergnat <amergnat@baylibre.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit e96c7612315a1183e12d5b6ebd523a3a93617510
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/Kconfig | 3 ---
|
||||
drivers/clk/meson/Makefile | 1 -
|
||||
drivers/clk/meson/clk-input.c | 49 -----------------------------------
|
||||
drivers/clk/meson/clk-input.h | 19 --------------
|
||||
4 files changed, 72 deletions(-)
|
||||
delete mode 100644 drivers/clk/meson/clk-input.c
|
||||
delete mode 100644 drivers/clk/meson/clk-input.h
|
||||
|
||||
diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
|
||||
index 72a37572501f..500be0b0d473 100644
|
||||
--- a/drivers/clk/meson/Kconfig
|
||||
+++ b/drivers/clk/meson/Kconfig
|
||||
@@ -1,7 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
-config COMMON_CLK_MESON_INPUT
|
||||
- tristate
|
||||
-
|
||||
config COMMON_CLK_MESON_REGMAP
|
||||
tristate
|
||||
select REGMAP
|
||||
diff --git a/drivers/clk/meson/Makefile b/drivers/clk/meson/Makefile
|
||||
index bc35a4efd6b7..f09d83dc3d60 100644
|
||||
--- a/drivers/clk/meson/Makefile
|
||||
+++ b/drivers/clk/meson/Makefile
|
||||
@@ -4,7 +4,6 @@
|
||||
obj-$(CONFIG_COMMON_CLK_MESON_AO_CLKC) += meson-aoclk.o
|
||||
obj-$(CONFIG_COMMON_CLK_MESON_DUALDIV) += clk-dualdiv.o
|
||||
obj-$(CONFIG_COMMON_CLK_MESON_EE_CLKC) += meson-eeclk.o
|
||||
-obj-$(CONFIG_COMMON_CLK_MESON_INPUT) += clk-input.o
|
||||
obj-$(CONFIG_COMMON_CLK_MESON_MPLL) += clk-mpll.o
|
||||
obj-$(CONFIG_COMMON_CLK_MESON_PHASE) += clk-phase.o
|
||||
obj-$(CONFIG_COMMON_CLK_MESON_PLL) += clk-pll.o
|
||||
diff --git a/drivers/clk/meson/clk-input.c b/drivers/clk/meson/clk-input.c
|
||||
deleted file mode 100644
|
||||
index 086226e9dba6..000000000000
|
||||
--- a/drivers/clk/meson/clk-input.c
|
||||
+++ /dev/null
|
||||
@@ -1,49 +0,0 @@
|
||||
-// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||
-/*
|
||||
- * Copyright (c) 2018 BayLibre, SAS.
|
||||
- * Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||
- */
|
||||
-
|
||||
-#include <linux/clk.h>
|
||||
-#include <linux/clk-provider.h>
|
||||
-#include <linux/device.h>
|
||||
-#include <linux/module.h>
|
||||
-#include "clk-input.h"
|
||||
-
|
||||
-static const struct clk_ops meson_clk_no_ops = {};
|
||||
-
|
||||
-struct clk_hw *meson_clk_hw_register_input(struct device *dev,
|
||||
- const char *of_name,
|
||||
- const char *clk_name,
|
||||
- unsigned long flags)
|
||||
-{
|
||||
- struct clk *parent_clk = devm_clk_get(dev, of_name);
|
||||
- struct clk_init_data init;
|
||||
- const char *parent_name;
|
||||
- struct clk_hw *hw;
|
||||
- int ret;
|
||||
-
|
||||
- if (IS_ERR(parent_clk))
|
||||
- return (struct clk_hw *)parent_clk;
|
||||
-
|
||||
- hw = devm_kzalloc(dev, sizeof(*hw), GFP_KERNEL);
|
||||
- if (!hw)
|
||||
- return ERR_PTR(-ENOMEM);
|
||||
-
|
||||
- parent_name = __clk_get_name(parent_clk);
|
||||
- init.name = clk_name;
|
||||
- init.ops = &meson_clk_no_ops;
|
||||
- init.flags = flags;
|
||||
- init.parent_names = &parent_name;
|
||||
- init.num_parents = 1;
|
||||
- hw->init = &init;
|
||||
-
|
||||
- ret = devm_clk_hw_register(dev, hw);
|
||||
-
|
||||
- return ret ? ERR_PTR(ret) : hw;
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(meson_clk_hw_register_input);
|
||||
-
|
||||
-MODULE_DESCRIPTION("Amlogic clock input helper");
|
||||
-MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
|
||||
-MODULE_LICENSE("GPL v2");
|
||||
diff --git a/drivers/clk/meson/clk-input.h b/drivers/clk/meson/clk-input.h
|
||||
deleted file mode 100644
|
||||
index 4a541b9685a6..000000000000
|
||||
--- a/drivers/clk/meson/clk-input.h
|
||||
+++ /dev/null
|
||||
@@ -1,19 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/*
|
||||
- * Copyright (c) 2019 BayLibre, SAS.
|
||||
- * Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||
- */
|
||||
-
|
||||
-#ifndef __MESON_CLK_INPUT_H
|
||||
-#define __MESON_CLK_INPUT_H
|
||||
-
|
||||
-#include <linux/clk-provider.h>
|
||||
-
|
||||
-struct device;
|
||||
-
|
||||
-struct clk_hw *meson_clk_hw_register_input(struct device *dev,
|
||||
- const char *of_name,
|
||||
- const char *clk_name,
|
||||
- unsigned long flags);
|
||||
-
|
||||
-#endif /* __MESON_CLK_INPUT_H */
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,163 @@
|
||||
From 659dbb6904d527ac9a6eebddb849e40f5753edc7 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Thu, 13 Feb 2020 16:51:53 +0100
|
||||
Subject: [PATCH 015/146] FROMGIT: ASoC: meson: aiu: add audio output
|
||||
dt-bindings
|
||||
|
||||
Add the dt-bindings and documentation of the AIU audio controller.
|
||||
This component provides most of the audio outputs found on the Amlogic
|
||||
Gx SoC family.
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
.../bindings/sound/amlogic,aiu.yaml | 111 ++++++++++++++++++
|
||||
include/dt-bindings/sound/meson-aiu.h | 18 +++
|
||||
2 files changed, 129 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,aiu.yaml
|
||||
create mode 100644 include/dt-bindings/sound/meson-aiu.h
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,aiu.yaml b/Documentation/devicetree/bindings/sound/amlogic,aiu.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..3ef7632dcb59
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,aiu.yaml
|
||||
@@ -0,0 +1,111 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,aiu.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic AIU audio output controller
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ $nodename:
|
||||
+ pattern: "^audio-controller@.*"
|
||||
+
|
||||
+ "#sound-dai-cells":
|
||||
+ const: 2
|
||||
+
|
||||
+ compatible:
|
||||
+ items:
|
||||
+ - enum:
|
||||
+ - amlogic,aiu-gxbb
|
||||
+ - amlogic,aiu-gxl
|
||||
+ - const:
|
||||
+ amlogic,aiu
|
||||
+
|
||||
+ clocks:
|
||||
+ items:
|
||||
+ - description: AIU peripheral clock
|
||||
+ - description: I2S peripheral clock
|
||||
+ - description: I2S output clock
|
||||
+ - description: I2S master clock
|
||||
+ - description: I2S mixer clock
|
||||
+ - description: SPDIF peripheral clock
|
||||
+ - description: SPDIF output clock
|
||||
+ - description: SPDIF master clock
|
||||
+ - description: SPDIF master clock multiplexer
|
||||
+
|
||||
+ clock-names:
|
||||
+ items:
|
||||
+ - const: pclk
|
||||
+ - const: i2s_pclk
|
||||
+ - const: i2s_aoclk
|
||||
+ - const: i2s_mclk
|
||||
+ - const: i2s_mixer
|
||||
+ - const: spdif_pclk
|
||||
+ - const: spdif_aoclk
|
||||
+ - const: spdif_mclk
|
||||
+ - const: spdif_mclk_sel
|
||||
+
|
||||
+ interrupts:
|
||||
+ items:
|
||||
+ - description: I2S interrupt line
|
||||
+ - description: SPDIF interrupt line
|
||||
+
|
||||
+ interrupt-names:
|
||||
+ items:
|
||||
+ - const: i2s
|
||||
+ - const: spdif
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ resets:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+required:
|
||||
+ - "#sound-dai-cells"
|
||||
+ - compatible
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+ - interrupts
|
||||
+ - interrupt-names
|
||||
+ - reg
|
||||
+ - resets
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/clock/gxbb-clkc.h>
|
||||
+ #include <dt-bindings/interrupt-controller/irq.h>
|
||||
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+ #include <dt-bindings/reset/amlogic,meson-gxbb-reset.h>
|
||||
+
|
||||
+ aiu: audio-controller@5400 {
|
||||
+ compatible = "amlogic,aiu-gxl", "amlogic,aiu";
|
||||
+ #sound-dai-cells = <2>;
|
||||
+ reg = <0x0 0x5400 0x0 0x2ac>;
|
||||
+ interrupts = <GIC_SPI 48 IRQ_TYPE_EDGE_RISING>,
|
||||
+ <GIC_SPI 50 IRQ_TYPE_EDGE_RISING>;
|
||||
+ interrupt-names = "i2s", "spdif";
|
||||
+ clocks = <&clkc CLKID_AIU_GLUE>,
|
||||
+ <&clkc CLKID_I2S_OUT>,
|
||||
+ <&clkc CLKID_AOCLK_GATE>,
|
||||
+ <&clkc CLKID_CTS_AMCLK>,
|
||||
+ <&clkc CLKID_MIXER_IFACE>,
|
||||
+ <&clkc CLKID_IEC958>,
|
||||
+ <&clkc CLKID_IEC958_GATE>,
|
||||
+ <&clkc CLKID_CTS_MCLK_I958>,
|
||||
+ <&clkc CLKID_CTS_I958>;
|
||||
+ clock-names = "pclk",
|
||||
+ "i2s_pclk",
|
||||
+ "i2s_aoclk",
|
||||
+ "i2s_mclk",
|
||||
+ "i2s_mixer",
|
||||
+ "spdif_pclk",
|
||||
+ "spdif_aoclk",
|
||||
+ "spdif_mclk",
|
||||
+ "spdif_mclk_sel";
|
||||
+ resets = <&reset RESET_AIU>;
|
||||
+ };
|
||||
+
|
||||
diff --git a/include/dt-bindings/sound/meson-aiu.h b/include/dt-bindings/sound/meson-aiu.h
|
||||
new file mode 100644
|
||||
index 000000000000..1051b8af298b
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/sound/meson-aiu.h
|
||||
@@ -0,0 +1,18 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 */
|
||||
+#ifndef __DT_MESON_AIU_H
|
||||
+#define __DT_MESON_AIU_H
|
||||
+
|
||||
+#define AIU_CPU 0
|
||||
+#define AIU_HDMI 1
|
||||
+#define AIU_ACODEC 2
|
||||
+
|
||||
+#define CPU_I2S_FIFO 0
|
||||
+#define CPU_SPDIF_FIFO 1
|
||||
+#define CPU_I2S_ENCODER 2
|
||||
+#define CPU_SPDIF_ENCODER 3
|
||||
+
|
||||
+#define CTRL_I2S 0
|
||||
+#define CTRL_PCM 1
|
||||
+#define CTRL_OUT 2
|
||||
+
|
||||
+#endif /* __DT_MESON_AIU_H */
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,56 +0,0 @@
|
||||
From a5eb5e115cf48475f0b68422cbcbe9bac00d470f Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Wed, 31 Jul 2019 10:40:16 +0200
|
||||
Subject: [PATCH 015/187] FROMGIT: clk: core: introduce clk_hw_set_parent()
|
||||
|
||||
Introduce the clk_hw_set_parent() provider call to change parent of
|
||||
a clock by using the clk_hw pointers.
|
||||
|
||||
This eases the clock reparenting from clock rate notifiers and
|
||||
implementing DVFS with simpler code avoiding the boilerplates
|
||||
functions as __clk_lookup(clk_hw_get_name()) then clk_set_parent().
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Acked-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Acked-by: Stephen Boyd <sboyd@kernel.org>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit 3567894b6914813299300019e028874927210880
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/clk.c | 6 ++++++
|
||||
include/linux/clk-provider.h | 1 +
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
|
||||
index 1c46babeb093..ca99e9db6575 100644
|
||||
--- a/drivers/clk/clk.c
|
||||
+++ b/drivers/clk/clk.c
|
||||
@@ -2510,6 +2510,12 @@ static int clk_core_set_parent_nolock(struct clk_core *core,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+int clk_hw_set_parent(struct clk_hw *hw, struct clk_hw *parent)
|
||||
+{
|
||||
+ return clk_core_set_parent_nolock(hw->core, parent->core);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(clk_hw_set_parent);
|
||||
+
|
||||
/**
|
||||
* clk_set_parent - switch the parent of a mux clk
|
||||
* @clk: the mux clk whose input we are switching
|
||||
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
|
||||
index 2ae7604783dd..dce5521a9bf6 100644
|
||||
--- a/include/linux/clk-provider.h
|
||||
+++ b/include/linux/clk-provider.h
|
||||
@@ -817,6 +817,7 @@ unsigned int clk_hw_get_num_parents(const struct clk_hw *hw);
|
||||
struct clk_hw *clk_hw_get_parent(const struct clk_hw *hw);
|
||||
struct clk_hw *clk_hw_get_parent_by_index(const struct clk_hw *hw,
|
||||
unsigned int index);
|
||||
+int clk_hw_set_parent(struct clk_hw *hw, struct clk_hw *new_parent);
|
||||
unsigned int __clk_get_enable_count(struct clk *clk);
|
||||
unsigned long clk_hw_get_rate(const struct clk_hw *hw);
|
||||
unsigned long __clk_get_flags(struct clk *clk);
|
||||
--
|
||||
2.17.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,170 +0,0 @@
|
||||
From 4cd3b8d3e92cadcddcd4e2fb0d14b8f4b04eb176 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Wed, 31 Jul 2019 10:40:17 +0200
|
||||
Subject: [PATCH 016/187] FROMGIT: clk: meson: add g12a cpu dynamic divider
|
||||
driver
|
||||
|
||||
Add a clock driver for the cpu dynamic divider, this divider needs
|
||||
to have a flag set before setting the divider value then removed
|
||||
while writing the new value to the register.
|
||||
|
||||
This drivers implements this behavior and will be used essentially
|
||||
on the Amlogic G12A and G12B SoCs for cpu clock trees.
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit 26d34431add04a98a60b8935c25765914fa773f7
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
---
|
||||
drivers/clk/meson/Kconfig | 5 ++
|
||||
drivers/clk/meson/Makefile | 1 +
|
||||
drivers/clk/meson/clk-cpu-dyndiv.c | 73 ++++++++++++++++++++++++++++++
|
||||
drivers/clk/meson/clk-cpu-dyndiv.h | 20 ++++++++
|
||||
4 files changed, 99 insertions(+)
|
||||
create mode 100644 drivers/clk/meson/clk-cpu-dyndiv.c
|
||||
create mode 100644 drivers/clk/meson/clk-cpu-dyndiv.h
|
||||
|
||||
diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
|
||||
index 500be0b0d473..dabeb435d067 100644
|
||||
--- a/drivers/clk/meson/Kconfig
|
||||
+++ b/drivers/clk/meson/Kconfig
|
||||
@@ -36,6 +36,10 @@ config COMMON_CLK_MESON_EE_CLKC
|
||||
tristate
|
||||
select COMMON_CLK_MESON_REGMAP
|
||||
|
||||
+config COMMON_CLK_MESON_CPU_DYNDIV
|
||||
+ tristate
|
||||
+ select COMMON_CLK_MESON_REGMAP
|
||||
+
|
||||
config COMMON_CLK_MESON8B
|
||||
bool
|
||||
depends on ARCH_MESON
|
||||
@@ -98,6 +102,7 @@ config COMMON_CLK_G12A
|
||||
select COMMON_CLK_MESON_PLL
|
||||
select COMMON_CLK_MESON_AO_CLKC
|
||||
select COMMON_CLK_MESON_EE_CLKC
|
||||
+ select COMMON_CLK_MESON_CPU_DYNDIV
|
||||
select MFD_SYSCON
|
||||
help
|
||||
Support for the clock controller on Amlogic S905D2, S905X2 and S905Y2
|
||||
diff --git a/drivers/clk/meson/Makefile b/drivers/clk/meson/Makefile
|
||||
index f09d83dc3d60..3939f218587a 100644
|
||||
--- a/drivers/clk/meson/Makefile
|
||||
+++ b/drivers/clk/meson/Makefile
|
||||
@@ -2,6 +2,7 @@
|
||||
# Amlogic clock drivers
|
||||
|
||||
obj-$(CONFIG_COMMON_CLK_MESON_AO_CLKC) += meson-aoclk.o
|
||||
+obj-$(CONFIG_COMMON_CLK_MESON_CPU_DYNDIV) += clk-cpu-dyndiv.o
|
||||
obj-$(CONFIG_COMMON_CLK_MESON_DUALDIV) += clk-dualdiv.o
|
||||
obj-$(CONFIG_COMMON_CLK_MESON_EE_CLKC) += meson-eeclk.o
|
||||
obj-$(CONFIG_COMMON_CLK_MESON_MPLL) += clk-mpll.o
|
||||
diff --git a/drivers/clk/meson/clk-cpu-dyndiv.c b/drivers/clk/meson/clk-cpu-dyndiv.c
|
||||
new file mode 100644
|
||||
index 000000000000..36976927fe82
|
||||
--- /dev/null
|
||||
+++ b/drivers/clk/meson/clk-cpu-dyndiv.c
|
||||
@@ -0,0 +1,73 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2019 BayLibre, SAS.
|
||||
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/clk-provider.h>
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+#include "clk-regmap.h"
|
||||
+#include "clk-cpu-dyndiv.h"
|
||||
+
|
||||
+static inline struct meson_clk_cpu_dyndiv_data *
|
||||
+meson_clk_cpu_dyndiv_data(struct clk_regmap *clk)
|
||||
+{
|
||||
+ return (struct meson_clk_cpu_dyndiv_data *)clk->data;
|
||||
+}
|
||||
+
|
||||
+static unsigned long meson_clk_cpu_dyndiv_recalc_rate(struct clk_hw *hw,
|
||||
+ unsigned long prate)
|
||||
+{
|
||||
+ struct clk_regmap *clk = to_clk_regmap(hw);
|
||||
+ struct meson_clk_cpu_dyndiv_data *data = meson_clk_cpu_dyndiv_data(clk);
|
||||
+
|
||||
+ return divider_recalc_rate(hw, prate,
|
||||
+ meson_parm_read(clk->map, &data->div),
|
||||
+ NULL, 0, data->div.width);
|
||||
+}
|
||||
+
|
||||
+static long meson_clk_cpu_dyndiv_round_rate(struct clk_hw *hw,
|
||||
+ unsigned long rate,
|
||||
+ unsigned long *prate)
|
||||
+{
|
||||
+ struct clk_regmap *clk = to_clk_regmap(hw);
|
||||
+ struct meson_clk_cpu_dyndiv_data *data = meson_clk_cpu_dyndiv_data(clk);
|
||||
+
|
||||
+ return divider_round_rate(hw, rate, prate, NULL, data->div.width, 0);
|
||||
+}
|
||||
+
|
||||
+static int meson_clk_cpu_dyndiv_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
+ unsigned long parent_rate)
|
||||
+{
|
||||
+ struct clk_regmap *clk = to_clk_regmap(hw);
|
||||
+ struct meson_clk_cpu_dyndiv_data *data = meson_clk_cpu_dyndiv_data(clk);
|
||||
+ unsigned int val;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = divider_get_val(rate, parent_rate, NULL, data->div.width, 0);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ val = (unsigned int)ret << data->div.shift;
|
||||
+
|
||||
+ /* Write the SYS_CPU_DYN_ENABLE bit before changing the divider */
|
||||
+ meson_parm_write(clk->map, &data->dyn, 1);
|
||||
+
|
||||
+ /* Update the divider while removing the SYS_CPU_DYN_ENABLE bit */
|
||||
+ return regmap_update_bits(clk->map, data->div.reg_off,
|
||||
+ SETPMASK(data->div.width, data->div.shift) |
|
||||
+ SETPMASK(data->dyn.width, data->dyn.shift),
|
||||
+ val);
|
||||
+};
|
||||
+
|
||||
+const struct clk_ops meson_clk_cpu_dyndiv_ops = {
|
||||
+ .recalc_rate = meson_clk_cpu_dyndiv_recalc_rate,
|
||||
+ .round_rate = meson_clk_cpu_dyndiv_round_rate,
|
||||
+ .set_rate = meson_clk_cpu_dyndiv_set_rate,
|
||||
+};
|
||||
+EXPORT_SYMBOL_GPL(meson_clk_cpu_dyndiv_ops);
|
||||
+
|
||||
+MODULE_DESCRIPTION("Amlogic CPU Dynamic Clock divider");
|
||||
+MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
diff --git a/drivers/clk/meson/clk-cpu-dyndiv.h b/drivers/clk/meson/clk-cpu-dyndiv.h
|
||||
new file mode 100644
|
||||
index 000000000000..f4908404792e
|
||||
--- /dev/null
|
||||
+++ b/drivers/clk/meson/clk-cpu-dyndiv.h
|
||||
@@ -0,0 +1,20 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 */
|
||||
+/*
|
||||
+ * Copyright (c) 2019 BayLibre, SAS.
|
||||
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||
+ */
|
||||
+
|
||||
+#ifndef __MESON_CLK_CPU_DYNDIV_H
|
||||
+#define __MESON_CLK_CPU_DYNDIV_H
|
||||
+
|
||||
+#include <linux/clk-provider.h>
|
||||
+#include "parm.h"
|
||||
+
|
||||
+struct meson_clk_cpu_dyndiv_data {
|
||||
+ struct parm div;
|
||||
+ struct parm dyn;
|
||||
+};
|
||||
+
|
||||
+extern const struct clk_ops meson_clk_cpu_dyndiv_ops;
|
||||
+
|
||||
+#endif /* __MESON_CLK_CPU_DYNDIV_H */
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,281 @@
|
||||
From b31b05925df0a3fd7041e3263f033a4621cd0d55 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Thu, 13 Feb 2020 16:51:55 +0100
|
||||
Subject: [PATCH 017/146] FROMGIT: ASoC: meson: aiu: add hdmi codec control
|
||||
support
|
||||
|
||||
Add the codec to codec component which handles the routing between
|
||||
the audio producers (PCM and I2S) and the synopsys hdmi controller
|
||||
on the amlogic GX SoC family
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/Kconfig | 2 +
|
||||
sound/soc/meson/Makefile | 1 +
|
||||
sound/soc/meson/aiu-codec-ctrl.c | 152 +++++++++++++++++++++++++++++++
|
||||
sound/soc/meson/aiu.c | 34 ++++++-
|
||||
sound/soc/meson/aiu.h | 8 ++
|
||||
5 files changed, 196 insertions(+), 1 deletion(-)
|
||||
create mode 100644 sound/soc/meson/aiu-codec-ctrl.c
|
||||
|
||||
diff --git a/sound/soc/meson/Kconfig b/sound/soc/meson/Kconfig
|
||||
index ca269dedfc7f..19de97ae4ce9 100644
|
||||
--- a/sound/soc/meson/Kconfig
|
||||
+++ b/sound/soc/meson/Kconfig
|
||||
@@ -4,7 +4,9 @@ menu "ASoC support for Amlogic platforms"
|
||||
|
||||
config SND_MESON_AIU
|
||||
tristate "Amlogic AIU"
|
||||
+ select SND_MESON_CODEC_GLUE
|
||||
select SND_PCM_IEC958
|
||||
+ imply SND_SOC_HDMI_CODEC if DRM_MESON_DW_HDMI
|
||||
help
|
||||
Select Y or M to add support for the Audio output subsystem found
|
||||
in the Amlogic GX SoC family
|
||||
diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile
|
||||
index a7b79d717288..3b21f648e322 100644
|
||||
--- a/sound/soc/meson/Makefile
|
||||
+++ b/sound/soc/meson/Makefile
|
||||
@@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||
|
||||
snd-soc-meson-aiu-objs := aiu.o
|
||||
+snd-soc-meson-aiu-objs += aiu-codec-ctrl.o
|
||||
snd-soc-meson-aiu-objs += aiu-encoder-i2s.o
|
||||
snd-soc-meson-aiu-objs += aiu-encoder-spdif.o
|
||||
snd-soc-meson-aiu-objs += aiu-fifo.o
|
||||
diff --git a/sound/soc/meson/aiu-codec-ctrl.c b/sound/soc/meson/aiu-codec-ctrl.c
|
||||
new file mode 100644
|
||||
index 000000000000..8646a953e3b3
|
||||
--- /dev/null
|
||||
+++ b/sound/soc/meson/aiu-codec-ctrl.c
|
||||
@@ -0,0 +1,152 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+//
|
||||
+// Copyright (c) 2020 BayLibre, SAS.
|
||||
+// Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+#include <linux/bitfield.h>
|
||||
+#include <sound/pcm_params.h>
|
||||
+#include <sound/soc.h>
|
||||
+#include <sound/soc-dai.h>
|
||||
+
|
||||
+#include <dt-bindings/sound/meson-aiu.h>
|
||||
+#include "aiu.h"
|
||||
+#include "meson-codec-glue.h"
|
||||
+
|
||||
+#define CTRL_CLK_SEL GENMASK(1, 0)
|
||||
+#define CTRL_DATA_SEL_SHIFT 4
|
||||
+#define CTRL_DATA_SEL (0x3 << CTRL_DATA_SEL_SHIFT)
|
||||
+
|
||||
+static const char * const aiu_codec_ctrl_mux_texts[] = {
|
||||
+ "DISABLED", "PCM", "I2S",
|
||||
+};
|
||||
+
|
||||
+static int aiu_codec_ctrl_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||
+ struct snd_ctl_elem_value *ucontrol)
|
||||
+{
|
||||
+ struct snd_soc_component *component =
|
||||
+ snd_soc_dapm_kcontrol_component(kcontrol);
|
||||
+ struct snd_soc_dapm_context *dapm =
|
||||
+ snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||
+ struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||
+ unsigned int mux, changed;
|
||||
+
|
||||
+ mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
|
||||
+ changed = snd_soc_component_test_bits(component, e->reg,
|
||||
+ CTRL_DATA_SEL,
|
||||
+ FIELD_PREP(CTRL_DATA_SEL, mux));
|
||||
+
|
||||
+ if (!changed)
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Force disconnect of the mux while updating */
|
||||
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||
+
|
||||
+ /* Reset the source first */
|
||||
+ snd_soc_component_update_bits(component, e->reg,
|
||||
+ CTRL_CLK_SEL |
|
||||
+ CTRL_DATA_SEL,
|
||||
+ FIELD_PREP(CTRL_CLK_SEL, 0) |
|
||||
+ FIELD_PREP(CTRL_DATA_SEL, 0));
|
||||
+
|
||||
+ /* Set the appropriate source */
|
||||
+ snd_soc_component_update_bits(component, e->reg,
|
||||
+ CTRL_CLK_SEL |
|
||||
+ CTRL_DATA_SEL,
|
||||
+ FIELD_PREP(CTRL_CLK_SEL, mux) |
|
||||
+ FIELD_PREP(CTRL_DATA_SEL, mux));
|
||||
+
|
||||
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static SOC_ENUM_SINGLE_DECL(aiu_hdmi_ctrl_mux_enum, AIU_HDMI_CLK_DATA_CTRL,
|
||||
+ CTRL_DATA_SEL_SHIFT,
|
||||
+ aiu_codec_ctrl_mux_texts);
|
||||
+
|
||||
+static const struct snd_kcontrol_new aiu_hdmi_ctrl_mux =
|
||||
+ SOC_DAPM_ENUM_EXT("HDMI Source", aiu_hdmi_ctrl_mux_enum,
|
||||
+ snd_soc_dapm_get_enum_double,
|
||||
+ aiu_codec_ctrl_mux_put_enum);
|
||||
+
|
||||
+static const struct snd_soc_dapm_widget aiu_hdmi_ctrl_widgets[] = {
|
||||
+ SND_SOC_DAPM_MUX("HDMI CTRL SRC", SND_SOC_NOPM, 0, 0,
|
||||
+ &aiu_hdmi_ctrl_mux),
|
||||
+};
|
||||
+
|
||||
+static const struct snd_soc_dai_ops aiu_codec_ctrl_input_ops = {
|
||||
+ .hw_params = meson_codec_glue_input_hw_params,
|
||||
+ .set_fmt = meson_codec_glue_input_set_fmt,
|
||||
+};
|
||||
+
|
||||
+static const struct snd_soc_dai_ops aiu_codec_ctrl_output_ops = {
|
||||
+ .startup = meson_codec_glue_output_startup,
|
||||
+};
|
||||
+
|
||||
+#define AIU_CODEC_CTRL_FORMATS \
|
||||
+ (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
|
||||
+ SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE | \
|
||||
+ SNDRV_PCM_FMTBIT_S32_LE)
|
||||
+
|
||||
+#define AIU_CODEC_CTRL_STREAM(xname, xsuffix) \
|
||||
+{ \
|
||||
+ .stream_name = xname " " xsuffix, \
|
||||
+ .channels_min = 1, \
|
||||
+ .channels_max = 8, \
|
||||
+ .rate_min = 5512, \
|
||||
+ .rate_max = 192000, \
|
||||
+ .formats = AIU_CODEC_CTRL_FORMATS, \
|
||||
+}
|
||||
+
|
||||
+#define AIU_CODEC_CTRL_INPUT(xname) { \
|
||||
+ .name = "CODEC CTRL " xname, \
|
||||
+ .playback = AIU_CODEC_CTRL_STREAM(xname, "Playback"), \
|
||||
+ .ops = &aiu_codec_ctrl_input_ops, \
|
||||
+ .probe = meson_codec_glue_input_dai_probe, \
|
||||
+ .remove = meson_codec_glue_input_dai_remove, \
|
||||
+}
|
||||
+
|
||||
+#define AIU_CODEC_CTRL_OUTPUT(xname) { \
|
||||
+ .name = "CODEC CTRL " xname, \
|
||||
+ .capture = AIU_CODEC_CTRL_STREAM(xname, "Capture"), \
|
||||
+ .ops = &aiu_codec_ctrl_output_ops, \
|
||||
+}
|
||||
+
|
||||
+static struct snd_soc_dai_driver aiu_hdmi_ctrl_dai_drv[] = {
|
||||
+ [CTRL_I2S] = AIU_CODEC_CTRL_INPUT("HDMI I2S IN"),
|
||||
+ [CTRL_PCM] = AIU_CODEC_CTRL_INPUT("HDMI PCM IN"),
|
||||
+ [CTRL_OUT] = AIU_CODEC_CTRL_OUTPUT("HDMI OUT"),
|
||||
+};
|
||||
+
|
||||
+static const struct snd_soc_dapm_route aiu_hdmi_ctrl_routes[] = {
|
||||
+ { "HDMI CTRL SRC", "I2S", "HDMI I2S IN Playback" },
|
||||
+ { "HDMI CTRL SRC", "PCM", "HDMI PCM IN Playback" },
|
||||
+ { "HDMI OUT Capture", NULL, "HDMI CTRL SRC" },
|
||||
+};
|
||||
+
|
||||
+static int aiu_hdmi_of_xlate_dai_name(struct snd_soc_component *component,
|
||||
+ struct of_phandle_args *args,
|
||||
+ const char **dai_name)
|
||||
+{
|
||||
+ return aiu_of_xlate_dai_name(component, args, dai_name, AIU_HDMI);
|
||||
+}
|
||||
+
|
||||
+static const struct snd_soc_component_driver aiu_hdmi_ctrl_component = {
|
||||
+ .name = "AIU HDMI Codec Control",
|
||||
+ .dapm_widgets = aiu_hdmi_ctrl_widgets,
|
||||
+ .num_dapm_widgets = ARRAY_SIZE(aiu_hdmi_ctrl_widgets),
|
||||
+ .dapm_routes = aiu_hdmi_ctrl_routes,
|
||||
+ .num_dapm_routes = ARRAY_SIZE(aiu_hdmi_ctrl_routes),
|
||||
+ .of_xlate_dai_name = aiu_hdmi_of_xlate_dai_name,
|
||||
+ .endianness = 1,
|
||||
+ .non_legacy_dai_naming = 1,
|
||||
+};
|
||||
+
|
||||
+int aiu_hdmi_ctrl_register_component(struct device *dev)
|
||||
+{
|
||||
+ return aiu_add_component(dev, &aiu_hdmi_ctrl_component,
|
||||
+ aiu_hdmi_ctrl_dai_drv,
|
||||
+ ARRAY_SIZE(aiu_hdmi_ctrl_dai_drv),
|
||||
+ "hdmi");
|
||||
+}
|
||||
+
|
||||
diff --git a/sound/soc/meson/aiu.c b/sound/soc/meson/aiu.c
|
||||
index a62aced9b687..b765dfb70726 100644
|
||||
--- a/sound/soc/meson/aiu.c
|
||||
+++ b/sound/soc/meson/aiu.c
|
||||
@@ -71,6 +71,26 @@ int aiu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int aiu_add_component(struct device *dev,
|
||||
+ const struct snd_soc_component_driver *component_driver,
|
||||
+ struct snd_soc_dai_driver *dai_drv,
|
||||
+ int num_dai,
|
||||
+ const char *debugfs_prefix)
|
||||
+{
|
||||
+ struct snd_soc_component *component;
|
||||
+
|
||||
+ component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL);
|
||||
+ if (!component)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+#ifdef CONFIG_DEBUG_FS
|
||||
+ component->debugfs_prefix = debugfs_prefix;
|
||||
+#endif
|
||||
+
|
||||
+ return snd_soc_add_component(dev, component, component_driver,
|
||||
+ dai_drv, num_dai);
|
||||
+}
|
||||
+
|
||||
static int aiu_cpu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||
struct of_phandle_args *args,
|
||||
const char **dai_name)
|
||||
@@ -313,9 +333,21 @@ static int aiu_probe(struct platform_device *pdev)
|
||||
ret = snd_soc_register_component(dev, &aiu_cpu_component,
|
||||
aiu_cpu_dai_drv,
|
||||
ARRAY_SIZE(aiu_cpu_dai_drv));
|
||||
- if (ret)
|
||||
+ if (ret) {
|
||||
dev_err(dev, "Failed to register cpu component\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
|
||||
+ /* Register the hdmi codec control component */
|
||||
+ ret = aiu_hdmi_ctrl_register_component(dev);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "Failed to register hdmi control component\n");
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+err:
|
||||
+ snd_soc_unregister_component(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
diff --git a/sound/soc/meson/aiu.h b/sound/soc/meson/aiu.h
|
||||
index a3488027b9d5..9242ab1ab64b 100644
|
||||
--- a/sound/soc/meson/aiu.h
|
||||
+++ b/sound/soc/meson/aiu.h
|
||||
@@ -45,6 +45,14 @@ int aiu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||
const char **dai_name,
|
||||
unsigned int component_id);
|
||||
|
||||
+int aiu_add_component(struct device *dev,
|
||||
+ const struct snd_soc_component_driver *component_driver,
|
||||
+ struct snd_soc_dai_driver *dai_drv,
|
||||
+ int num_dai,
|
||||
+ const char *debugfs_prefix);
|
||||
+
|
||||
+int aiu_hdmi_ctrl_register_component(struct device *dev);
|
||||
+
|
||||
int aiu_fifo_i2s_dai_probe(struct snd_soc_dai *dai);
|
||||
int aiu_fifo_spdif_dai_probe(struct snd_soc_dai *dai);
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,872 +0,0 @@
|
||||
From 077c45ac06c1258147bdee852a5efbe57eaea493 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Wed, 31 Jul 2019 10:40:18 +0200
|
||||
Subject: [PATCH 017/187] FROMGIT: clk: meson: g12a: add notifiers to handle
|
||||
cpu clock change
|
||||
|
||||
In order to implement clock switching for the CLKID_CPU_CLK and
|
||||
CLKID_CPUB_CLK, notifiers are added on specific points of the
|
||||
clock tree :
|
||||
|
||||
cpu_clk / cpub_clk
|
||||
| \- cpu_clk_dyn
|
||||
| | \- cpu_clk_premux0
|
||||
| | |- cpu_clk_postmux0
|
||||
| | | |- cpu_clk_dyn0_div
|
||||
| | | \- xtal/fclk_div2/fclk_div3
|
||||
| | \- xtal/fclk_div2/fclk_div3
|
||||
| \- cpu_clk_premux1
|
||||
| |- cpu_clk_postmux1
|
||||
| | |- cpu_clk_dyn1_div
|
||||
| | \- xtal/fclk_div2/fclk_div3
|
||||
| \- xtal/fclk_div2/fclk_div3
|
||||
\ sys_pll / sys1_pll
|
||||
|
||||
This for each cluster, a single one for G12A, two for G12B.
|
||||
|
||||
Each cpu_clk_premux1 tree is marked as read-only and CLK_SET_RATE_NO_REPARENT,
|
||||
to be used as "parking" clock in a safe clock frequency.
|
||||
|
||||
A notifier is added on each cpu_clk_premux0 to detech when CCF want to
|
||||
change the frequency of the cpu_clk_dyn tree.
|
||||
In this notifier, the cpu_clk_premux1 tree is configured to use the xtal
|
||||
clock and then the cpu_clk_dyn is switch to cpu_clk_premux1 while CCF
|
||||
updates the cpu_clk_premux0 tree.
|
||||
|
||||
A notifier is added on each sys_pll/sys1_pll to detect when CCF wants to
|
||||
change the PLL clock source of the cpu_clk.
|
||||
In this notifier, the cpu_clk is switched to cpu_clk_dyn while CCF
|
||||
updates the sys_pll/sys1_pll frequency.
|
||||
|
||||
A third small notifier is added on each cpu_clk / cpub_clk and cpu_clk_dyn,
|
||||
add a small delay at PRE_RATE_CHANGE/POST_RATE_CHANGE to let the other
|
||||
notofiers change propagate before changing the cpu_clk_premux0 and sys_pll
|
||||
clock trees.
|
||||
|
||||
This notifier set permits switching the cpu_clk / cpub_clk without any
|
||||
glitches and using a safe parking clock while switching between sub-GHz
|
||||
clocks using the cpu_clk_dyn tree.
|
||||
|
||||
This setup has been tested and validated on the Amlogic G12A and G12B
|
||||
SoCs running the arm64 cpuburn at [1] and cycling between all the possible
|
||||
cpufreq translations of each cluster and checking the final frequency using
|
||||
the clock-measurer, script at [2].
|
||||
|
||||
[1] https://github.com/ssvb/cpuburn-arm/blob/master/cpuburn-a53.S
|
||||
[2] https://gist.github.com/superna9999/d4de964dbc0f84b7d527e1df2ddea25f
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit ffae8475b90c045ca508675794c08a0c8c12d202
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
---
|
||||
drivers/clk/meson/g12a.c | 535 +++++++++++++++++++++++++++++++++++----
|
||||
1 file changed, 481 insertions(+), 54 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c
|
||||
index a8f706de811b..c3f0ffc3280d 100644
|
||||
--- a/drivers/clk/meson/g12a.c
|
||||
+++ b/drivers/clk/meson/g12a.c
|
||||
@@ -14,10 +14,12 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/clk.h>
|
||||
|
||||
#include "clk-mpll.h"
|
||||
#include "clk-pll.h"
|
||||
#include "clk-regmap.h"
|
||||
+#include "clk-cpu-dyndiv.h"
|
||||
#include "vid-pll-div.h"
|
||||
#include "meson-eeclk.h"
|
||||
#include "g12a.h"
|
||||
@@ -88,16 +90,9 @@ static struct clk_regmap g12a_fixed_pll = {
|
||||
},
|
||||
};
|
||||
|
||||
-/*
|
||||
- * Internal sys pll emulation configuration parameters
|
||||
- */
|
||||
-static const struct reg_sequence g12a_sys_init_regs[] = {
|
||||
- { .reg = HHI_SYS_PLL_CNTL1, .def = 0x00000000 },
|
||||
- { .reg = HHI_SYS_PLL_CNTL2, .def = 0x00000000 },
|
||||
- { .reg = HHI_SYS_PLL_CNTL3, .def = 0x48681c00 },
|
||||
- { .reg = HHI_SYS_PLL_CNTL4, .def = 0x88770290 },
|
||||
- { .reg = HHI_SYS_PLL_CNTL5, .def = 0x39272000 },
|
||||
- { .reg = HHI_SYS_PLL_CNTL6, .def = 0x56540000 },
|
||||
+static const struct pll_mult_range g12a_sys_pll_mult_range = {
|
||||
+ .min = 128,
|
||||
+ .max = 250,
|
||||
};
|
||||
|
||||
static struct clk_regmap g12a_sys_pll_dco = {
|
||||
@@ -127,16 +122,17 @@ static struct clk_regmap g12a_sys_pll_dco = {
|
||||
.shift = 29,
|
||||
.width = 1,
|
||||
},
|
||||
- .init_regs = g12a_sys_init_regs,
|
||||
- .init_count = ARRAY_SIZE(g12a_sys_init_regs),
|
||||
+ .range = &g12a_sys_pll_mult_range,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "sys_pll_dco",
|
||||
- .ops = &meson_clk_pll_ro_ops,
|
||||
+ .ops = &meson_clk_pll_ops,
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.fw_name = "xtal",
|
||||
},
|
||||
.num_parents = 1,
|
||||
+ /* This clock feeds the CPU, avoid disabling it */
|
||||
+ .flags = CLK_IS_CRITICAL,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -149,11 +145,12 @@ static struct clk_regmap g12a_sys_pll = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "sys_pll",
|
||||
- .ops = &clk_regmap_divider_ro_ops,
|
||||
+ .ops = &clk_regmap_divider_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12a_sys_pll_dco.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -184,14 +181,17 @@ static struct clk_regmap g12b_sys1_pll_dco = {
|
||||
.shift = 29,
|
||||
.width = 1,
|
||||
},
|
||||
+ .range = &g12a_sys_pll_mult_range,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "sys1_pll_dco",
|
||||
- .ops = &meson_clk_pll_ro_ops,
|
||||
+ .ops = &meson_clk_pll_ops,
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.fw_name = "xtal",
|
||||
},
|
||||
.num_parents = 1,
|
||||
+ /* This clock feeds the CPU, avoid disabling it */
|
||||
+ .flags = CLK_IS_CRITICAL,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -204,11 +204,12 @@ static struct clk_regmap g12b_sys1_pll = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "sys1_pll",
|
||||
- .ops = &clk_regmap_divider_ro_ops,
|
||||
+ .ops = &clk_regmap_divider_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12b_sys1_pll_dco.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -345,13 +346,15 @@ static struct clk_regmap g12a_cpu_clk_premux0 = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk_dyn0_sel",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_data = (const struct clk_parent_data []) {
|
||||
{ .fw_name = "xtal", },
|
||||
{ .hw = &g12a_fclk_div2.hw },
|
||||
{ .hw = &g12a_fclk_div3.hw },
|
||||
},
|
||||
.num_parents = 3,
|
||||
+ /* This sub-tree is used a parking clock */
|
||||
+ .flags = CLK_SET_RATE_NO_REPARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -364,30 +367,40 @@ static struct clk_regmap g12a_cpu_clk_premux1 = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk_dyn1_sel",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_data = (const struct clk_parent_data []) {
|
||||
{ .fw_name = "xtal", },
|
||||
{ .hw = &g12a_fclk_div2.hw },
|
||||
{ .hw = &g12a_fclk_div3.hw },
|
||||
},
|
||||
.num_parents = 3,
|
||||
+ /* This sub-tree is used a parking clock */
|
||||
+ .flags = CLK_SET_RATE_NO_REPARENT
|
||||
},
|
||||
};
|
||||
|
||||
/* Datasheet names this field as "mux0_divn_tcnt" */
|
||||
static struct clk_regmap g12a_cpu_clk_mux0_div = {
|
||||
- .data = &(struct clk_regmap_div_data){
|
||||
- .offset = HHI_SYS_CPU_CLK_CNTL0,
|
||||
- .shift = 4,
|
||||
- .width = 6,
|
||||
+ .data = &(struct meson_clk_cpu_dyndiv_data){
|
||||
+ .div = {
|
||||
+ .reg_off = HHI_SYS_CPU_CLK_CNTL0,
|
||||
+ .shift = 4,
|
||||
+ .width = 6,
|
||||
+ },
|
||||
+ .dyn = {
|
||||
+ .reg_off = HHI_SYS_CPU_CLK_CNTL0,
|
||||
+ .shift = 26,
|
||||
+ .width = 1,
|
||||
+ },
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk_dyn0_div",
|
||||
- .ops = &clk_regmap_divider_ro_ops,
|
||||
+ .ops = &meson_clk_cpu_dyndiv_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12a_cpu_clk_premux0.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -400,12 +413,13 @@ static struct clk_regmap g12a_cpu_clk_postmux0 = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk_dyn0",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12a_cpu_clk_premux0.hw,
|
||||
&g12a_cpu_clk_mux0_div.hw,
|
||||
},
|
||||
.num_parents = 2,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -435,12 +449,14 @@ static struct clk_regmap g12a_cpu_clk_postmux1 = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk_dyn1",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12a_cpu_clk_premux1.hw,
|
||||
&g12a_cpu_clk_mux1_div.hw,
|
||||
},
|
||||
.num_parents = 2,
|
||||
+ /* This sub-tree is used a parking clock */
|
||||
+ .flags = CLK_SET_RATE_NO_REPARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -453,12 +469,13 @@ static struct clk_regmap g12a_cpu_clk_dyn = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk_dyn",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12a_cpu_clk_postmux0.hw,
|
||||
&g12a_cpu_clk_postmux1.hw,
|
||||
},
|
||||
.num_parents = 2,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -471,12 +488,13 @@ static struct clk_regmap g12a_cpu_clk = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12a_cpu_clk_dyn.hw,
|
||||
&g12a_sys_pll.hw,
|
||||
},
|
||||
.num_parents = 2,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -489,12 +507,13 @@ static struct clk_regmap g12b_cpu_clk = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12a_cpu_clk_dyn.hw,
|
||||
&g12b_sys1_pll.hw
|
||||
},
|
||||
.num_parents = 2,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -507,7 +526,7 @@ static struct clk_regmap g12b_cpub_clk_premux0 = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpub_clk_dyn0_sel",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_data = (const struct clk_parent_data []) {
|
||||
{ .fw_name = "xtal", },
|
||||
{ .hw = &g12a_fclk_div2.hw },
|
||||
@@ -519,18 +538,26 @@ static struct clk_regmap g12b_cpub_clk_premux0 = {
|
||||
|
||||
/* Datasheet names this field as "mux0_divn_tcnt" */
|
||||
static struct clk_regmap g12b_cpub_clk_mux0_div = {
|
||||
- .data = &(struct clk_regmap_div_data){
|
||||
- .offset = HHI_SYS_CPUB_CLK_CNTL,
|
||||
- .shift = 4,
|
||||
- .width = 6,
|
||||
+ .data = &(struct meson_clk_cpu_dyndiv_data){
|
||||
+ .div = {
|
||||
+ .reg_off = HHI_SYS_CPUB_CLK_CNTL,
|
||||
+ .shift = 4,
|
||||
+ .width = 6,
|
||||
+ },
|
||||
+ .dyn = {
|
||||
+ .reg_off = HHI_SYS_CPUB_CLK_CNTL,
|
||||
+ .shift = 26,
|
||||
+ .width = 1,
|
||||
+ },
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpub_clk_dyn0_div",
|
||||
- .ops = &clk_regmap_divider_ro_ops,
|
||||
+ .ops = &meson_clk_cpu_dyndiv_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12b_cpub_clk_premux0.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -543,12 +570,13 @@ static struct clk_regmap g12b_cpub_clk_postmux0 = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpub_clk_dyn0",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12b_cpub_clk_premux0.hw,
|
||||
&g12b_cpub_clk_mux0_div.hw
|
||||
},
|
||||
.num_parents = 2,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -561,13 +589,15 @@ static struct clk_regmap g12b_cpub_clk_premux1 = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpub_clk_dyn1_sel",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_data = (const struct clk_parent_data []) {
|
||||
{ .fw_name = "xtal", },
|
||||
{ .hw = &g12a_fclk_div2.hw },
|
||||
{ .hw = &g12a_fclk_div3.hw },
|
||||
},
|
||||
.num_parents = 3,
|
||||
+ /* This sub-tree is used a parking clock */
|
||||
+ .flags = CLK_SET_RATE_NO_REPARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -597,12 +627,14 @@ static struct clk_regmap g12b_cpub_clk_postmux1 = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpub_clk_dyn1",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12b_cpub_clk_premux1.hw,
|
||||
&g12b_cpub_clk_mux1_div.hw
|
||||
},
|
||||
.num_parents = 2,
|
||||
+ /* This sub-tree is used a parking clock */
|
||||
+ .flags = CLK_SET_RATE_NO_REPARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -615,12 +647,13 @@ static struct clk_regmap g12b_cpub_clk_dyn = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpub_clk_dyn",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12b_cpub_clk_postmux0.hw,
|
||||
&g12b_cpub_clk_postmux1.hw
|
||||
},
|
||||
.num_parents = 2,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -633,15 +666,227 @@ static struct clk_regmap g12b_cpub_clk = {
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpub_clk",
|
||||
- .ops = &clk_regmap_mux_ro_ops,
|
||||
+ .ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12b_cpub_clk_dyn.hw,
|
||||
&g12a_sys_pll.hw
|
||||
},
|
||||
.num_parents = 2,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
+static int g12a_cpu_clk_mux_notifier_cb(struct notifier_block *nb,
|
||||
+ unsigned long event, void *data)
|
||||
+{
|
||||
+ if (event == POST_RATE_CHANGE || event == PRE_RATE_CHANGE) {
|
||||
+ /* Wait for clock propagation before/after changing the mux */
|
||||
+ udelay(100);
|
||||
+ return NOTIFY_OK;
|
||||
+ }
|
||||
+
|
||||
+ return NOTIFY_DONE;
|
||||
+}
|
||||
+
|
||||
+static struct notifier_block g12a_cpu_clk_mux_nb = {
|
||||
+ .notifier_call = g12a_cpu_clk_mux_notifier_cb,
|
||||
+};
|
||||
+
|
||||
+struct g12a_cpu_clk_postmux_nb_data {
|
||||
+ struct notifier_block nb;
|
||||
+ struct clk_hw *xtal;
|
||||
+ struct clk_hw *cpu_clk_dyn;
|
||||
+ struct clk_hw *cpu_clk_postmux0;
|
||||
+ struct clk_hw *cpu_clk_postmux1;
|
||||
+ struct clk_hw *cpu_clk_premux1;
|
||||
+};
|
||||
+
|
||||
+static int g12a_cpu_clk_postmux_notifier_cb(struct notifier_block *nb,
|
||||
+ unsigned long event, void *data)
|
||||
+{
|
||||
+ struct g12a_cpu_clk_postmux_nb_data *nb_data =
|
||||
+ container_of(nb, struct g12a_cpu_clk_postmux_nb_data, nb);
|
||||
+
|
||||
+ switch (event) {
|
||||
+ case PRE_RATE_CHANGE:
|
||||
+ /*
|
||||
+ * This notifier means cpu_clk_postmux0 clock will be changed
|
||||
+ * to feed cpu_clk, this is the current path :
|
||||
+ * cpu_clk
|
||||
+ * \- cpu_clk_dyn
|
||||
+ * \- cpu_clk_postmux0
|
||||
+ * \- cpu_clk_muxX_div
|
||||
+ * \- cpu_clk_premux0
|
||||
+ * \- fclk_div3 or fclk_div2
|
||||
+ * OR
|
||||
+ * \- cpu_clk_premux0
|
||||
+ * \- fclk_div3 or fclk_div2
|
||||
+ */
|
||||
+
|
||||
+ /* Setup cpu_clk_premux1 to xtal */
|
||||
+ clk_hw_set_parent(nb_data->cpu_clk_premux1,
|
||||
+ nb_data->xtal);
|
||||
+
|
||||
+ /* Setup cpu_clk_postmux1 to bypass divider */
|
||||
+ clk_hw_set_parent(nb_data->cpu_clk_postmux1,
|
||||
+ nb_data->cpu_clk_premux1);
|
||||
+
|
||||
+ /* Switch to parking clk on cpu_clk_postmux1 */
|
||||
+ clk_hw_set_parent(nb_data->cpu_clk_dyn,
|
||||
+ nb_data->cpu_clk_postmux1);
|
||||
+
|
||||
+ /*
|
||||
+ * Now, cpu_clk is 24MHz in the current path :
|
||||
+ * cpu_clk
|
||||
+ * \- cpu_clk_dyn
|
||||
+ * \- cpu_clk_postmux1
|
||||
+ * \- cpu_clk_premux1
|
||||
+ * \- xtal
|
||||
+ */
|
||||
+
|
||||
+ udelay(100);
|
||||
+
|
||||
+ return NOTIFY_OK;
|
||||
+
|
||||
+ case POST_RATE_CHANGE:
|
||||
+ /*
|
||||
+ * The cpu_clk_postmux0 has ben updated, now switch back
|
||||
+ * cpu_clk_dyn to cpu_clk_postmux0 and take the changes
|
||||
+ * in account.
|
||||
+ */
|
||||
+
|
||||
+ /* Configure cpu_clk_dyn back to cpu_clk_postmux0 */
|
||||
+ clk_hw_set_parent(nb_data->cpu_clk_dyn,
|
||||
+ nb_data->cpu_clk_postmux0);
|
||||
+
|
||||
+ /*
|
||||
+ * new path :
|
||||
+ * cpu_clk
|
||||
+ * \- cpu_clk_dyn
|
||||
+ * \- cpu_clk_postmux0
|
||||
+ * \- cpu_clk_muxX_div
|
||||
+ * \- cpu_clk_premux0
|
||||
+ * \- fclk_div3 or fclk_div2
|
||||
+ * OR
|
||||
+ * \- cpu_clk_premux0
|
||||
+ * \- fclk_div3 or fclk_div2
|
||||
+ */
|
||||
+
|
||||
+ udelay(100);
|
||||
+
|
||||
+ return NOTIFY_OK;
|
||||
+
|
||||
+ default:
|
||||
+ return NOTIFY_DONE;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static struct g12a_cpu_clk_postmux_nb_data g12a_cpu_clk_postmux0_nb_data = {
|
||||
+ .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
|
||||
+ .cpu_clk_postmux0 = &g12a_cpu_clk_postmux0.hw,
|
||||
+ .cpu_clk_postmux1 = &g12a_cpu_clk_postmux1.hw,
|
||||
+ .cpu_clk_premux1 = &g12a_cpu_clk_premux1.hw,
|
||||
+ .nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
|
||||
+};
|
||||
+
|
||||
+static struct g12a_cpu_clk_postmux_nb_data g12b_cpub_clk_postmux0_nb_data = {
|
||||
+ .cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
|
||||
+ .cpu_clk_postmux0 = &g12b_cpub_clk_postmux0.hw,
|
||||
+ .cpu_clk_postmux1 = &g12b_cpub_clk_postmux1.hw,
|
||||
+ .cpu_clk_premux1 = &g12b_cpub_clk_premux1.hw,
|
||||
+ .nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
|
||||
+};
|
||||
+
|
||||
+struct g12a_sys_pll_nb_data {
|
||||
+ struct notifier_block nb;
|
||||
+ struct clk_hw *sys_pll;
|
||||
+ struct clk_hw *cpu_clk;
|
||||
+ struct clk_hw *cpu_clk_dyn;
|
||||
+};
|
||||
+
|
||||
+static int g12a_sys_pll_notifier_cb(struct notifier_block *nb,
|
||||
+ unsigned long event, void *data)
|
||||
+{
|
||||
+ struct g12a_sys_pll_nb_data *nb_data =
|
||||
+ container_of(nb, struct g12a_sys_pll_nb_data, nb);
|
||||
+
|
||||
+ switch (event) {
|
||||
+ case PRE_RATE_CHANGE:
|
||||
+ /*
|
||||
+ * This notifier means sys_pll clock will be changed
|
||||
+ * to feed cpu_clk, this the current path :
|
||||
+ * cpu_clk
|
||||
+ * \- sys_pll
|
||||
+ * \- sys_pll_dco
|
||||
+ */
|
||||
+
|
||||
+ /* Configure cpu_clk to use cpu_clk_dyn */
|
||||
+ clk_hw_set_parent(nb_data->cpu_clk,
|
||||
+ nb_data->cpu_clk_dyn);
|
||||
+
|
||||
+ /*
|
||||
+ * Now, cpu_clk uses the dyn path
|
||||
+ * cpu_clk
|
||||
+ * \- cpu_clk_dyn
|
||||
+ * \- cpu_clk_dynX
|
||||
+ * \- cpu_clk_dynX_sel
|
||||
+ * \- cpu_clk_dynX_div
|
||||
+ * \- xtal/fclk_div2/fclk_div3
|
||||
+ * \- xtal/fclk_div2/fclk_div3
|
||||
+ */
|
||||
+
|
||||
+ udelay(100);
|
||||
+
|
||||
+ return NOTIFY_OK;
|
||||
+
|
||||
+ case POST_RATE_CHANGE:
|
||||
+ /*
|
||||
+ * The sys_pll has ben updated, now switch back cpu_clk to
|
||||
+ * sys_pll
|
||||
+ */
|
||||
+
|
||||
+ /* Configure cpu_clk to use sys_pll */
|
||||
+ clk_hw_set_parent(nb_data->cpu_clk,
|
||||
+ nb_data->sys_pll);
|
||||
+
|
||||
+ udelay(100);
|
||||
+
|
||||
+ /* new path :
|
||||
+ * cpu_clk
|
||||
+ * \- sys_pll
|
||||
+ * \- sys_pll_dco
|
||||
+ */
|
||||
+
|
||||
+ return NOTIFY_OK;
|
||||
+
|
||||
+ default:
|
||||
+ return NOTIFY_DONE;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static struct g12a_sys_pll_nb_data g12a_sys_pll_nb_data = {
|
||||
+ .sys_pll = &g12a_sys_pll.hw,
|
||||
+ .cpu_clk = &g12a_cpu_clk.hw,
|
||||
+ .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
|
||||
+ .nb.notifier_call = g12a_sys_pll_notifier_cb,
|
||||
+};
|
||||
+
|
||||
+/* G12B first CPU cluster uses sys1_pll */
|
||||
+static struct g12a_sys_pll_nb_data g12b_cpu_clk_sys1_pll_nb_data = {
|
||||
+ .sys_pll = &g12b_sys1_pll.hw,
|
||||
+ .cpu_clk = &g12b_cpu_clk.hw,
|
||||
+ .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
|
||||
+ .nb.notifier_call = g12a_sys_pll_notifier_cb,
|
||||
+};
|
||||
+
|
||||
+/* G12B second CPU cluster uses sys_pll */
|
||||
+static struct g12a_sys_pll_nb_data g12b_cpub_clk_sys_pll_nb_data = {
|
||||
+ .sys_pll = &g12a_sys_pll.hw,
|
||||
+ .cpu_clk = &g12b_cpub_clk.hw,
|
||||
+ .cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
|
||||
+ .nb.notifier_call = g12a_sys_pll_notifier_cb,
|
||||
+};
|
||||
+
|
||||
static struct clk_regmap g12a_cpu_clk_div16_en = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_SYS_CPU_CLK_CNTL1,
|
||||
@@ -4097,28 +4342,210 @@ static const struct reg_sequence g12a_init_regs[] = {
|
||||
{ .reg = HHI_MPLL_CNTL0, .def = 0x00000543 },
|
||||
};
|
||||
|
||||
-static const struct meson_eeclkc_data g12a_clkc_data = {
|
||||
- .regmap_clks = g12a_clk_regmaps,
|
||||
- .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
|
||||
- .hw_onecell_data = &g12a_hw_onecell_data,
|
||||
- .init_regs = g12a_init_regs,
|
||||
- .init_count = ARRAY_SIZE(g12a_init_regs),
|
||||
-};
|
||||
-
|
||||
-static const struct meson_eeclkc_data g12b_clkc_data = {
|
||||
- .regmap_clks = g12a_clk_regmaps,
|
||||
- .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
|
||||
- .hw_onecell_data = &g12b_hw_onecell_data
|
||||
+static int meson_g12a_dvfs_setup_common(struct platform_device *pdev,
|
||||
+ struct clk_hw **hws)
|
||||
+{
|
||||
+ const char *notifier_clk_name;
|
||||
+ struct clk *notifier_clk;
|
||||
+ struct clk_hw *xtal;
|
||||
+ int ret;
|
||||
+
|
||||
+ xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
|
||||
+
|
||||
+ /* Setup clock notifier for cpu_clk_postmux0 */
|
||||
+ g12a_cpu_clk_postmux0_nb_data.xtal = xtal;
|
||||
+ notifier_clk_name = clk_hw_get_name(&g12a_cpu_clk_postmux0.hw);
|
||||
+ notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
+ ret = clk_notifier_register(notifier_clk,
|
||||
+ &g12a_cpu_clk_postmux0_nb_data.nb);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to register the cpu_clk_postmux0 notifier\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Setup clock notifier for cpu_clk_dyn mux */
|
||||
+ notifier_clk_name = clk_hw_get_name(&g12a_cpu_clk_dyn.hw);
|
||||
+ notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
+ ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to register the cpu_clk_dyn notifier\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int meson_g12b_dvfs_setup(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct clk_hw **hws = g12b_hw_onecell_data.hws;
|
||||
+ const char *notifier_clk_name;
|
||||
+ struct clk *notifier_clk;
|
||||
+ struct clk_hw *xtal;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = meson_g12a_dvfs_setup_common(pdev, hws);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
|
||||
+
|
||||
+ /* Setup clock notifier for cpu_clk mux */
|
||||
+ notifier_clk_name = clk_hw_get_name(&g12b_cpu_clk.hw);
|
||||
+ notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
+ ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to register the cpu_clk notifier\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Setup clock notifier for sys1_pll */
|
||||
+ notifier_clk_name = clk_hw_get_name(&g12b_sys1_pll.hw);
|
||||
+ notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
+ ret = clk_notifier_register(notifier_clk,
|
||||
+ &g12b_cpu_clk_sys1_pll_nb_data.nb);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to register the sys1_pll notifier\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Add notifiers for the second CPU cluster */
|
||||
+
|
||||
+ /* Setup clock notifier for cpub_clk_postmux0 */
|
||||
+ g12b_cpub_clk_postmux0_nb_data.xtal = xtal;
|
||||
+ notifier_clk_name = clk_hw_get_name(&g12b_cpub_clk_postmux0.hw);
|
||||
+ notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
+ ret = clk_notifier_register(notifier_clk,
|
||||
+ &g12b_cpub_clk_postmux0_nb_data.nb);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to register the cpub_clk_postmux0 notifier\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Setup clock notifier for cpub_clk_dyn mux */
|
||||
+ notifier_clk_name = clk_hw_get_name(&g12b_cpub_clk_dyn.hw);
|
||||
+ notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
+ ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to register the cpub_clk_dyn notifier\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Setup clock notifier for cpub_clk mux */
|
||||
+ notifier_clk_name = clk_hw_get_name(&g12b_cpub_clk.hw);
|
||||
+ notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
+ ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to register the cpub_clk notifier\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Setup clock notifier for sys_pll */
|
||||
+ notifier_clk_name = clk_hw_get_name(&g12a_sys_pll.hw);
|
||||
+ notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
+ ret = clk_notifier_register(notifier_clk,
|
||||
+ &g12b_cpub_clk_sys_pll_nb_data.nb);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to register the sys_pll notifier\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int meson_g12a_dvfs_setup(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct clk_hw **hws = g12a_hw_onecell_data.hws;
|
||||
+ const char *notifier_clk_name;
|
||||
+ struct clk *notifier_clk;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = meson_g12a_dvfs_setup_common(pdev, hws);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Setup clock notifier for cpu_clk mux */
|
||||
+ notifier_clk_name = clk_hw_get_name(&g12a_cpu_clk.hw);
|
||||
+ notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
+ ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to register the cpu_clk notifier\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Setup clock notifier for sys_pll */
|
||||
+ notifier_clk_name = clk_hw_get_name(&g12a_sys_pll.hw);
|
||||
+ notifier_clk = __clk_lookup(notifier_clk_name);
|
||||
+ ret = clk_notifier_register(notifier_clk, &g12a_sys_pll_nb_data.nb);
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to register the sys_pll notifier\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+struct meson_g12a_data {
|
||||
+ const struct meson_eeclkc_data eeclkc_data;
|
||||
+ int (*dvfs_setup)(struct platform_device *pdev);
|
||||
+};
|
||||
+
|
||||
+static int meson_g12a_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ const struct meson_eeclkc_data *eeclkc_data;
|
||||
+ const struct meson_g12a_data *g12a_data;
|
||||
+ int ret;
|
||||
+
|
||||
+ eeclkc_data = of_device_get_match_data(&pdev->dev);
|
||||
+ if (!eeclkc_data)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ ret = meson_eeclkc_probe(pdev);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ g12a_data = container_of(eeclkc_data, struct meson_g12a_data,
|
||||
+ eeclkc_data);
|
||||
+
|
||||
+ if (g12a_data->dvfs_setup)
|
||||
+ return g12a_data->dvfs_setup(pdev);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct meson_g12a_data g12a_clkc_data = {
|
||||
+ .eeclkc_data = {
|
||||
+ .regmap_clks = g12a_clk_regmaps,
|
||||
+ .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
|
||||
+ .hw_onecell_data = &g12a_hw_onecell_data,
|
||||
+ .init_regs = g12a_init_regs,
|
||||
+ .init_count = ARRAY_SIZE(g12a_init_regs),
|
||||
+ },
|
||||
+ .dvfs_setup = meson_g12a_dvfs_setup,
|
||||
+};
|
||||
+
|
||||
+static const struct meson_g12a_data g12b_clkc_data = {
|
||||
+ .eeclkc_data = {
|
||||
+ .regmap_clks = g12a_clk_regmaps,
|
||||
+ .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
|
||||
+ .hw_onecell_data = &g12b_hw_onecell_data,
|
||||
+ },
|
||||
+ .dvfs_setup = meson_g12b_dvfs_setup,
|
||||
};
|
||||
|
||||
static const struct of_device_id clkc_match_table[] = {
|
||||
- { .compatible = "amlogic,g12a-clkc", .data = &g12a_clkc_data },
|
||||
- { .compatible = "amlogic,g12b-clkc", .data = &g12b_clkc_data },
|
||||
+ {
|
||||
+ .compatible = "amlogic,g12a-clkc",
|
||||
+ .data = &g12a_clkc_data.eeclkc_data
|
||||
+ },
|
||||
+ {
|
||||
+ .compatible = "amlogic,g12b-clkc",
|
||||
+ .data = &g12b_clkc_data.eeclkc_data
|
||||
+ },
|
||||
{}
|
||||
};
|
||||
|
||||
static struct platform_driver g12a_driver = {
|
||||
- .probe = meson_eeclkc_probe,
|
||||
+ .probe = meson_g12a_probe,
|
||||
.driver = {
|
||||
.name = "g12a-clkc",
|
||||
.of_match_table = clkc_match_table,
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,279 @@
|
||||
From 5104eb54c2ea560b6734c46c6185b71f6fd77cd2 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Thu, 13 Feb 2020 16:51:56 +0100
|
||||
Subject: [PATCH 018/146] FROMGIT: ASoC: meson: aiu: add internal dac codec
|
||||
control support
|
||||
|
||||
Add the codec to codec component which handles the routing between
|
||||
the audio producers and the internal audio DAC found on the amlogic GXL
|
||||
SoC family
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/Makefile | 1 +
|
||||
sound/soc/meson/aiu-acodec-ctrl.c | 205 ++++++++++++++++++++++++++++++
|
||||
sound/soc/meson/aiu.c | 10 ++
|
||||
sound/soc/meson/aiu.h | 1 +
|
||||
4 files changed, 217 insertions(+)
|
||||
create mode 100644 sound/soc/meson/aiu-acodec-ctrl.c
|
||||
|
||||
diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile
|
||||
index 3b21f648e322..80f9113701b3 100644
|
||||
--- a/sound/soc/meson/Makefile
|
||||
+++ b/sound/soc/meson/Makefile
|
||||
@@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||
|
||||
snd-soc-meson-aiu-objs := aiu.o
|
||||
+snd-soc-meson-aiu-objs += aiu-acodec-ctrl.o
|
||||
snd-soc-meson-aiu-objs += aiu-codec-ctrl.o
|
||||
snd-soc-meson-aiu-objs += aiu-encoder-i2s.o
|
||||
snd-soc-meson-aiu-objs += aiu-encoder-spdif.o
|
||||
diff --git a/sound/soc/meson/aiu-acodec-ctrl.c b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||
new file mode 100644
|
||||
index 000000000000..12d8a4d351a1
|
||||
--- /dev/null
|
||||
+++ b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||
@@ -0,0 +1,205 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+//
|
||||
+// Copyright (c) 2020 BayLibre, SAS.
|
||||
+// Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+#include <linux/bitfield.h>
|
||||
+#include <sound/pcm_params.h>
|
||||
+#include <sound/soc.h>
|
||||
+#include <sound/soc-dai.h>
|
||||
+
|
||||
+#include <dt-bindings/sound/meson-aiu.h>
|
||||
+#include "aiu.h"
|
||||
+#include "meson-codec-glue.h"
|
||||
+
|
||||
+#define CTRL_DIN_EN 15
|
||||
+#define CTRL_CLK_INV BIT(14)
|
||||
+#define CTRL_LRCLK_INV BIT(13)
|
||||
+#define CTRL_I2S_IN_BCLK_SRC BIT(11)
|
||||
+#define CTRL_DIN_LRCLK_SRC_SHIFT 6
|
||||
+#define CTRL_DIN_LRCLK_SRC (0x3 << CTRL_DIN_LRCLK_SRC_SHIFT)
|
||||
+#define CTRL_BCLK_MCLK_SRC GENMASK(5, 4)
|
||||
+#define CTRL_DIN_SKEW GENMASK(3, 2)
|
||||
+#define CTRL_I2S_OUT_LANE_SRC 0
|
||||
+
|
||||
+#define AIU_ACODEC_OUT_CHMAX 2
|
||||
+
|
||||
+static const char * const aiu_acodec_ctrl_mux_texts[] = {
|
||||
+ "DISABLED", "I2S", "PCM",
|
||||
+};
|
||||
+
|
||||
+static int aiu_acodec_ctrl_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||
+ struct snd_ctl_elem_value *ucontrol)
|
||||
+{
|
||||
+ struct snd_soc_component *component =
|
||||
+ snd_soc_dapm_kcontrol_component(kcontrol);
|
||||
+ struct snd_soc_dapm_context *dapm =
|
||||
+ snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||
+ struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||
+ unsigned int mux, changed;
|
||||
+
|
||||
+ mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
|
||||
+ changed = snd_soc_component_test_bits(component, e->reg,
|
||||
+ CTRL_DIN_LRCLK_SRC,
|
||||
+ FIELD_PREP(CTRL_DIN_LRCLK_SRC,
|
||||
+ mux));
|
||||
+
|
||||
+ if (!changed)
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Force disconnect of the mux while updating */
|
||||
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||
+
|
||||
+ snd_soc_component_update_bits(component, e->reg,
|
||||
+ CTRL_DIN_LRCLK_SRC |
|
||||
+ CTRL_BCLK_MCLK_SRC,
|
||||
+ FIELD_PREP(CTRL_DIN_LRCLK_SRC, mux) |
|
||||
+ FIELD_PREP(CTRL_BCLK_MCLK_SRC, mux));
|
||||
+
|
||||
+ snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static SOC_ENUM_SINGLE_DECL(aiu_acodec_ctrl_mux_enum, AIU_ACODEC_CTRL,
|
||||
+ CTRL_DIN_LRCLK_SRC_SHIFT,
|
||||
+ aiu_acodec_ctrl_mux_texts);
|
||||
+
|
||||
+static const struct snd_kcontrol_new aiu_acodec_ctrl_mux =
|
||||
+ SOC_DAPM_ENUM_EXT("ACodec Source", aiu_acodec_ctrl_mux_enum,
|
||||
+ snd_soc_dapm_get_enum_double,
|
||||
+ aiu_acodec_ctrl_mux_put_enum);
|
||||
+
|
||||
+static const struct snd_kcontrol_new aiu_acodec_ctrl_out_enable =
|
||||
+ SOC_DAPM_SINGLE_AUTODISABLE("Switch", AIU_ACODEC_CTRL,
|
||||
+ CTRL_DIN_EN, 1, 0);
|
||||
+
|
||||
+static const struct snd_soc_dapm_widget aiu_acodec_ctrl_widgets[] = {
|
||||
+ SND_SOC_DAPM_MUX("ACODEC SRC", SND_SOC_NOPM, 0, 0,
|
||||
+ &aiu_acodec_ctrl_mux),
|
||||
+ SND_SOC_DAPM_SWITCH("ACODEC OUT EN", SND_SOC_NOPM, 0, 0,
|
||||
+ &aiu_acodec_ctrl_out_enable),
|
||||
+};
|
||||
+
|
||||
+static int aiu_acodec_ctrl_input_hw_params(struct snd_pcm_substream *substream,
|
||||
+ struct snd_pcm_hw_params *params,
|
||||
+ struct snd_soc_dai *dai)
|
||||
+{
|
||||
+ struct meson_codec_glue_input *data;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = meson_codec_glue_input_hw_params(substream, params, dai);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* The glue will provide 1 lane out of the 4 to the output */
|
||||
+ data = meson_codec_glue_input_get_data(dai);
|
||||
+ data->params.channels_min = min_t(unsigned int, AIU_ACODEC_OUT_CHMAX,
|
||||
+ data->params.channels_min);
|
||||
+ data->params.channels_max = min_t(unsigned int, AIU_ACODEC_OUT_CHMAX,
|
||||
+ data->params.channels_max);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct snd_soc_dai_ops aiu_acodec_ctrl_input_ops = {
|
||||
+ .hw_params = aiu_acodec_ctrl_input_hw_params,
|
||||
+ .set_fmt = meson_codec_glue_input_set_fmt,
|
||||
+};
|
||||
+
|
||||
+static const struct snd_soc_dai_ops aiu_acodec_ctrl_output_ops = {
|
||||
+ .startup = meson_codec_glue_output_startup,
|
||||
+};
|
||||
+
|
||||
+#define AIU_ACODEC_CTRL_FORMATS \
|
||||
+ (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
|
||||
+ SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE | \
|
||||
+ SNDRV_PCM_FMTBIT_S32_LE)
|
||||
+
|
||||
+#define AIU_ACODEC_STREAM(xname, xsuffix, xchmax) \
|
||||
+{ \
|
||||
+ .stream_name = xname " " xsuffix, \
|
||||
+ .channels_min = 1, \
|
||||
+ .channels_max = (xchmax), \
|
||||
+ .rate_min = 5512, \
|
||||
+ .rate_max = 192000, \
|
||||
+ .formats = AIU_ACODEC_CTRL_FORMATS, \
|
||||
+}
|
||||
+
|
||||
+#define AIU_ACODEC_INPUT(xname) { \
|
||||
+ .name = "ACODEC CTRL " xname, \
|
||||
+ .name = xname, \
|
||||
+ .playback = AIU_ACODEC_STREAM(xname, "Playback", 8), \
|
||||
+ .ops = &aiu_acodec_ctrl_input_ops, \
|
||||
+ .probe = meson_codec_glue_input_dai_probe, \
|
||||
+ .remove = meson_codec_glue_input_dai_remove, \
|
||||
+}
|
||||
+
|
||||
+#define AIU_ACODEC_OUTPUT(xname) { \
|
||||
+ .name = "ACODEC CTRL " xname, \
|
||||
+ .capture = AIU_ACODEC_STREAM(xname, "Capture", AIU_ACODEC_OUT_CHMAX), \
|
||||
+ .ops = &aiu_acodec_ctrl_output_ops, \
|
||||
+}
|
||||
+
|
||||
+static struct snd_soc_dai_driver aiu_acodec_ctrl_dai_drv[] = {
|
||||
+ [CTRL_I2S] = AIU_ACODEC_INPUT("ACODEC I2S IN"),
|
||||
+ [CTRL_PCM] = AIU_ACODEC_INPUT("ACODEC PCM IN"),
|
||||
+ [CTRL_OUT] = AIU_ACODEC_OUTPUT("ACODEC OUT"),
|
||||
+};
|
||||
+
|
||||
+static const struct snd_soc_dapm_route aiu_acodec_ctrl_routes[] = {
|
||||
+ { "ACODEC SRC", "I2S", "ACODEC I2S IN Playback" },
|
||||
+ { "ACODEC SRC", "PCM", "ACODEC PCM IN Playback" },
|
||||
+ { "ACODEC OUT EN", "Switch", "ACODEC SRC" },
|
||||
+ { "ACODEC OUT Capture", NULL, "ACODEC OUT EN" },
|
||||
+};
|
||||
+
|
||||
+static const struct snd_kcontrol_new aiu_acodec_ctrl_controls[] = {
|
||||
+ SOC_SINGLE("ACODEC I2S Lane Select", AIU_ACODEC_CTRL,
|
||||
+ CTRL_I2S_OUT_LANE_SRC, 3, 0),
|
||||
+};
|
||||
+
|
||||
+static int aiu_acodec_of_xlate_dai_name(struct snd_soc_component *component,
|
||||
+ struct of_phandle_args *args,
|
||||
+ const char **dai_name)
|
||||
+{
|
||||
+ return aiu_of_xlate_dai_name(component, args, dai_name, AIU_ACODEC);
|
||||
+}
|
||||
+
|
||||
+static int aiu_acodec_ctrl_component_probe(struct snd_soc_component *component)
|
||||
+{
|
||||
+ /*
|
||||
+ * NOTE: Din Skew setting
|
||||
+ * According to the documentation, the following update adds one delay
|
||||
+ * to the din line. Without this, the output saturates. This happens
|
||||
+ * regardless of the link format (i2s or left_j) so it is not clear what
|
||||
+ * it actually does but it seems to be required
|
||||
+ */
|
||||
+ snd_soc_component_update_bits(component, AIU_ACODEC_CTRL,
|
||||
+ CTRL_DIN_SKEW,
|
||||
+ FIELD_PREP(CTRL_DIN_SKEW, 2));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct snd_soc_component_driver aiu_acodec_ctrl_component = {
|
||||
+ .name = "AIU Internal DAC Codec Control",
|
||||
+ .probe = aiu_acodec_ctrl_component_probe,
|
||||
+ .controls = aiu_acodec_ctrl_controls,
|
||||
+ .num_controls = ARRAY_SIZE(aiu_acodec_ctrl_controls),
|
||||
+ .dapm_widgets = aiu_acodec_ctrl_widgets,
|
||||
+ .num_dapm_widgets = ARRAY_SIZE(aiu_acodec_ctrl_widgets),
|
||||
+ .dapm_routes = aiu_acodec_ctrl_routes,
|
||||
+ .num_dapm_routes = ARRAY_SIZE(aiu_acodec_ctrl_routes),
|
||||
+ .of_xlate_dai_name = aiu_acodec_of_xlate_dai_name,
|
||||
+ .endianness = 1,
|
||||
+ .non_legacy_dai_naming = 1,
|
||||
+};
|
||||
+
|
||||
+int aiu_acodec_ctrl_register_component(struct device *dev)
|
||||
+{
|
||||
+ return aiu_add_component(dev, &aiu_acodec_ctrl_component,
|
||||
+ aiu_acodec_ctrl_dai_drv,
|
||||
+ ARRAY_SIZE(aiu_acodec_ctrl_dai_drv),
|
||||
+ "acodec");
|
||||
+}
|
||||
diff --git a/sound/soc/meson/aiu.c b/sound/soc/meson/aiu.c
|
||||
index b765dfb70726..5c4845a23a34 100644
|
||||
--- a/sound/soc/meson/aiu.c
|
||||
+++ b/sound/soc/meson/aiu.c
|
||||
@@ -345,6 +345,16 @@ static int aiu_probe(struct platform_device *pdev)
|
||||
goto err;
|
||||
}
|
||||
|
||||
+ /* Register the internal dac control component on gxl */
|
||||
+ if (of_device_is_compatible(dev->of_node, "amlogic,aiu-gxl")) {
|
||||
+ ret = aiu_acodec_ctrl_register_component(dev);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev,
|
||||
+ "Failed to register acodec control component\n");
|
||||
+ goto err;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
err:
|
||||
snd_soc_unregister_component(dev);
|
||||
diff --git a/sound/soc/meson/aiu.h b/sound/soc/meson/aiu.h
|
||||
index 9242ab1ab64b..a65a576e3400 100644
|
||||
--- a/sound/soc/meson/aiu.h
|
||||
+++ b/sound/soc/meson/aiu.h
|
||||
@@ -52,6 +52,7 @@ int aiu_add_component(struct device *dev,
|
||||
const char *debugfs_prefix);
|
||||
|
||||
int aiu_hdmi_ctrl_register_component(struct device *dev);
|
||||
+int aiu_acodec_ctrl_register_component(struct device *dev);
|
||||
|
||||
int aiu_fifo_i2s_dai_probe(struct snd_soc_dai *dai);
|
||||
int aiu_fifo_spdif_dai_probe(struct snd_soc_dai *dai);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,45 +0,0 @@
|
||||
From 98fd49222ea1bfb68f788b23cfa36fac90d65d93 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Wed, 31 Jul 2019 10:40:19 +0200
|
||||
Subject: [PATCH 018/187] FROMGIT: clk: meson: g12a: expose CPUB clock ID for
|
||||
G12B
|
||||
|
||||
Expose the CPUB clock id to add DVFS to the second CPU cluster of
|
||||
the Amlogic G12B SoC.
|
||||
|
||||
Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
(cherry picked from commit 85ab9d954698961960240622de4fad85c7d8a61e
|
||||
https://github.com/BayLibre/clk-meson v5.4/drivers)
|
||||
---
|
||||
drivers/clk/meson/g12a.h | 1 -
|
||||
include/dt-bindings/clock/g12a-clkc.h | 1 +
|
||||
2 files changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/g12a.h b/drivers/clk/meson/g12a.h
|
||||
index c8aed31fbe17..559a34cfdfeb 100644
|
||||
--- a/drivers/clk/meson/g12a.h
|
||||
+++ b/drivers/clk/meson/g12a.h
|
||||
@@ -216,7 +216,6 @@
|
||||
#define CLKID_CPUB_CLK_DYN1_DIV 221
|
||||
#define CLKID_CPUB_CLK_DYN1 222
|
||||
#define CLKID_CPUB_CLK_DYN 223
|
||||
-#define CLKID_CPUB_CLK 224
|
||||
#define CLKID_CPUB_CLK_DIV16_EN 225
|
||||
#define CLKID_CPUB_CLK_DIV16 226
|
||||
#define CLKID_CPUB_CLK_DIV2 227
|
||||
diff --git a/include/dt-bindings/clock/g12a-clkc.h b/include/dt-bindings/clock/g12a-clkc.h
|
||||
index b6b127e45634..8ccc29ac7a72 100644
|
||||
--- a/include/dt-bindings/clock/g12a-clkc.h
|
||||
+++ b/include/dt-bindings/clock/g12a-clkc.h
|
||||
@@ -137,5 +137,6 @@
|
||||
#define CLKID_VDEC_HEVC 207
|
||||
#define CLKID_VDEC_HEVCF 210
|
||||
#define CLKID_TS 212
|
||||
+#define CLKID_CPUB_CLK 224
|
||||
|
||||
#endif /* __G12A_CLKC_H */
|
||||
--
|
||||
2.17.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,67 +0,0 @@
|
||||
From 8bd2487a1685a03b18f96244000ec4d04878b6ed Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Mon, 29 Jul 2019 15:02:17 +0200
|
||||
Subject: [PATCH 019/187] FROMGIT: soc: amlogic: meson-clk-measure: protect
|
||||
measure with a mutex
|
||||
|
||||
In order to protect clock measuring when multiple process asks for
|
||||
a measure, protect the main measure function with mutexes.
|
||||
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit 3a760d986568b67d1f8411dab64608075817b90d
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/drivers)
|
||||
---
|
||||
drivers/soc/amlogic/meson-clk-measure.c | 12 +++++++++++-
|
||||
1 file changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/soc/amlogic/meson-clk-measure.c b/drivers/soc/amlogic/meson-clk-measure.c
|
||||
index 19d4cbc93a17..c470e24f1dfa 100644
|
||||
--- a/drivers/soc/amlogic/meson-clk-measure.c
|
||||
+++ b/drivers/soc/amlogic/meson-clk-measure.c
|
||||
@@ -11,6 +11,8 @@
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
+static DEFINE_MUTEX(measure_lock);
|
||||
+
|
||||
#define MSR_CLK_DUTY 0x0
|
||||
#define MSR_CLK_REG0 0x4
|
||||
#define MSR_CLK_REG1 0x8
|
||||
@@ -360,6 +362,10 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id,
|
||||
unsigned int val;
|
||||
int ret;
|
||||
|
||||
+ ret = mutex_lock_interruptible(&measure_lock);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
regmap_write(priv->regmap, MSR_CLK_REG0, 0);
|
||||
|
||||
/* Set measurement duration */
|
||||
@@ -377,8 +383,10 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id,
|
||||
|
||||
ret = regmap_read_poll_timeout(priv->regmap, MSR_CLK_REG0,
|
||||
val, !(val & MSR_BUSY), 10, 10000);
|
||||
- if (ret)
|
||||
+ if (ret) {
|
||||
+ mutex_unlock(&measure_lock);
|
||||
return ret;
|
||||
+ }
|
||||
|
||||
/* Disable */
|
||||
regmap_update_bits(priv->regmap, MSR_CLK_REG0, MSR_ENABLE, 0);
|
||||
@@ -386,6 +394,8 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id,
|
||||
/* Get the value in multiple of gate time counts */
|
||||
regmap_read(priv->regmap, MSR_CLK_REG2, &val);
|
||||
|
||||
+ mutex_unlock(&measure_lock);
|
||||
+
|
||||
if (val >= MSR_VAL_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,138 @@
|
||||
From d23068202d53370a8d4aa52219584943d8a526c8 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Thu, 13 Feb 2020 16:51:58 +0100
|
||||
Subject: [PATCH 020/146] FROMGIT: ASoC: meson: gx: add sound card dt-binding
|
||||
documentation
|
||||
|
||||
Add the dt-binding documentation of sound card supporting the amlogic
|
||||
GX SoC family
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
.../bindings/sound/amlogic,gx-sound-card.yaml | 113 ++++++++++++++++++
|
||||
1 file changed, 113 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,gx-sound-card.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,gx-sound-card.yaml b/Documentation/devicetree/bindings/sound/amlogic,gx-sound-card.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..fb374c659be1
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,gx-sound-card.yaml
|
||||
@@ -0,0 +1,113 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,gx-sound-card.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic GX sound card
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ items:
|
||||
+ - const: amlogic,gx-sound-card
|
||||
+
|
||||
+ audio-aux-devs:
|
||||
+ $ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
+ description: list of auxiliary devices
|
||||
+
|
||||
+ audio-routing:
|
||||
+ $ref: /schemas/types.yaml#/definitions/non-unique-string-array
|
||||
+ minItems: 2
|
||||
+ description: |-
|
||||
+ A list of the connections between audio components. Each entry is a
|
||||
+ pair of strings, the first being the connection's sink, the second
|
||||
+ being the connection's source.
|
||||
+
|
||||
+ audio-widgets:
|
||||
+ $ref: /schemas/types.yaml#/definitions/non-unique-string-array
|
||||
+ minItems: 2
|
||||
+ description: |-
|
||||
+ A list off component DAPM widget. Each entry is a pair of strings,
|
||||
+ the first being the widget type, the second being the widget name
|
||||
+
|
||||
+ model:
|
||||
+ $ref: /schemas/types.yaml#/definitions/string
|
||||
+ description: User specified audio sound card name
|
||||
+
|
||||
+patternProperties:
|
||||
+ "^dai-link-[0-9]+$":
|
||||
+ type: object
|
||||
+ description: |-
|
||||
+ dai-link child nodes:
|
||||
+ Container for dai-link level properties and the CODEC sub-nodes.
|
||||
+ There should be at least one (and probably more) subnode of this type
|
||||
+
|
||||
+ properties:
|
||||
+ dai-format:
|
||||
+ $ref: /schemas/types.yaml#/definitions/string
|
||||
+ enum: [ i2s, left-j, dsp_a ]
|
||||
+
|
||||
+ mclk-fs:
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||
+ description: |-
|
||||
+ Multiplication factor between the frame rate and master clock
|
||||
+ rate
|
||||
+
|
||||
+ sound-dai:
|
||||
+ $ref: /schemas/types.yaml#/definitions/phandle
|
||||
+ description: phandle of the CPU DAI
|
||||
+
|
||||
+ patternProperties:
|
||||
+ "^codec-[0-9]+$":
|
||||
+ type: object
|
||||
+ description: |-
|
||||
+ Codecs:
|
||||
+ dai-link representing backend links should have at least one subnode.
|
||||
+ One subnode for each codec of the dai-link. dai-link representing
|
||||
+ frontend links have no codec, therefore have no subnodes
|
||||
+
|
||||
+ properties:
|
||||
+ sound-dai:
|
||||
+ $ref: /schemas/types.yaml#/definitions/phandle
|
||||
+ description: phandle of the codec DAI
|
||||
+
|
||||
+ required:
|
||||
+ - sound-dai
|
||||
+
|
||||
+ required:
|
||||
+ - sound-dai
|
||||
+
|
||||
+required:
|
||||
+ - model
|
||||
+ - dai-link-0
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ sound {
|
||||
+ compatible = "amlogic,gx-sound-card";
|
||||
+ model = "GXL-ACME-S905X-FOO";
|
||||
+ audio-aux-devs = <&>;
|
||||
+ audio-routing = "I2S ENCODER I2S IN", "I2S FIFO Playback";
|
||||
+
|
||||
+ dai-link-0 {
|
||||
+ sound-dai = <&i2s_fifo>;
|
||||
+ };
|
||||
+
|
||||
+ dai-link-1 {
|
||||
+ sound-dai = <&i2s_encoder>;
|
||||
+ dai-format = "i2s";
|
||||
+ mclk-fs = <256>;
|
||||
+
|
||||
+ codec-0 {
|
||||
+ sound-dai = <&codec0>;
|
||||
+ };
|
||||
+
|
||||
+ codec-1 {
|
||||
+ sound-dai = <&codec1>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,37 +0,0 @@
|
||||
From 83812e17ee43427df1b1de8b0de22834e7ecd394 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Mon, 29 Jul 2019 15:02:18 +0200
|
||||
Subject: [PATCH 020/187] FROMGIT: soc: amlogic: meson-clk-measure: add G12B
|
||||
second cluster cpu clk
|
||||
|
||||
Add the G12B second CPU cluster CPU and SYS_PLL measure IDs.
|
||||
|
||||
These IDs returns 0Hz on G12A.
|
||||
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit c33b2777d01eb0039a53f14f8c0e4cca8df501c7
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/drivers)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/soc/amlogic/meson-clk-measure.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/soc/amlogic/meson-clk-measure.c b/drivers/soc/amlogic/meson-clk-measure.c
|
||||
index c470e24f1dfa..f09b404b39d3 100644
|
||||
--- a/drivers/soc/amlogic/meson-clk-measure.c
|
||||
+++ b/drivers/soc/amlogic/meson-clk-measure.c
|
||||
@@ -324,6 +324,8 @@ static struct meson_msr_id clk_msr_g12a[CLK_MSR_MAX] = {
|
||||
CLK_MSR_ID(84, "co_tx"),
|
||||
CLK_MSR_ID(89, "hdmi_todig"),
|
||||
CLK_MSR_ID(90, "hdmitx_sys"),
|
||||
+ CLK_MSR_ID(91, "sys_cpub_div16"),
|
||||
+ CLK_MSR_ID(92, "sys_pll_cpub_div16"),
|
||||
CLK_MSR_ID(94, "eth_phy_rx"),
|
||||
CLK_MSR_ID(95, "eth_phy_pll"),
|
||||
CLK_MSR_ID(96, "vpu_b"),
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,202 @@
|
||||
From 5e137ff2cdafade10881b0197e4d1b27319a418f Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Thu, 13 Feb 2020 16:51:59 +0100
|
||||
Subject: [PATCH 021/146] FROMGIT: ASoC: meson: gx: add sound card support
|
||||
|
||||
Add support for the sound card used on the amlogic GX SoC family
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/Kconfig | 7 ++
|
||||
sound/soc/meson/Makefile | 2 +
|
||||
sound/soc/meson/gx-card.c | 141 ++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 150 insertions(+)
|
||||
create mode 100644 sound/soc/meson/gx-card.c
|
||||
|
||||
diff --git a/sound/soc/meson/Kconfig b/sound/soc/meson/Kconfig
|
||||
index 347fa78e309a..22d2af75b59e 100644
|
||||
--- a/sound/soc/meson/Kconfig
|
||||
+++ b/sound/soc/meson/Kconfig
|
||||
@@ -101,6 +101,13 @@ config SND_MESON_CARD_UTILS
|
||||
config SND_MESON_CODEC_GLUE
|
||||
tristate
|
||||
|
||||
+config SND_MESON_GX_SOUND_CARD
|
||||
+ tristate "Amlogic GX Sound Card Support"
|
||||
+ select SND_MESON_CARD_UTILS
|
||||
+ imply SND_MESON_AIU
|
||||
+ help
|
||||
+ Select Y or M to add support for the GXBB/GXL SoC sound card
|
||||
+
|
||||
config SND_MESON_G12A_TOHDMITX
|
||||
tristate "Amlogic G12A To HDMI TX Control Support"
|
||||
select REGMAP_MMIO
|
||||
diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile
|
||||
index bef2b72fd7a7..f9c90c391498 100644
|
||||
--- a/sound/soc/meson/Makefile
|
||||
+++ b/sound/soc/meson/Makefile
|
||||
@@ -21,6 +21,7 @@ snd-soc-meson-axg-spdifout-objs := axg-spdifout.o
|
||||
snd-soc-meson-axg-pdm-objs := axg-pdm.o
|
||||
snd-soc-meson-card-utils-objs := meson-card-utils.o
|
||||
snd-soc-meson-codec-glue-objs := meson-codec-glue.o
|
||||
+snd-soc-meson-gx-sound-card-objs := gx-card.o
|
||||
snd-soc-meson-g12a-tohdmitx-objs := g12a-tohdmitx.o
|
||||
|
||||
obj-$(CONFIG_SND_MESON_AIU) += snd-soc-meson-aiu.o
|
||||
@@ -37,4 +38,5 @@ obj-$(CONFIG_SND_MESON_AXG_SPDIFOUT) += snd-soc-meson-axg-spdifout.o
|
||||
obj-$(CONFIG_SND_MESON_AXG_PDM) += snd-soc-meson-axg-pdm.o
|
||||
obj-$(CONFIG_SND_MESON_CARD_UTILS) += snd-soc-meson-card-utils.o
|
||||
obj-$(CONFIG_SND_MESON_CODEC_GLUE) += snd-soc-meson-codec-glue.o
|
||||
+obj-$(CONFIG_SND_MESON_GX_SOUND_CARD) += snd-soc-meson-gx-sound-card.o
|
||||
obj-$(CONFIG_SND_MESON_G12A_TOHDMITX) += snd-soc-meson-g12a-tohdmitx.o
|
||||
diff --git a/sound/soc/meson/gx-card.c b/sound/soc/meson/gx-card.c
|
||||
new file mode 100644
|
||||
index 000000000000..7b01dcb73e5e
|
||||
--- /dev/null
|
||||
+++ b/sound/soc/meson/gx-card.c
|
||||
@@ -0,0 +1,141 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||
+//
|
||||
+// Copyright (c) 2020 BayLibre, SAS.
|
||||
+// Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of_platform.h>
|
||||
+#include <sound/soc.h>
|
||||
+#include <sound/soc-dai.h>
|
||||
+
|
||||
+#include "meson-card.h"
|
||||
+
|
||||
+struct gx_dai_link_i2s_data {
|
||||
+ unsigned int mclk_fs;
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * Base params for the codec to codec links
|
||||
+ * Those will be over-written by the CPU side of the link
|
||||
+ */
|
||||
+static const struct snd_soc_pcm_stream codec_params = {
|
||||
+ .formats = SNDRV_PCM_FMTBIT_S24_LE,
|
||||
+ .rate_min = 5525,
|
||||
+ .rate_max = 192000,
|
||||
+ .channels_min = 1,
|
||||
+ .channels_max = 8,
|
||||
+};
|
||||
+
|
||||
+static int gx_card_i2s_be_hw_params(struct snd_pcm_substream *substream,
|
||||
+ struct snd_pcm_hw_params *params)
|
||||
+{
|
||||
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
+ struct meson_card *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||
+ struct gx_dai_link_i2s_data *be =
|
||||
+ (struct gx_dai_link_i2s_data *)priv->link_data[rtd->num];
|
||||
+
|
||||
+ return meson_card_i2s_set_sysclk(substream, params, be->mclk_fs);
|
||||
+}
|
||||
+
|
||||
+static const struct snd_soc_ops gx_card_i2s_be_ops = {
|
||||
+ .hw_params = gx_card_i2s_be_hw_params,
|
||||
+};
|
||||
+
|
||||
+static int gx_card_parse_i2s(struct snd_soc_card *card,
|
||||
+ struct device_node *node,
|
||||
+ int *index)
|
||||
+{
|
||||
+ struct meson_card *priv = snd_soc_card_get_drvdata(card);
|
||||
+ struct snd_soc_dai_link *link = &card->dai_link[*index];
|
||||
+ struct gx_dai_link_i2s_data *be;
|
||||
+
|
||||
+ /* Allocate i2s link parameters */
|
||||
+ be = devm_kzalloc(card->dev, sizeof(*be), GFP_KERNEL);
|
||||
+ if (!be)
|
||||
+ return -ENOMEM;
|
||||
+ priv->link_data[*index] = be;
|
||||
+
|
||||
+ /* Setup i2s link */
|
||||
+ link->ops = &gx_card_i2s_be_ops;
|
||||
+ link->dai_fmt = meson_card_parse_daifmt(node, link->cpus->of_node);
|
||||
+
|
||||
+ of_property_read_u32(node, "mclk-fs", &be->mclk_fs);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int gx_card_cpu_identify(struct snd_soc_dai_link_component *c,
|
||||
+ char *match)
|
||||
+{
|
||||
+ if (of_device_is_compatible(c->of_node, DT_PREFIX "aiu")) {
|
||||
+ if (strstr(c->dai_name, match))
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ /* dai not matched */
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int gx_card_add_link(struct snd_soc_card *card, struct device_node *np,
|
||||
+ int *index)
|
||||
+{
|
||||
+ struct snd_soc_dai_link *dai_link = &card->dai_link[*index];
|
||||
+ struct snd_soc_dai_link_component *cpu;
|
||||
+ int ret;
|
||||
+
|
||||
+ cpu = devm_kzalloc(card->dev, sizeof(*cpu), GFP_KERNEL);
|
||||
+ if (!cpu)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ dai_link->cpus = cpu;
|
||||
+ dai_link->num_cpus = 1;
|
||||
+
|
||||
+ ret = meson_card_parse_dai(card, np, &dai_link->cpus->of_node,
|
||||
+ &dai_link->cpus->dai_name);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (gx_card_cpu_identify(dai_link->cpus, "FIFO"))
|
||||
+ ret = meson_card_set_fe_link(card, dai_link, np, true);
|
||||
+ else
|
||||
+ ret = meson_card_set_be_link(card, dai_link, np);
|
||||
+
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Check if the cpu is the i2s encoder and parse i2s data */
|
||||
+ if (gx_card_cpu_identify(dai_link->cpus, "I2S Encoder"))
|
||||
+ ret = gx_card_parse_i2s(card, np, index);
|
||||
+
|
||||
+ /* Or apply codec to codec params if necessary */
|
||||
+ else if (gx_card_cpu_identify(dai_link->cpus, "CODEC CTRL"))
|
||||
+ dai_link->params = &codec_params;
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static const struct meson_card_match_data gx_card_match_data = {
|
||||
+ .add_link = gx_card_add_link,
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id gx_card_of_match[] = {
|
||||
+ {
|
||||
+ .compatible = "amlogic,gx-sound-card",
|
||||
+ .data = &gx_card_match_data,
|
||||
+ }, {}
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, gx_card_of_match);
|
||||
+
|
||||
+static struct platform_driver gx_card_pdrv = {
|
||||
+ .probe = meson_card_probe,
|
||||
+ .remove = meson_card_remove,
|
||||
+ .driver = {
|
||||
+ .name = "gx-sound-card",
|
||||
+ .of_match_table = gx_card_of_match,
|
||||
+ },
|
||||
+};
|
||||
+module_platform_driver(gx_card_pdrv);
|
||||
+
|
||||
+MODULE_DESCRIPTION("Amlogic GX ALSA machine driver");
|
||||
+MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,32 +0,0 @@
|
||||
From feea12203ab6510323691e65967076d2cbd17c65 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Wed, 31 Jul 2019 14:39:55 +0200
|
||||
Subject: [PATCH 021/187] FROMGIT: soc: amlogic: meson-gx-socinfo: add A311D id
|
||||
|
||||
Add the SoC ID for the A311D Amlogic SoC.
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit 0baf212eab4daf8e4882afd624e1403846418610
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/drivers)
|
||||
---
|
||||
drivers/soc/amlogic/meson-gx-socinfo.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/soc/amlogic/meson-gx-socinfo.c b/drivers/soc/amlogic/meson-gx-socinfo.c
|
||||
index bca34954518e..ff86a75939e8 100644
|
||||
--- a/drivers/soc/amlogic/meson-gx-socinfo.c
|
||||
+++ b/drivers/soc/amlogic/meson-gx-socinfo.c
|
||||
@@ -65,6 +65,7 @@ static const struct meson_gx_package_id {
|
||||
{ "S905D2", 0x28, 0x10, 0xf0 },
|
||||
{ "S905X2", 0x28, 0x40, 0xf0 },
|
||||
{ "S922X", 0x29, 0x40, 0xf0 },
|
||||
+ { "A311D", 0x29, 0x10, 0xf0 },
|
||||
};
|
||||
|
||||
static inline unsigned int socinfo_to_major(u32 socinfo)
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 5c2913e476788639e41b07bbb8f60ee74a4a5db4 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Mon, 17 Feb 2020 02:47:55 +0000
|
||||
Subject: [PATCH 022/146] FROMGIT: ASoC: meson: aiu: remove unused encoder
|
||||
structure
|
||||
|
||||
Remove an unused structure definition which slipped through the initial
|
||||
driver submission.
|
||||
|
||||
Fixes: 6ae9ca9ce986 ("ASoC: meson: aiu: add i2s and spdif support")
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/aiu-encoder-i2s.c | 7 -------
|
||||
1 file changed, 7 deletions(-)
|
||||
|
||||
diff --git a/sound/soc/meson/aiu-encoder-i2s.c b/sound/soc/meson/aiu-encoder-i2s.c
|
||||
index 13bf029086a9..4900e38e7e49 100644
|
||||
--- a/sound/soc/meson/aiu-encoder-i2s.c
|
||||
+++ b/sound/soc/meson/aiu-encoder-i2s.c
|
||||
@@ -28,13 +28,6 @@
|
||||
#define AIU_CLK_CTRL_MORE_I2S_DIV GENMASK(5, 0)
|
||||
#define AIU_CODEC_DAC_LRCLK_CTRL_DIV GENMASK(11, 0)
|
||||
|
||||
-struct aiu_encoder_i2s {
|
||||
- struct clk *aoclk;
|
||||
- struct clk *mclk;
|
||||
- struct clk *mixer;
|
||||
- struct clk *pclk;
|
||||
-};
|
||||
-
|
||||
static void aiu_encoder_i2s_divider_enable(struct snd_soc_component *component,
|
||||
bool enable)
|
||||
{
|
||||
--
|
||||
2.17.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,31 @@
|
||||
From 1760f0adce918aae57e9cc292b10b891e55fb629 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Mon, 17 Feb 2020 02:51:14 +0000
|
||||
Subject: [PATCH 023/146] FROMGIT: ASoC: meson: aiu: fix clk bulk size
|
||||
allocation
|
||||
|
||||
Fix the size of allocated memory for the clock bulk data
|
||||
|
||||
Fixes: 6ae9ca9ce986 ("ASoC: meson: aiu: add i2s and spdif support")
|
||||
Reported-by: kbuild test robot <lkp@intel.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/aiu.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/sound/soc/meson/aiu.c b/sound/soc/meson/aiu.c
|
||||
index 5c4845a23a34..de678a9d5cab 100644
|
||||
--- a/sound/soc/meson/aiu.c
|
||||
+++ b/sound/soc/meson/aiu.c
|
||||
@@ -203,7 +203,7 @@ static int aiu_clk_bulk_get(struct device *dev,
|
||||
struct clk_bulk_data *clks;
|
||||
int i, ret;
|
||||
|
||||
- clks = devm_kcalloc(dev, num, sizeof(clks), GFP_KERNEL);
|
||||
+ clks = devm_kcalloc(dev, num, sizeof(*clks), GFP_KERNEL);
|
||||
if (!clks)
|
||||
return -ENOMEM;
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,40 +0,0 @@
|
||||
From 6eeca2e5b228ddb6a1bf6bd9476aeb1ebece3494 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Mon, 29 Jul 2019 15:26:18 +0200
|
||||
Subject: [PATCH 023/187] FROMGIT: arm64: dts: meson-g12-common: add pwm_a on
|
||||
GPIOE_2 pinmux
|
||||
|
||||
Add the ao_pinctrl subnode for the pwm_a function on GPIOE_2.
|
||||
|
||||
Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit a902d577cfb6c16f0108ad9d43fcc02cf90cfcda
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/dt64)
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
index 06e186ca41e3..38d70ce1cfc7 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
@@ -1970,6 +1970,14 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ pwm_a_e_pins: pwm-a-e {
|
||||
+ mux {
|
||||
+ groups = "pwm_a_e";
|
||||
+ function = "pwm_a_e";
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
pwm_ao_a_pins: pwm-ao-a {
|
||||
mux {
|
||||
groups = "pwm_ao_a";
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,59 @@
|
||||
From 94ffe149b3fcf237b440afc7475c5160ee050fe1 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Mon, 17 Feb 2020 02:52:13 +0000
|
||||
Subject: [PATCH 024/146] FROMGIT: ASoC: meson: aiu: fix irq registration
|
||||
|
||||
The aiu stored the irq in an unsigned integer which may have discarded an
|
||||
error returned by platform_get_irq_byname(). This is incorrect and should
|
||||
have been a signed integer.
|
||||
|
||||
Also drop the irq error traces from the probe function as this is already
|
||||
done by platform_get_irq_byname().
|
||||
|
||||
Fixes: 6ae9ca9ce986 ("ASoC: meson: aiu: add i2s and spdif support")
|
||||
Reported-by: kbuild test robot <lkp@intel.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/aiu.c | 8 ++------
|
||||
sound/soc/meson/aiu.h | 2 +-
|
||||
2 files changed, 3 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/sound/soc/meson/aiu.c b/sound/soc/meson/aiu.c
|
||||
index de678a9d5cab..34b40b8b8299 100644
|
||||
--- a/sound/soc/meson/aiu.c
|
||||
+++ b/sound/soc/meson/aiu.c
|
||||
@@ -314,16 +314,12 @@ static int aiu_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
aiu->i2s.irq = platform_get_irq_byname(pdev, "i2s");
|
||||
- if (aiu->i2s.irq < 0) {
|
||||
- dev_err(dev, "Can't get i2s irq\n");
|
||||
+ if (aiu->i2s.irq < 0)
|
||||
return aiu->i2s.irq;
|
||||
- }
|
||||
|
||||
aiu->spdif.irq = platform_get_irq_byname(pdev, "spdif");
|
||||
- if (aiu->spdif.irq < 0) {
|
||||
- dev_err(dev, "Can't get spdif irq\n");
|
||||
+ if (aiu->spdif.irq < 0)
|
||||
return aiu->spdif.irq;
|
||||
- }
|
||||
|
||||
ret = aiu_clk_get(dev);
|
||||
if (ret)
|
||||
diff --git a/sound/soc/meson/aiu.h b/sound/soc/meson/aiu.h
|
||||
index a65a576e3400..097c26de7b7c 100644
|
||||
--- a/sound/soc/meson/aiu.h
|
||||
+++ b/sound/soc/meson/aiu.h
|
||||
@@ -26,7 +26,7 @@ enum aiu_clk_ids {
|
||||
struct aiu_interface {
|
||||
struct clk_bulk_data *clks;
|
||||
unsigned int clk_num;
|
||||
- unsigned int irq;
|
||||
+ int irq;
|
||||
};
|
||||
|
||||
struct aiu {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,109 +0,0 @@
|
||||
From a24212b1377c4c7c224058bcd8eb73164e414ee7 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Mon, 29 Jul 2019 15:26:19 +0200
|
||||
Subject: [PATCH 024/187] FROMGIT: arm64: dts: meson-g12a: add cpus OPP table
|
||||
|
||||
Add the OPP table taken from the vendor u200 and u211 DTS.
|
||||
|
||||
The Amlogic G12A SoC seems to available in 3 types :
|
||||
- low-speed: up to 1,8GHz
|
||||
- mid-speed: up to 1,908GHz
|
||||
- high-speed: up to 2.1GHz
|
||||
|
||||
And the S905X2 opp voltages are slightly higher than the S905D2
|
||||
OPP voltages for the low-speed table.
|
||||
|
||||
This adds the conservative OPP table with the S905X2 higher voltages
|
||||
and the maximum low-speed OPP frequency.
|
||||
|
||||
The values were tested to be stable on an Amlogic U200 Reference Board,
|
||||
SeiRobotics SEI510 and X96 Max Set-Top-Boxes running the arm64 cpuburn
|
||||
at [1] and cycling between all the possible cpufreq translations and
|
||||
checking the final frequency using the clock-measurer, script at [2].
|
||||
|
||||
[1] https://github.com/ssvb/cpuburn-arm/blob/master/cpuburn-a53.S
|
||||
[2] https://gist.github.com/superna9999/d4de964dbc0f84b7d527e1df2ddea25f
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit 67444f6c8058e6103de719eb276a8999a18a6ad6
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/dt64)
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12a.dtsi | 60 +++++++++++++++++++++
|
||||
1 file changed, 60 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12a.dtsi
|
||||
index ac15967bb7fa..733a9d46fc4b 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12a.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12a.dtsi
|
||||
@@ -48,6 +48,66 @@
|
||||
compatible = "cache";
|
||||
};
|
||||
};
|
||||
+
|
||||
+ cpu_opp_table: opp-table {
|
||||
+ compatible = "operating-points-v2";
|
||||
+ opp-shared;
|
||||
+
|
||||
+ opp-100000000 {
|
||||
+ opp-hz = /bits/ 64 <100000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-250000000 {
|
||||
+ opp-hz = /bits/ 64 <250000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-500000000 {
|
||||
+ opp-hz = /bits/ 64 <500000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-667000000 {
|
||||
+ opp-hz = /bits/ 64 <666666666>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1000000000 {
|
||||
+ opp-hz = /bits/ 64 <1000000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1200000000 {
|
||||
+ opp-hz = /bits/ 64 <1200000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1398000000 {
|
||||
+ opp-hz = /bits/ 64 <1398000000>;
|
||||
+ opp-microvolt = <761000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1512000000 {
|
||||
+ opp-hz = /bits/ 64 <1512000000>;
|
||||
+ opp-microvolt = <791000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1608000000 {
|
||||
+ opp-hz = /bits/ 64 <1608000000>;
|
||||
+ opp-microvolt = <831000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1704000000 {
|
||||
+ opp-hz = /bits/ 64 <1704000000>;
|
||||
+ opp-microvolt = <861000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1800000000 {
|
||||
+ opp-hz = /bits/ 64 <1800000000>;
|
||||
+ opp-microvolt = <981000>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
&sd_emmc_a {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,30 @@
|
||||
From 1ba9f7539547f066632ac14ec70edff578392904 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Mon, 17 Feb 2020 02:53:13 +0000
|
||||
Subject: [PATCH 025/146] FROMGIT: ASoC: meson: aiu: fix acodec dai input name
|
||||
init
|
||||
|
||||
Remove the double initialization of the dai input name as reported by
|
||||
sparse.
|
||||
|
||||
Fixes: 65816025d461 ("ASoC: meson: aiu: add internal dac codec control support")
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/aiu-acodec-ctrl.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/sound/soc/meson/aiu-acodec-ctrl.c b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||
index 12d8a4d351a1..b8e88b1a4fc8 100644
|
||||
--- a/sound/soc/meson/aiu-acodec-ctrl.c
|
||||
+++ b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||
@@ -128,7 +128,6 @@ static const struct snd_soc_dai_ops aiu_acodec_ctrl_output_ops = {
|
||||
|
||||
#define AIU_ACODEC_INPUT(xname) { \
|
||||
.name = "ACODEC CTRL " xname, \
|
||||
- .name = xname, \
|
||||
.playback = AIU_ACODEC_STREAM(xname, "Playback", 8), \
|
||||
.ops = &aiu_acodec_ctrl_input_ops, \
|
||||
.probe = meson_codec_glue_input_dai_probe, \
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,270 +0,0 @@
|
||||
From 99f9913f183ca5cd957d1dfe2297e6279c0e4032 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Mon, 29 Jul 2019 15:26:20 +0200
|
||||
Subject: [PATCH 025/187] FROMGIT: arm64: dts: meson-g12a: enable DVFS on G12A
|
||||
boards
|
||||
|
||||
Enable DVFS for the U200, SEI520 and X96-Max Amlogic G12A based board
|
||||
by setting the clock, OPP and supply for each CPU cores.
|
||||
|
||||
The CPU cluster power supply can achieve 0.73V to 1.01V using a PWM
|
||||
output clocked at 800KHz with an inverse duty-cycle.
|
||||
|
||||
DVFS has been tested by running the arm64 cpuburn at [1] and cycling
|
||||
between all the possible cpufreq translations and checking the final
|
||||
frequency using the clock-measurer, script at [2].
|
||||
|
||||
[1] https://github.com/ssvb/cpuburn-arm/blob/master/cpuburn-a53.S
|
||||
[2] https://gist.github.com/superna9999/d4de964dbc0f84b7d527e1df2ddea25f
|
||||
|
||||
Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit 26328b18e2a1cffc92a32cc53c74bbca69ea7f60
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/dt64)
|
||||
---
|
||||
.../boot/dts/amlogic/meson-g12a-sei510.dts | 55 +++++++++++++++++++
|
||||
.../boot/dts/amlogic/meson-g12a-u200.dts | 54 ++++++++++++++++++
|
||||
.../boot/dts/amlogic/meson-g12a-x96-max.dts | 52 ++++++++++++++++++
|
||||
3 files changed, 161 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts
|
||||
index 12aa7eaeaf68..c9fa23a56562 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts
|
||||
@@ -129,6 +129,25 @@
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
+ vddcpu: regulator-vddcpu {
|
||||
+ /*
|
||||
+ * SY8120B1ABC DC/DC Regulator.
|
||||
+ */
|
||||
+ compatible = "pwm-regulator";
|
||||
+
|
||||
+ regulator-name = "VDDCPU";
|
||||
+ regulator-min-microvolt = <721000>;
|
||||
+ regulator-max-microvolt = <1022000>;
|
||||
+
|
||||
+ vin-supply = <&dc_in>;
|
||||
+
|
||||
+ pwms = <&pwm_AO_cd 1 1250 0>;
|
||||
+ pwm-dutycycle-range = <100 0>;
|
||||
+
|
||||
+ regulator-boot-on;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
vddio_ao1v8: regulator-vddio_ao1v8 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "VDDIO_AO1V8";
|
||||
@@ -297,6 +316,34 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&cpu0 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu1 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu2 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu3 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
&cvbs_vdac_port {
|
||||
cvbs_vdac_out: endpoint {
|
||||
remote-endpoint = <&cvbs_connector_in>;
|
||||
@@ -345,6 +392,14 @@
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
+&pwm_AO_cd {
|
||||
+ pinctrl-0 = <&pwm_ao_d_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin1";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&pwm_ef {
|
||||
status = "okay";
|
||||
pinctrl-0 = <&pwm_e_pins>;
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts
|
||||
index 8551fbd4a488..2a324f0136e3 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts
|
||||
@@ -129,6 +129,24 @@
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
+ vddcpu: regulator-vddcpu {
|
||||
+ /*
|
||||
+ * MP8756GD Regulator.
|
||||
+ */
|
||||
+ compatible = "pwm-regulator";
|
||||
+
|
||||
+ regulator-name = "VDDCPU";
|
||||
+ regulator-min-microvolt = <721000>;
|
||||
+ regulator-max-microvolt = <1022000>;
|
||||
+
|
||||
+ vin-supply = <&main_12v>;
|
||||
+
|
||||
+ pwms = <&pwm_AO_cd 1 1250 0>;
|
||||
+ pwm-dutycycle-range = <100 0>;
|
||||
+
|
||||
+ regulator-boot-on;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
};
|
||||
|
||||
&cec_AO {
|
||||
@@ -145,6 +163,34 @@
|
||||
hdmi-phandle = <&hdmi_tx>;
|
||||
};
|
||||
|
||||
+&cpu0 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu1 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu2 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu3 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
&cvbs_vdac_port {
|
||||
cvbs_vdac_out: endpoint {
|
||||
remote-endpoint = <&cvbs_connector_in>;
|
||||
@@ -197,6 +243,14 @@
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
+&pwm_AO_cd {
|
||||
+ pinctrl-0 = <&pwm_ao_d_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin1";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
/* SD card */
|
||||
&sd_emmc_b {
|
||||
status = "okay";
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts
|
||||
index fe4013cca876..c1e58a69d434 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts
|
||||
@@ -132,6 +132,22 @@
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
+ vddcpu: regulator-vddcpu {
|
||||
+ compatible = "pwm-regulator";
|
||||
+
|
||||
+ regulator-name = "VDDCPU";
|
||||
+ regulator-min-microvolt = <721000>;
|
||||
+ regulator-max-microvolt = <1022000>;
|
||||
+
|
||||
+ vin-supply = <&dc_in>;
|
||||
+
|
||||
+ pwms = <&pwm_AO_cd 1 1250 0>;
|
||||
+ pwm-dutycycle-range = <100 0>;
|
||||
+
|
||||
+ regulator-boot-on;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
sound {
|
||||
compatible = "amlogic,axg-sound-card";
|
||||
model = "G12A-X96-MAX";
|
||||
@@ -242,6 +258,34 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&cpu0 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu1 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu2 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu3 {
|
||||
+ cpu-supply = <&vddcpu>;
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
&cvbs_vdac_port {
|
||||
cvbs_vdac_out: endpoint {
|
||||
remote-endpoint = <&cvbs_connector_in>;
|
||||
@@ -279,6 +323,14 @@
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
+&pwm_AO_cd {
|
||||
+ pinctrl-0 = <&pwm_ao_d_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin1";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&ext_mdio {
|
||||
external_phy: ethernet-phy@0 {
|
||||
/* Realtek RTL8211F (0x001cc916) */
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,32 @@
|
||||
From 8c5b9df1893669b287e9203a15b6da099d59573e Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Mon, 17 Feb 2020 02:54:18 +0000
|
||||
Subject: [PATCH 026/146] FROMGIT: ASoC: meson: codec-glue: fix pcm format cast
|
||||
warning
|
||||
|
||||
Clarify the cast of snd_pcm_format_t and fix the sparse warning:
|
||||
restricted snd_pcm_format_t degrades to integer
|
||||
|
||||
Fixes: 9c29fd9bdf92 ("ASoC: meson: g12a: extract codec-to-codec utils")
|
||||
Reported-by: kbuild test robot <lkp@intel.com>
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/meson-codec-glue.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/sound/soc/meson/meson-codec-glue.c b/sound/soc/meson/meson-codec-glue.c
|
||||
index 97bbc967e176..524a33472337 100644
|
||||
--- a/sound/soc/meson/meson-codec-glue.c
|
||||
+++ b/sound/soc/meson/meson-codec-glue.c
|
||||
@@ -74,7 +74,7 @@ int meson_codec_glue_input_hw_params(struct snd_pcm_substream *substream,
|
||||
data->params.rates = snd_pcm_rate_to_rate_bit(params_rate(params));
|
||||
data->params.rate_min = params_rate(params);
|
||||
data->params.rate_max = params_rate(params);
|
||||
- data->params.formats = 1 << params_format(params);
|
||||
+ data->params.formats = 1ULL << (__force int) params_format(params);
|
||||
data->params.channels_min = params_channels(params);
|
||||
data->params.channels_max = params_channels(params);
|
||||
data->params.sig_bits = dai->driver->playback.sig_bits;
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,165 +0,0 @@
|
||||
From f2051f86046647f5a7ad39e271986553ae4e5ad7 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Mon, 29 Jul 2019 15:26:21 +0200
|
||||
Subject: [PATCH 026/187] FROMGIT: arm64: dts: meson-g12b: add cpus OPP tables
|
||||
|
||||
Add the OPP table taken from the HardKernel Odroid-N2 DTS.
|
||||
|
||||
The Amlogic G12B SoC seems to available in 2 types :
|
||||
- low-speed: Cortex-A73 Cluster up to 1,704GHz
|
||||
- high-speed: Cortex-A73 Cluster up to 2.208GHz
|
||||
|
||||
The Cortex-A73 Cluster can be clocked up to 1,896GHz for both types.
|
||||
|
||||
The Vendor Amlogic A311D OPP table are slighly different, with lower
|
||||
voltages than the HardKernel S922X tables but seems to be high-speed type.
|
||||
|
||||
This adds the conservative OPP table with the S922X higher voltages
|
||||
and the maximum low-speed OPP frequency.
|
||||
|
||||
The values were tested to be stable on an HardKernel Odroid-N2 board
|
||||
running the arm64 cpuburn at [1] and cycling between all the possible
|
||||
cpufreq translations for both clusters and checking the final frequency
|
||||
using the clock-measurer, script at [2].
|
||||
|
||||
[1] https://github.com/ssvb/cpuburn-arm/blob/master/cpuburn-a53.S
|
||||
[2] https://gist.github.com/superna9999/d4de964dbc0f84b7d527e1df2ddea25f
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit e53df01cf17faea76e29332b88b30ca02998fb3f
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/dt64)
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12b.dtsi | 115 ++++++++++++++++++++
|
||||
1 file changed, 115 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi
|
||||
index d5edbc1a1991..98ae8a7c8b41 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi
|
||||
@@ -95,6 +95,121 @@
|
||||
compatible = "cache";
|
||||
};
|
||||
};
|
||||
+
|
||||
+ cpu_opp_table_0: opp-table-0 {
|
||||
+ compatible = "operating-points-v2";
|
||||
+ opp-shared;
|
||||
+
|
||||
+ opp-100000000 {
|
||||
+ opp-hz = /bits/ 64 <100000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-250000000 {
|
||||
+ opp-hz = /bits/ 64 <250000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-500000000 {
|
||||
+ opp-hz = /bits/ 64 <500000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-666666666 {
|
||||
+ opp-hz = /bits/ 64 <666666666>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1000000000 {
|
||||
+ opp-hz = /bits/ 64 <1000000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1200000000 {
|
||||
+ opp-hz = /bits/ 64 <1200000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1398000000 {
|
||||
+ opp-hz = /bits/ 64 <1398000000>;
|
||||
+ opp-microvolt = <761000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1512000000 {
|
||||
+ opp-hz = /bits/ 64 <1512000000>;
|
||||
+ opp-microvolt = <791000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1608000000 {
|
||||
+ opp-hz = /bits/ 64 <1608000000>;
|
||||
+ opp-microvolt = <831000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1704000000 {
|
||||
+ opp-hz = /bits/ 64 <1704000000>;
|
||||
+ opp-microvolt = <861000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1896000000 {
|
||||
+ opp-hz = /bits/ 64 <1896000000>;
|
||||
+ opp-microvolt = <981000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cpub_opp_table_1: opp-table-1 {
|
||||
+ compatible = "operating-points-v2";
|
||||
+ opp-shared;
|
||||
+
|
||||
+ opp-100000000 {
|
||||
+ opp-hz = /bits/ 64 <100000000>;
|
||||
+ opp-microvolt = <751000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-250000000 {
|
||||
+ opp-hz = /bits/ 64 <250000000>;
|
||||
+ opp-microvolt = <751000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-500000000 {
|
||||
+ opp-hz = /bits/ 64 <500000000>;
|
||||
+ opp-microvolt = <751000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-666666666 {
|
||||
+ opp-hz = /bits/ 64 <666666666>;
|
||||
+ opp-microvolt = <751000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1000000000 {
|
||||
+ opp-hz = /bits/ 64 <1000000000>;
|
||||
+ opp-microvolt = <751000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1200000000 {
|
||||
+ opp-hz = /bits/ 64 <1200000000>;
|
||||
+ opp-microvolt = <771000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1398000000 {
|
||||
+ opp-hz = /bits/ 64 <1398000000>;
|
||||
+ opp-microvolt = <791000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1512000000 {
|
||||
+ opp-hz = /bits/ 64 <1512000000>;
|
||||
+ opp-microvolt = <821000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1608000000 {
|
||||
+ opp-hz = /bits/ 64 <1608000000>;
|
||||
+ opp-microvolt = <861000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1704000000 {
|
||||
+ opp-hz = /bits/ 64 <1704000000>;
|
||||
+ opp-microvolt = <891000>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
&clkc {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,113 @@
|
||||
From 9a99b4ea1ffa2c15a9c8b4b7ab483baa5d5d2075 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Mon, 17 Feb 2020 17:16:47 +0000
|
||||
Subject: [PATCH 027/146] FROMGIT: ASoC: meson: aiu: simplify component
|
||||
addition
|
||||
|
||||
Now that the component name is unique within ASoC, there is no need to
|
||||
hack the debugfs prefix to add more than one ASoC component to a linux
|
||||
device. Remove the unnecessary function and use
|
||||
snd_soc_register_component() directly.
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/aiu-acodec-ctrl.c | 7 +++----
|
||||
sound/soc/meson/aiu-codec-ctrl.c | 7 +++----
|
||||
sound/soc/meson/aiu.c | 20 --------------------
|
||||
sound/soc/meson/aiu.h | 8 --------
|
||||
4 files changed, 6 insertions(+), 36 deletions(-)
|
||||
|
||||
diff --git a/sound/soc/meson/aiu-acodec-ctrl.c b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||
index b8e88b1a4fc8..7078197e0cc5 100644
|
||||
--- a/sound/soc/meson/aiu-acodec-ctrl.c
|
||||
+++ b/sound/soc/meson/aiu-acodec-ctrl.c
|
||||
@@ -197,8 +197,7 @@ static const struct snd_soc_component_driver aiu_acodec_ctrl_component = {
|
||||
|
||||
int aiu_acodec_ctrl_register_component(struct device *dev)
|
||||
{
|
||||
- return aiu_add_component(dev, &aiu_acodec_ctrl_component,
|
||||
- aiu_acodec_ctrl_dai_drv,
|
||||
- ARRAY_SIZE(aiu_acodec_ctrl_dai_drv),
|
||||
- "acodec");
|
||||
+ return snd_soc_register_component(dev, &aiu_acodec_ctrl_component,
|
||||
+ aiu_acodec_ctrl_dai_drv,
|
||||
+ ARRAY_SIZE(aiu_acodec_ctrl_dai_drv));
|
||||
}
|
||||
diff --git a/sound/soc/meson/aiu-codec-ctrl.c b/sound/soc/meson/aiu-codec-ctrl.c
|
||||
index 8646a953e3b3..4b773d3e8b07 100644
|
||||
--- a/sound/soc/meson/aiu-codec-ctrl.c
|
||||
+++ b/sound/soc/meson/aiu-codec-ctrl.c
|
||||
@@ -144,9 +144,8 @@ static const struct snd_soc_component_driver aiu_hdmi_ctrl_component = {
|
||||
|
||||
int aiu_hdmi_ctrl_register_component(struct device *dev)
|
||||
{
|
||||
- return aiu_add_component(dev, &aiu_hdmi_ctrl_component,
|
||||
- aiu_hdmi_ctrl_dai_drv,
|
||||
- ARRAY_SIZE(aiu_hdmi_ctrl_dai_drv),
|
||||
- "hdmi");
|
||||
+ return snd_soc_register_component(dev, &aiu_hdmi_ctrl_component,
|
||||
+ aiu_hdmi_ctrl_dai_drv,
|
||||
+ ARRAY_SIZE(aiu_hdmi_ctrl_dai_drv));
|
||||
}
|
||||
|
||||
diff --git a/sound/soc/meson/aiu.c b/sound/soc/meson/aiu.c
|
||||
index 34b40b8b8299..d3e2d40e9562 100644
|
||||
--- a/sound/soc/meson/aiu.c
|
||||
+++ b/sound/soc/meson/aiu.c
|
||||
@@ -71,26 +71,6 @@ int aiu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-int aiu_add_component(struct device *dev,
|
||||
- const struct snd_soc_component_driver *component_driver,
|
||||
- struct snd_soc_dai_driver *dai_drv,
|
||||
- int num_dai,
|
||||
- const char *debugfs_prefix)
|
||||
-{
|
||||
- struct snd_soc_component *component;
|
||||
-
|
||||
- component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL);
|
||||
- if (!component)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
-#ifdef CONFIG_DEBUG_FS
|
||||
- component->debugfs_prefix = debugfs_prefix;
|
||||
-#endif
|
||||
-
|
||||
- return snd_soc_add_component(dev, component, component_driver,
|
||||
- dai_drv, num_dai);
|
||||
-}
|
||||
-
|
||||
static int aiu_cpu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||
struct of_phandle_args *args,
|
||||
const char **dai_name)
|
||||
diff --git a/sound/soc/meson/aiu.h b/sound/soc/meson/aiu.h
|
||||
index 097c26de7b7c..06a968c55728 100644
|
||||
--- a/sound/soc/meson/aiu.h
|
||||
+++ b/sound/soc/meson/aiu.h
|
||||
@@ -11,9 +11,7 @@ struct clk;
|
||||
struct clk_bulk_data;
|
||||
struct device;
|
||||
struct of_phandle_args;
|
||||
-struct snd_soc_component_driver;
|
||||
struct snd_soc_dai;
|
||||
-struct snd_soc_dai_driver;
|
||||
struct snd_soc_dai_ops;
|
||||
|
||||
enum aiu_clk_ids {
|
||||
@@ -45,12 +43,6 @@ int aiu_of_xlate_dai_name(struct snd_soc_component *component,
|
||||
const char **dai_name,
|
||||
unsigned int component_id);
|
||||
|
||||
-int aiu_add_component(struct device *dev,
|
||||
- const struct snd_soc_component_driver *component_driver,
|
||||
- struct snd_soc_dai_driver *dai_drv,
|
||||
- int num_dai,
|
||||
- const char *debugfs_prefix);
|
||||
-
|
||||
int aiu_hdmi_ctrl_register_component(struct device *dev);
|
||||
int aiu_acodec_ctrl_register_component(struct device *dev);
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,67 +0,0 @@
|
||||
From 790868826ea09c180ce83ffd24a1316a068378fc Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Thu, 18 Jul 2019 11:03:01 +0200
|
||||
Subject: [PATCH 027/187] FROMGIT: arm64: dts: meson: add ethernet fifo sizes
|
||||
|
||||
If unspecified in DT, the fifo sizes are not automatically detected by
|
||||
the dwmac1000 dma driver and the reported fifo sizes default to 0.
|
||||
Because of this, flow control will be turned off on the device.
|
||||
|
||||
Add the fifo sizes provided by the datasheets in the SoC in DT so
|
||||
flow control may be enabled if necessary.
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit af29074f707b7f6d07b2484abc62db35c42c38ec
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/dt64)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-axg.dtsi | 2 ++
|
||||
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 2 ++
|
||||
arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 2 ++
|
||||
3 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
|
||||
index 6219337033a0..12bf959c17a7 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
|
||||
@@ -182,6 +182,8 @@
|
||||
<&clkc CLKID_FCLK_DIV2>,
|
||||
<&clkc CLKID_MPLL2>;
|
||||
clock-names = "stmmaceth", "clkin0", "clkin1";
|
||||
+ rx-fifo-depth = <4096>;
|
||||
+ tx-fifo-depth = <2048>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
index 38d70ce1cfc7..27bb242dc95d 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
@@ -106,6 +106,8 @@
|
||||
<&clkc CLKID_FCLK_DIV2>,
|
||||
<&clkc CLKID_MPLL2>;
|
||||
clock-names = "stmmaceth", "clkin0", "clkin1";
|
||||
+ rx-fifo-depth = <4096>;
|
||||
+ tx-fifo-depth = <2048>;
|
||||
status = "disabled";
|
||||
|
||||
mdio0: mdio {
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
index 74d03fc706be..e62aad5bf867 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
@@ -493,6 +493,8 @@
|
||||
0x0 0xc8834540 0x0 0x4>;
|
||||
interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq";
|
||||
+ rx-fifo-depth = <4096>;
|
||||
+ tx-fifo-depth = <2048>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,33 @@
|
||||
From d7ed18c0cb5c844464928fb00e9dcb5e59fb0bd1 Mon Sep 17 00:00:00 2001
|
||||
From: Guillaume La Roque <glaroque@baylibre.com>
|
||||
Date: Fri, 17 Jan 2020 14:34:23 +0100
|
||||
Subject: [PATCH 028/146] FROMGIT: arm64: dts: meson-sm1-sei610: add missing
|
||||
interrupt-names
|
||||
|
||||
add missing "host-wakeup interrupt names
|
||||
|
||||
Fixes: 30388cc07572 ("arm64: dts: meson-sm1-sei610: add gpio bluetooth interrupt")
|
||||
|
||||
Signed-off-by: Guillaume La Roque <glaroque@baylibre.com>
|
||||
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Link: https://lore.kernel.org/r/20200117133423.22602-1-glaroque@baylibre.com
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts
|
||||
index a8bb3fa9fec9..cb1b48f5b8b1 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts
|
||||
@@ -593,6 +593,7 @@
|
||||
compatible = "brcm,bcm43438-bt";
|
||||
interrupt-parent = <&gpio_intc>;
|
||||
interrupts = <95 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interrupt-names = "host-wakeup";
|
||||
shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
|
||||
max-speed = <2000000>;
|
||||
clocks = <&wifi32k>;
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,34 +0,0 @@
|
||||
From b2f7fe5418b3a565c350bf0971f6e66f8ef8828b Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Wed, 31 Jul 2019 14:39:56 +0200
|
||||
Subject: [PATCH 028/187] FROMGIT: dt-bindings: arm: amlogic: add bindings for
|
||||
G12B based S922X SoC
|
||||
|
||||
Add a specific compatible for the Amlogic G12B family based S922X SoC
|
||||
to differentiate with the A311D SoC from the same family.
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Rob Herring <robh@kernel.org>
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit 5d2b173b89a02a6fc52217dc4d585c81b53d1d29
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/dt64)
|
||||
---
|
||||
Documentation/devicetree/bindings/arm/amlogic.yaml | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
index 325c6fd3566d..3c3bc806cd23 100644
|
||||
--- a/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
+++ b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
@@ -139,6 +139,7 @@ properties:
|
||||
items:
|
||||
- enum:
|
||||
- hardkernel,odroid-n2
|
||||
+ - const: amlogic,s922x
|
||||
- const: amlogic,g12b
|
||||
|
||||
...
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,38 +0,0 @@
|
||||
From f21c6919d27ee39a727196f7ee725828e96ae7aa Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Wed, 31 Jul 2019 14:39:57 +0200
|
||||
Subject: [PATCH 029/187] FROMGIT: dt-bindings: arm: amlogic: add bindings for
|
||||
the Amlogic G12B based A311D SoC
|
||||
|
||||
Add a specific compatible for the Amlogic G12B bases A311D SoC used
|
||||
in the Khadas VIM3.
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Rob Herring <robh@kernel.org>
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit 96561b0c5e4be51bb57df2cc388a1b688a93a036
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/dt64)
|
||||
---
|
||||
Documentation/devicetree/bindings/arm/amlogic.yaml | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
index 3c3bc806cd23..efa032d12402 100644
|
||||
--- a/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
+++ b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
@@ -135,6 +135,11 @@ properties:
|
||||
- amlogic,u200
|
||||
- const: amlogic,g12a
|
||||
|
||||
+ - description: Boards with the Amlogic Meson G12B A311D SoC
|
||||
+ items:
|
||||
+ - const: amlogic,a311d
|
||||
+ - const: amlogic,g12b
|
||||
+
|
||||
- description: Boards with the Amlogic Meson G12B S922X SoC
|
||||
items:
|
||||
- enum:
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,46 @@
|
||||
From 9c7dd0fbffecbe8ba36083c9e3a8d42a86016205 Mon Sep 17 00:00:00 2001
|
||||
From: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
Date: Wed, 15 Jan 2020 19:30:28 +0800
|
||||
Subject: [PATCH 029/146] FROMGIT: firmware: meson_sm: Add secure power domain
|
||||
support
|
||||
|
||||
The Amlogic Meson A1/C1 Secure Monitor implements calls to control power
|
||||
domain.
|
||||
|
||||
Signed-off-by: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Link: https://lore.kernel.org/r/1579087831-94965-2-git-send-email-jianxin.pan@amlogic.com
|
||||
---
|
||||
drivers/firmware/meson/meson_sm.c | 2 ++
|
||||
include/linux/firmware/meson/meson_sm.h | 2 ++
|
||||
2 files changed, 4 insertions(+)
|
||||
|
||||
diff --git a/drivers/firmware/meson/meson_sm.c b/drivers/firmware/meson/meson_sm.c
|
||||
index 1d5b4d74f96d..2854b56f6e0b 100644
|
||||
--- a/drivers/firmware/meson/meson_sm.c
|
||||
+++ b/drivers/firmware/meson/meson_sm.c
|
||||
@@ -44,6 +44,8 @@ static const struct meson_sm_chip gxbb_chip = {
|
||||
CMD(SM_EFUSE_WRITE, 0x82000031),
|
||||
CMD(SM_EFUSE_USER_MAX, 0x82000033),
|
||||
CMD(SM_GET_CHIP_ID, 0x82000044),
|
||||
+ CMD(SM_A1_PWRC_SET, 0x82000093),
|
||||
+ CMD(SM_A1_PWRC_GET, 0x82000095),
|
||||
{ /* sentinel */ },
|
||||
},
|
||||
};
|
||||
diff --git a/include/linux/firmware/meson/meson_sm.h b/include/linux/firmware/meson/meson_sm.h
|
||||
index 6669e2a1d5fd..95b0da2326a9 100644
|
||||
--- a/include/linux/firmware/meson/meson_sm.h
|
||||
+++ b/include/linux/firmware/meson/meson_sm.h
|
||||
@@ -12,6 +12,8 @@ enum {
|
||||
SM_EFUSE_WRITE,
|
||||
SM_EFUSE_USER_MAX,
|
||||
SM_GET_CHIP_ID,
|
||||
+ SM_A1_PWRC_SET,
|
||||
+ SM_A1_PWRC_GET,
|
||||
};
|
||||
|
||||
struct meson_sm_firmware;
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,61 +0,0 @@
|
||||
From a93a1727c5957498fe230578794e28489e09c005 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Wed, 31 Jul 2019 14:39:58 +0200
|
||||
Subject: [PATCH 030/187] FROMGIT: dt-bindings: arm: amlogic: add support for
|
||||
the Khadas VIM3
|
||||
|
||||
The Khadas VIM3 uses the Amlogic S922X or A311S SoC, both based on the
|
||||
Amlogic G12B SoC family, on a board with the same form factor as the
|
||||
VIM/VIM2 models. It ships in two variants; basic and
|
||||
pro which differ in RAM and eMMC size:
|
||||
|
||||
- 2GB (basic) or 4GB (pro) LPDDR4 RAM
|
||||
- 16GB (basic) or 32GB (pro) eMMC 5.1 storage
|
||||
- 16MB SPI flash
|
||||
- 10/100/1000 Base-T Ethernet
|
||||
- AP6398S Wireless (802.11 a/b/g/n/ac, BT5.0)
|
||||
- HDMI 2.1 video
|
||||
- 1x USB 2.0 + 1x USB 3.0 ports
|
||||
- 1x USB-C (power) with USB 2.0 OTG
|
||||
- 3x LED's (1x red, 1x blue, 1x white)
|
||||
- 3x buttons (power, function, reset)
|
||||
- IR receiver
|
||||
- M2 socket with PCIe, USB, ADC & I2C
|
||||
- 40pin GPIO Header
|
||||
- 1x micro SD card slot
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Rob Herring <robh@kernel.org>
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit edd55c0496b4bea6b2fa4b8f4646d06f47bb02d6
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/dt64)
|
||||
---
|
||||
Documentation/devicetree/bindings/arm/amlogic.yaml | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
index efa032d12402..04a2b0ef34c6 100644
|
||||
--- a/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
+++ b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
@@ -137,6 +137,8 @@ properties:
|
||||
|
||||
- description: Boards with the Amlogic Meson G12B A311D SoC
|
||||
items:
|
||||
+ - enum:
|
||||
+ - khadas,vim3
|
||||
- const: amlogic,a311d
|
||||
- const: amlogic,g12b
|
||||
|
||||
@@ -144,6 +146,7 @@ properties:
|
||||
items:
|
||||
- enum:
|
||||
- hardkernel,odroid-n2
|
||||
+ - khadas,vim3
|
||||
- const: amlogic,s922x
|
||||
- const: amlogic,g12b
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,110 @@
|
||||
From c09c38353f182231d63589ba32f6af56a3187dad Mon Sep 17 00:00:00 2001
|
||||
From: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
Date: Wed, 15 Jan 2020 19:30:29 +0800
|
||||
Subject: [PATCH 030/146] FROMGIT: dt-bindings: power: add Amlogic secure power
|
||||
domains bindings
|
||||
|
||||
Add the bindings for the Amlogic Secure power domains, controlling the
|
||||
secure power domains.
|
||||
|
||||
The bindings targets the Amlogic A1 and C1 compatible SoCs, in which the
|
||||
power domain registers are in secure world.
|
||||
|
||||
Signed-off-by: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Reviewed-by: Rob Herring <robh@kernel.org>
|
||||
Link: https://lore.kernel.org/r/1579087831-94965-3-git-send-email-jianxin.pan@amlogic.com
|
||||
---
|
||||
.../power/amlogic,meson-sec-pwrc.yaml | 40 +++++++++++++++++++
|
||||
include/dt-bindings/power/meson-a1-power.h | 32 +++++++++++++++
|
||||
2 files changed, 72 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/power/amlogic,meson-sec-pwrc.yaml
|
||||
create mode 100644 include/dt-bindings/power/meson-a1-power.h
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/power/amlogic,meson-sec-pwrc.yaml b/Documentation/devicetree/bindings/power/amlogic,meson-sec-pwrc.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..af32209218bb
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/power/amlogic,meson-sec-pwrc.yaml
|
||||
@@ -0,0 +1,40 @@
|
||||
+# SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+# Copyright (c) 2019 Amlogic, Inc
|
||||
+# Author: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: "http://devicetree.org/schemas/power/amlogic,meson-sec-pwrc.yaml#"
|
||||
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
+
|
||||
+title: Amlogic Meson Secure Power Domains
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
+
|
||||
+description: |+
|
||||
+ Secure Power Domains used in Meson A1/C1 SoCs, and should be the child node
|
||||
+ of secure-monitor.
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ enum:
|
||||
+ - amlogic,meson-a1-pwrc
|
||||
+
|
||||
+ "#power-domain-cells":
|
||||
+ const: 1
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - "#power-domain-cells"
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ secure-monitor {
|
||||
+ compatible = "amlogic,meson-gxbb-sm";
|
||||
+
|
||||
+ pwrc: power-controller {
|
||||
+ compatible = "amlogic,meson-a1-pwrc";
|
||||
+ #power-domain-cells = <1>;
|
||||
+ };
|
||||
+ }
|
||||
+
|
||||
diff --git a/include/dt-bindings/power/meson-a1-power.h b/include/dt-bindings/power/meson-a1-power.h
|
||||
new file mode 100644
|
||||
index 000000000000..6cf50bfb8ccf
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/power/meson-a1-power.h
|
||||
@@ -0,0 +1,32 @@
|
||||
+/* SPDX-License-Identifier: (GPL-2.0+ or MIT) */
|
||||
+/*
|
||||
+ * Copyright (c) 2019 Amlogic, Inc.
|
||||
+ * Author: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_MESON_A1_POWER_H
|
||||
+#define _DT_BINDINGS_MESON_A1_POWER_H
|
||||
+
|
||||
+#define PWRC_DSPA_ID 8
|
||||
+#define PWRC_DSPB_ID 9
|
||||
+#define PWRC_UART_ID 10
|
||||
+#define PWRC_DMC_ID 11
|
||||
+#define PWRC_I2C_ID 12
|
||||
+#define PWRC_PSRAM_ID 13
|
||||
+#define PWRC_ACODEC_ID 14
|
||||
+#define PWRC_AUDIO_ID 15
|
||||
+#define PWRC_OTP_ID 16
|
||||
+#define PWRC_DMA_ID 17
|
||||
+#define PWRC_SD_EMMC_ID 18
|
||||
+#define PWRC_RAMA_ID 19
|
||||
+#define PWRC_RAMB_ID 20
|
||||
+#define PWRC_IR_ID 21
|
||||
+#define PWRC_SPICC_ID 22
|
||||
+#define PWRC_SPIFC_ID 23
|
||||
+#define PWRC_USB_ID 24
|
||||
+#define PWRC_NIC_ID 25
|
||||
+#define PWRC_PDMIN_ID 26
|
||||
+#define PWRC_RSA_ID 27
|
||||
+#define PWRC_MAX_ID 28
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,455 +0,0 @@
|
||||
From 10204c18eca0f7d78ca76f7a880b13e770f10b48 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Wed, 31 Jul 2019 14:39:59 +0200
|
||||
Subject: [PATCH 031/187] FROMGIT: arm64: dts: meson-g12b: support a311d and
|
||||
s922x cpu operating points
|
||||
|
||||
Meson g12b ships with a low-speed (S922X) and high-speed (A311D) variant
|
||||
so remove cpu_opp_table nodes in meson-g12b.dtsi and create two new dtsi
|
||||
that can be included in device-specific dts files. Opp points were taken
|
||||
from the vendor BSP kernel.
|
||||
|
||||
Also make meson-g12b-odroid-n2.dts include the new meson-g12b-s922x.dtsi.
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
(cherry picked from commit 81f58a8b290787e52b4b919050f9093b13c485fa
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic.git v5.4/dt64)
|
||||
---
|
||||
.../boot/dts/amlogic/meson-g12b-a311d.dtsi | 149 ++++++++++++++++++
|
||||
.../boot/dts/amlogic/meson-g12b-odroid-n2.dts | 2 +-
|
||||
.../boot/dts/amlogic/meson-g12b-s922x.dtsi | 124 +++++++++++++++
|
||||
arch/arm64/boot/dts/amlogic/meson-g12b.dtsi | 115 --------------
|
||||
4 files changed, 274 insertions(+), 116 deletions(-)
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-s922x.dtsi
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi
|
||||
new file mode 100644
|
||||
index 000000000000..d61f43052a34
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi
|
||||
@@ -0,0 +1,149 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2019 BayLibre, SAS
|
||||
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||
+ */
|
||||
+
|
||||
+#include "meson-g12b.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ cpu_opp_table_0: opp-table-0 {
|
||||
+ compatible = "operating-points-v2";
|
||||
+ opp-shared;
|
||||
+
|
||||
+ opp-100000000 {
|
||||
+ opp-hz = /bits/ 64 <100000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-250000000 {
|
||||
+ opp-hz = /bits/ 64 <250000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-500000000 {
|
||||
+ opp-hz = /bits/ 64 <500000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-667000000 {
|
||||
+ opp-hz = /bits/ 64 <667000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1000000000 {
|
||||
+ opp-hz = /bits/ 64 <1000000000>;
|
||||
+ opp-microvolt = <761000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1200000000 {
|
||||
+ opp-hz = /bits/ 64 <1200000000>;
|
||||
+ opp-microvolt = <781000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1398000000 {
|
||||
+ opp-hz = /bits/ 64 <1398000000>;
|
||||
+ opp-microvolt = <811000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1512000000 {
|
||||
+ opp-hz = /bits/ 64 <1512000000>;
|
||||
+ opp-microvolt = <861000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1608000000 {
|
||||
+ opp-hz = /bits/ 64 <1608000000>;
|
||||
+ opp-microvolt = <901000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1704000000 {
|
||||
+ opp-hz = /bits/ 64 <1704000000>;
|
||||
+ opp-microvolt = <951000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1800000000 {
|
||||
+ opp-hz = /bits/ 64 <1800000000>;
|
||||
+ opp-microvolt = <1001000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cpub_opp_table_1: opp-table-1 {
|
||||
+ compatible = "operating-points-v2";
|
||||
+ opp-shared;
|
||||
+
|
||||
+ opp-100000000 {
|
||||
+ opp-hz = /bits/ 64 <100000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-250000000 {
|
||||
+ opp-hz = /bits/ 64 <250000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-500000000 {
|
||||
+ opp-hz = /bits/ 64 <500000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-667000000 {
|
||||
+ opp-hz = /bits/ 64 <667000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1000000000 {
|
||||
+ opp-hz = /bits/ 64 <1000000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1200000000 {
|
||||
+ opp-hz = /bits/ 64 <1200000000>;
|
||||
+ opp-microvolt = <751000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1398000000 {
|
||||
+ opp-hz = /bits/ 64 <1398000000>;
|
||||
+ opp-microvolt = <771000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1512000000 {
|
||||
+ opp-hz = /bits/ 64 <1512000000>;
|
||||
+ opp-microvolt = <771000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1608000000 {
|
||||
+ opp-hz = /bits/ 64 <1608000000>;
|
||||
+ opp-microvolt = <781000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1704000000 {
|
||||
+ opp-hz = /bits/ 64 <1704000000>;
|
||||
+ opp-microvolt = <791000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1800000000 {
|
||||
+ opp-hz = /bits/ 64 <1800000000>;
|
||||
+ opp-microvolt = <831000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1908000000 {
|
||||
+ opp-hz = /bits/ 64 <1908000000>;
|
||||
+ opp-microvolt = <861000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-2016000000 {
|
||||
+ opp-hz = /bits/ 64 <2016000000>;
|
||||
+ opp-microvolt = <911000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-2108000000 {
|
||||
+ opp-hz = /bits/ 64 <2108000000>;
|
||||
+ opp-microvolt = <951000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-2208000000 {
|
||||
+ opp-hz = /bits/ 64 <2208000000>;
|
||||
+ opp-microvolt = <1011000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts
|
||||
index 4e916e1f71f7..237adae0ffae 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
-#include "meson-g12b.dtsi"
|
||||
+#include "meson-g12b-s922x.dtsi"
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/gpio/meson-g12a-gpio.h>
|
||||
#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-s922x.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-s922x.dtsi
|
||||
new file mode 100644
|
||||
index 000000000000..046cc332d07f
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-s922x.dtsi
|
||||
@@ -0,0 +1,124 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2019 BayLibre, SAS
|
||||
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||
+ */
|
||||
+
|
||||
+#include "meson-g12b.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ cpu_opp_table_0: opp-table-0 {
|
||||
+ compatible = "operating-points-v2";
|
||||
+ opp-shared;
|
||||
+
|
||||
+ opp-100000000 {
|
||||
+ opp-hz = /bits/ 64 <100000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-250000000 {
|
||||
+ opp-hz = /bits/ 64 <250000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-500000000 {
|
||||
+ opp-hz = /bits/ 64 <500000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-667000000 {
|
||||
+ opp-hz = /bits/ 64 <667000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1000000000 {
|
||||
+ opp-hz = /bits/ 64 <1000000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1200000000 {
|
||||
+ opp-hz = /bits/ 64 <1200000000>;
|
||||
+ opp-microvolt = <731000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1398000000 {
|
||||
+ opp-hz = /bits/ 64 <1398000000>;
|
||||
+ opp-microvolt = <761000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1512000000 {
|
||||
+ opp-hz = /bits/ 64 <1512000000>;
|
||||
+ opp-microvolt = <791000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1608000000 {
|
||||
+ opp-hz = /bits/ 64 <1608000000>;
|
||||
+ opp-microvolt = <831000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1704000000 {
|
||||
+ opp-hz = /bits/ 64 <1704000000>;
|
||||
+ opp-microvolt = <861000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1896000000 {
|
||||
+ opp-hz = /bits/ 64 <1896000000>;
|
||||
+ opp-microvolt = <981000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cpub_opp_table_1: opp-table-1 {
|
||||
+ compatible = "operating-points-v2";
|
||||
+ opp-shared;
|
||||
+
|
||||
+ opp-100000000 {
|
||||
+ opp-hz = /bits/ 64 <100000000>;
|
||||
+ opp-microvolt = <751000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-250000000 {
|
||||
+ opp-hz = /bits/ 64 <250000000>;
|
||||
+ opp-microvolt = <751000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-500000000 {
|
||||
+ opp-hz = /bits/ 64 <500000000>;
|
||||
+ opp-microvolt = <751000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-667000000 {
|
||||
+ opp-hz = /bits/ 64 <667000000>;
|
||||
+ opp-microvolt = <751000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1000000000 {
|
||||
+ opp-hz = /bits/ 64 <1000000000>;
|
||||
+ opp-microvolt = <771000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1200000000 {
|
||||
+ opp-hz = /bits/ 64 <1200000000>;
|
||||
+ opp-microvolt = <771000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1398000000 {
|
||||
+ opp-hz = /bits/ 64 <1398000000>;
|
||||
+ opp-microvolt = <791000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1512000000 {
|
||||
+ opp-hz = /bits/ 64 <1512000000>;
|
||||
+ opp-microvolt = <821000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1608000000 {
|
||||
+ opp-hz = /bits/ 64 <1608000000>;
|
||||
+ opp-microvolt = <861000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1704000000 {
|
||||
+ opp-hz = /bits/ 64 <1704000000>;
|
||||
+ opp-microvolt = <891000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi
|
||||
index 98ae8a7c8b41..d5edbc1a1991 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi
|
||||
@@ -95,121 +95,6 @@
|
||||
compatible = "cache";
|
||||
};
|
||||
};
|
||||
-
|
||||
- cpu_opp_table_0: opp-table-0 {
|
||||
- compatible = "operating-points-v2";
|
||||
- opp-shared;
|
||||
-
|
||||
- opp-100000000 {
|
||||
- opp-hz = /bits/ 64 <100000000>;
|
||||
- opp-microvolt = <731000>;
|
||||
- };
|
||||
-
|
||||
- opp-250000000 {
|
||||
- opp-hz = /bits/ 64 <250000000>;
|
||||
- opp-microvolt = <731000>;
|
||||
- };
|
||||
-
|
||||
- opp-500000000 {
|
||||
- opp-hz = /bits/ 64 <500000000>;
|
||||
- opp-microvolt = <731000>;
|
||||
- };
|
||||
-
|
||||
- opp-666666666 {
|
||||
- opp-hz = /bits/ 64 <666666666>;
|
||||
- opp-microvolt = <731000>;
|
||||
- };
|
||||
-
|
||||
- opp-1000000000 {
|
||||
- opp-hz = /bits/ 64 <1000000000>;
|
||||
- opp-microvolt = <731000>;
|
||||
- };
|
||||
-
|
||||
- opp-1200000000 {
|
||||
- opp-hz = /bits/ 64 <1200000000>;
|
||||
- opp-microvolt = <731000>;
|
||||
- };
|
||||
-
|
||||
- opp-1398000000 {
|
||||
- opp-hz = /bits/ 64 <1398000000>;
|
||||
- opp-microvolt = <761000>;
|
||||
- };
|
||||
-
|
||||
- opp-1512000000 {
|
||||
- opp-hz = /bits/ 64 <1512000000>;
|
||||
- opp-microvolt = <791000>;
|
||||
- };
|
||||
-
|
||||
- opp-1608000000 {
|
||||
- opp-hz = /bits/ 64 <1608000000>;
|
||||
- opp-microvolt = <831000>;
|
||||
- };
|
||||
-
|
||||
- opp-1704000000 {
|
||||
- opp-hz = /bits/ 64 <1704000000>;
|
||||
- opp-microvolt = <861000>;
|
||||
- };
|
||||
-
|
||||
- opp-1896000000 {
|
||||
- opp-hz = /bits/ 64 <1896000000>;
|
||||
- opp-microvolt = <981000>;
|
||||
- };
|
||||
- };
|
||||
-
|
||||
- cpub_opp_table_1: opp-table-1 {
|
||||
- compatible = "operating-points-v2";
|
||||
- opp-shared;
|
||||
-
|
||||
- opp-100000000 {
|
||||
- opp-hz = /bits/ 64 <100000000>;
|
||||
- opp-microvolt = <751000>;
|
||||
- };
|
||||
-
|
||||
- opp-250000000 {
|
||||
- opp-hz = /bits/ 64 <250000000>;
|
||||
- opp-microvolt = <751000>;
|
||||
- };
|
||||
-
|
||||
- opp-500000000 {
|
||||
- opp-hz = /bits/ 64 <500000000>;
|
||||
- opp-microvolt = <751000>;
|
||||
- };
|
||||
-
|
||||
- opp-666666666 {
|
||||
- opp-hz = /bits/ 64 <666666666>;
|
||||
- opp-microvolt = <751000>;
|
||||
- };
|
||||
-
|
||||
- opp-1000000000 {
|
||||
- opp-hz = /bits/ 64 <1000000000>;
|
||||
- opp-microvolt = <751000>;
|
||||
- };
|
||||
-
|
||||
- opp-1200000000 {
|
||||
- opp-hz = /bits/ 64 <1200000000>;
|
||||
- opp-microvolt = <771000>;
|
||||
- };
|
||||
-
|
||||
- opp-1398000000 {
|
||||
- opp-hz = /bits/ 64 <1398000000>;
|
||||
- opp-microvolt = <791000>;
|
||||
- };
|
||||
-
|
||||
- opp-1512000000 {
|
||||
- opp-hz = /bits/ 64 <1512000000>;
|
||||
- opp-microvolt = <821000>;
|
||||
- };
|
||||
-
|
||||
- opp-1608000000 {
|
||||
- opp-hz = /bits/ 64 <1608000000>;
|
||||
- opp-microvolt = <861000>;
|
||||
- };
|
||||
-
|
||||
- opp-1704000000 {
|
||||
- opp-hz = /bits/ 64 <1704000000>;
|
||||
- opp-microvolt = <891000>;
|
||||
- };
|
||||
- };
|
||||
};
|
||||
|
||||
&clkc {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,265 @@
|
||||
From 8d1db083028d67823dc8339cb801bb832304aac2 Mon Sep 17 00:00:00 2001
|
||||
From: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
Date: Wed, 15 Jan 2020 19:30:30 +0800
|
||||
Subject: [PATCH 031/146] FROMGIT: soc: amlogic: Add support for Secure power
|
||||
domains controller
|
||||
|
||||
Add support for the Amlogic Secure Power controller. In A1/C1 series, power
|
||||
control registers are in secure domain, and should be accessed by smc.
|
||||
|
||||
Signed-off-by: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Link: https://lore.kernel.org/r/1579087831-94965-4-git-send-email-jianxin.pan@amlogic.com
|
||||
---
|
||||
drivers/soc/amlogic/Kconfig | 13 ++
|
||||
drivers/soc/amlogic/Makefile | 1 +
|
||||
drivers/soc/amlogic/meson-secure-pwrc.c | 204 ++++++++++++++++++++++++
|
||||
3 files changed, 218 insertions(+)
|
||||
create mode 100644 drivers/soc/amlogic/meson-secure-pwrc.c
|
||||
|
||||
diff --git a/drivers/soc/amlogic/Kconfig b/drivers/soc/amlogic/Kconfig
|
||||
index bc2c912949bd..6cb06e7b5e63 100644
|
||||
--- a/drivers/soc/amlogic/Kconfig
|
||||
+++ b/drivers/soc/amlogic/Kconfig
|
||||
@@ -48,6 +48,19 @@ config MESON_EE_PM_DOMAINS
|
||||
Say yes to expose Amlogic Meson Everything-Else Power Domains as
|
||||
Generic Power Domains.
|
||||
|
||||
+config MESON_SECURE_PM_DOMAINS
|
||||
+ bool "Amlogic Meson Secure Power Domains driver"
|
||||
+ depends on ARCH_MESON || COMPILE_TEST
|
||||
+ depends on PM && OF
|
||||
+ depends on HAVE_ARM_SMCCC
|
||||
+ default ARCH_MESON
|
||||
+ select PM_GENERIC_DOMAINS
|
||||
+ select PM_GENERIC_DOMAINS_OF
|
||||
+ help
|
||||
+ Support for the power controller on Amlogic A1/C1 series.
|
||||
+ Say yes to expose Amlogic Meson Secure Power Domains as Generic
|
||||
+ Power Domains.
|
||||
+
|
||||
config MESON_MX_SOCINFO
|
||||
bool "Amlogic Meson MX SoC Information driver"
|
||||
depends on ARCH_MESON || COMPILE_TEST
|
||||
diff --git a/drivers/soc/amlogic/Makefile b/drivers/soc/amlogic/Makefile
|
||||
index de79d044b545..7b8c5d323f5c 100644
|
||||
--- a/drivers/soc/amlogic/Makefile
|
||||
+++ b/drivers/soc/amlogic/Makefile
|
||||
@@ -5,3 +5,4 @@ obj-$(CONFIG_MESON_GX_SOCINFO) += meson-gx-socinfo.o
|
||||
obj-$(CONFIG_MESON_GX_PM_DOMAINS) += meson-gx-pwrc-vpu.o
|
||||
obj-$(CONFIG_MESON_MX_SOCINFO) += meson-mx-socinfo.o
|
||||
obj-$(CONFIG_MESON_EE_PM_DOMAINS) += meson-ee-pwrc.o
|
||||
+obj-$(CONFIG_MESON_SECURE_PM_DOMAINS) += meson-secure-pwrc.o
|
||||
diff --git a/drivers/soc/amlogic/meson-secure-pwrc.c b/drivers/soc/amlogic/meson-secure-pwrc.c
|
||||
new file mode 100644
|
||||
index 000000000000..5fb29a475879
|
||||
--- /dev/null
|
||||
+++ b/drivers/soc/amlogic/meson-secure-pwrc.c
|
||||
@@ -0,0 +1,204 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2019 Amlogic, Inc.
|
||||
+ * Author: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
+ */
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/pm_domain.h>
|
||||
+#include <dt-bindings/power/meson-a1-power.h>
|
||||
+#include <linux/arm-smccc.h>
|
||||
+#include <linux/firmware/meson/meson_sm.h>
|
||||
+
|
||||
+#define PWRC_ON 1
|
||||
+#define PWRC_OFF 0
|
||||
+
|
||||
+struct meson_secure_pwrc_domain {
|
||||
+ struct generic_pm_domain base;
|
||||
+ unsigned int index;
|
||||
+ struct meson_secure_pwrc *pwrc;
|
||||
+};
|
||||
+
|
||||
+struct meson_secure_pwrc {
|
||||
+ struct meson_secure_pwrc_domain *domains;
|
||||
+ struct genpd_onecell_data xlate;
|
||||
+ struct meson_sm_firmware *fw;
|
||||
+};
|
||||
+
|
||||
+struct meson_secure_pwrc_domain_desc {
|
||||
+ unsigned int index;
|
||||
+ unsigned int flags;
|
||||
+ char *name;
|
||||
+ bool (*is_off)(struct meson_secure_pwrc_domain *pwrc_domain);
|
||||
+};
|
||||
+
|
||||
+struct meson_secure_pwrc_domain_data {
|
||||
+ unsigned int count;
|
||||
+ struct meson_secure_pwrc_domain_desc *domains;
|
||||
+};
|
||||
+
|
||||
+static bool pwrc_secure_is_off(struct meson_secure_pwrc_domain *pwrc_domain)
|
||||
+{
|
||||
+ int is_off = 1;
|
||||
+
|
||||
+ if (meson_sm_call(pwrc_domain->pwrc->fw, SM_A1_PWRC_GET, &is_off,
|
||||
+ pwrc_domain->index, 0, 0, 0, 0) < 0)
|
||||
+ pr_err("failed to get power domain status\n");
|
||||
+
|
||||
+ return is_off;
|
||||
+}
|
||||
+
|
||||
+static int meson_secure_pwrc_off(struct generic_pm_domain *domain)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+ struct meson_secure_pwrc_domain *pwrc_domain =
|
||||
+ container_of(domain, struct meson_secure_pwrc_domain, base);
|
||||
+
|
||||
+ if (meson_sm_call(pwrc_domain->pwrc->fw, SM_A1_PWRC_SET, NULL,
|
||||
+ pwrc_domain->index, PWRC_OFF, 0, 0, 0) < 0) {
|
||||
+ pr_err("failed to set power domain off\n");
|
||||
+ ret = -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int meson_secure_pwrc_on(struct generic_pm_domain *domain)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+ struct meson_secure_pwrc_domain *pwrc_domain =
|
||||
+ container_of(domain, struct meson_secure_pwrc_domain, base);
|
||||
+
|
||||
+ if (meson_sm_call(pwrc_domain->pwrc->fw, SM_A1_PWRC_SET, NULL,
|
||||
+ pwrc_domain->index, PWRC_ON, 0, 0, 0) < 0) {
|
||||
+ pr_err("failed to set power domain on\n");
|
||||
+ ret = -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+#define SEC_PD(__name, __flag) \
|
||||
+[PWRC_##__name##_ID] = \
|
||||
+{ \
|
||||
+ .name = #__name, \
|
||||
+ .index = PWRC_##__name##_ID, \
|
||||
+ .is_off = pwrc_secure_is_off, \
|
||||
+ .flags = __flag, \
|
||||
+}
|
||||
+
|
||||
+static struct meson_secure_pwrc_domain_desc a1_pwrc_domains[] = {
|
||||
+ SEC_PD(DSPA, 0),
|
||||
+ SEC_PD(DSPB, 0),
|
||||
+ /* UART should keep working in ATF after suspend and before resume */
|
||||
+ SEC_PD(UART, GENPD_FLAG_ALWAYS_ON),
|
||||
+ /* DMC is for DDR PHY ana/dig and DMC, and should be always on */
|
||||
+ SEC_PD(DMC, GENPD_FLAG_ALWAYS_ON),
|
||||
+ SEC_PD(I2C, 0),
|
||||
+ SEC_PD(PSRAM, 0),
|
||||
+ SEC_PD(ACODEC, 0),
|
||||
+ SEC_PD(AUDIO, 0),
|
||||
+ SEC_PD(OTP, 0),
|
||||
+ SEC_PD(DMA, 0),
|
||||
+ SEC_PD(SD_EMMC, 0),
|
||||
+ SEC_PD(RAMA, 0),
|
||||
+ /* SRAMB is used as ATF runtime memory, and should be always on */
|
||||
+ SEC_PD(RAMB, GENPD_FLAG_ALWAYS_ON),
|
||||
+ SEC_PD(IR, 0),
|
||||
+ SEC_PD(SPICC, 0),
|
||||
+ SEC_PD(SPIFC, 0),
|
||||
+ SEC_PD(USB, 0),
|
||||
+ /* NIC is for the Arm NIC-400 interconnect, and should be always on */
|
||||
+ SEC_PD(NIC, GENPD_FLAG_ALWAYS_ON),
|
||||
+ SEC_PD(PDMIN, 0),
|
||||
+ SEC_PD(RSA, 0),
|
||||
+};
|
||||
+
|
||||
+static int meson_secure_pwrc_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ int i;
|
||||
+ struct device_node *sm_np;
|
||||
+ struct meson_secure_pwrc *pwrc;
|
||||
+ const struct meson_secure_pwrc_domain_data *match;
|
||||
+
|
||||
+ match = of_device_get_match_data(&pdev->dev);
|
||||
+ if (!match) {
|
||||
+ dev_err(&pdev->dev, "failed to get match data\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ sm_np = of_find_compatible_node(NULL, NULL, "amlogic,meson-gxbb-sm");
|
||||
+ if (!sm_np) {
|
||||
+ dev_err(&pdev->dev, "no secure-monitor node\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ pwrc = devm_kzalloc(&pdev->dev, sizeof(*pwrc), GFP_KERNEL);
|
||||
+ if (!pwrc)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ pwrc->fw = meson_sm_get(sm_np);
|
||||
+ of_node_put(sm_np);
|
||||
+ if (!pwrc->fw)
|
||||
+ return -EPROBE_DEFER;
|
||||
+
|
||||
+ pwrc->xlate.domains = devm_kcalloc(&pdev->dev, match->count,
|
||||
+ sizeof(*pwrc->xlate.domains),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!pwrc->xlate.domains)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ pwrc->domains = devm_kcalloc(&pdev->dev, match->count,
|
||||
+ sizeof(*pwrc->domains), GFP_KERNEL);
|
||||
+ if (!pwrc->domains)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ pwrc->xlate.num_domains = match->count;
|
||||
+ platform_set_drvdata(pdev, pwrc);
|
||||
+
|
||||
+ for (i = 0 ; i < match->count ; ++i) {
|
||||
+ struct meson_secure_pwrc_domain *dom = &pwrc->domains[i];
|
||||
+
|
||||
+ if (!match->domains[i].index)
|
||||
+ continue;
|
||||
+
|
||||
+ dom->pwrc = pwrc;
|
||||
+ dom->index = match->domains[i].index;
|
||||
+ dom->base.name = match->domains[i].name;
|
||||
+ dom->base.flags = match->domains[i].flags;
|
||||
+ dom->base.power_on = meson_secure_pwrc_on;
|
||||
+ dom->base.power_off = meson_secure_pwrc_off;
|
||||
+
|
||||
+ pm_genpd_init(&dom->base, NULL, match->domains[i].is_off(dom));
|
||||
+
|
||||
+ pwrc->xlate.domains[i] = &dom->base;
|
||||
+ }
|
||||
+
|
||||
+ return of_genpd_add_provider_onecell(pdev->dev.of_node, &pwrc->xlate);
|
||||
+}
|
||||
+
|
||||
+static struct meson_secure_pwrc_domain_data meson_secure_a1_pwrc_data = {
|
||||
+ .domains = a1_pwrc_domains,
|
||||
+ .count = ARRAY_SIZE(a1_pwrc_domains),
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id meson_secure_pwrc_match_table[] = {
|
||||
+ {
|
||||
+ .compatible = "amlogic,meson-a1-pwrc",
|
||||
+ .data = &meson_secure_a1_pwrc_data,
|
||||
+ },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+
|
||||
+static struct platform_driver meson_secure_pwrc_driver = {
|
||||
+ .probe = meson_secure_pwrc_probe,
|
||||
+ .driver = {
|
||||
+ .name = "meson_secure_pwrc",
|
||||
+ .of_match_table = meson_secure_pwrc_match_table,
|
||||
+ },
|
||||
+};
|
||||
+builtin_platform_driver(meson_secure_pwrc_driver);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 0b4093fcfeaa133997436a41542042ebdc94d31b Mon Sep 17 00:00:00 2001
|
||||
From: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
Date: Wed, 15 Jan 2020 19:30:31 +0800
|
||||
Subject: [PATCH 032/146] FROMGIT: arm64: dts: meson: a1: add secure power
|
||||
domain controller
|
||||
|
||||
Enable power domain controller for Meson A1 SoC.
|
||||
|
||||
Signed-off-by: Jianxin Pan <jianxin.pan@amlogic.com>
|
||||
Link: https://lore.kernel.org/r/1579087831-94965-5-git-send-email-jianxin.pan@amlogic.com
|
||||
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-a1.dtsi | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-a1.dtsi b/arch/arm64/boot/dts/amlogic/meson-a1.dtsi
|
||||
index 4dec518c4dde..755b4ad15184 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-a1.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-a1.dtsi
|
||||
@@ -60,6 +60,12 @@
|
||||
|
||||
sm: secure-monitor {
|
||||
compatible = "amlogic,meson-gxbb-sm";
|
||||
+
|
||||
+ pwrc: power-controller {
|
||||
+ compatible = "amlogic,meson-a1-pwrc";
|
||||
+ #power-domain-cells = <1>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
};
|
||||
|
||||
soc {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,63 +0,0 @@
|
||||
From c506544def4b07d05664a3054b519de69d3ec8ef Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Mon, 29 Jul 2019 14:58:38 +0200
|
||||
Subject: [PATCH 032/187] FROMGIT: pinctrl: meson-g12a: add pwm_a on GPIOE_2
|
||||
pinmux
|
||||
|
||||
Add the missing pinmux for the pwm_a function on the GPIOE_2 pin.
|
||||
|
||||
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
||||
Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Link: https://lore.kernel.org/r/20190729125838.6498-1-narmstrong@baylibre.com
|
||||
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
(cherry picked from commit 726e8d813771ed9c714d75c9ce58a97b9ddf343d
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git for-next)
|
||||
---
|
||||
drivers/pinctrl/meson/pinctrl-meson-g12a.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/drivers/pinctrl/meson/pinctrl-meson-g12a.c b/drivers/pinctrl/meson/pinctrl-meson-g12a.c
|
||||
index 3475cd7bd2af..582665fd362a 100644
|
||||
--- a/drivers/pinctrl/meson/pinctrl-meson-g12a.c
|
||||
+++ b/drivers/pinctrl/meson/pinctrl-meson-g12a.c
|
||||
@@ -801,6 +801,9 @@ static const unsigned int remote_ao_input_pins[] = { GPIOAO_5 };
|
||||
/* ir_out */
|
||||
static const unsigned int remote_ao_out_pins[] = { GPIOAO_4 };
|
||||
|
||||
+/* pwm_a_e */
|
||||
+static const unsigned int pwm_a_e_pins[] = { GPIOE_2 };
|
||||
+
|
||||
/* pwm_ao_a */
|
||||
static const unsigned int pwm_ao_a_pins[] = { GPIOAO_11 };
|
||||
static const unsigned int pwm_ao_a_hiz_pins[] = { GPIOAO_11 };
|
||||
@@ -888,6 +891,7 @@ static struct meson_pmx_group meson_g12a_aobus_groups[] = {
|
||||
GROUP(i2c_ao_slave_sda, 3),
|
||||
GROUP(remote_ao_input, 1),
|
||||
GROUP(remote_ao_out, 1),
|
||||
+ GROUP(pwm_a_e, 3),
|
||||
GROUP(pwm_ao_a, 3),
|
||||
GROUP(pwm_ao_a_hiz, 2),
|
||||
GROUP(pwm_ao_b, 3),
|
||||
@@ -1192,6 +1196,10 @@ static const char * const remote_ao_out_groups[] = {
|
||||
"remote_ao_out",
|
||||
};
|
||||
|
||||
+static const char * const pwm_a_e_groups[] = {
|
||||
+ "pwm_a_e",
|
||||
+};
|
||||
+
|
||||
static const char * const pwm_ao_a_groups[] = {
|
||||
"pwm_ao_a", "pwm_ao_a_hiz",
|
||||
};
|
||||
@@ -1290,6 +1298,7 @@ static struct meson_pmx_func meson_g12a_aobus_functions[] = {
|
||||
FUNCTION(i2c_ao_slave),
|
||||
FUNCTION(remote_ao_input),
|
||||
FUNCTION(remote_ao_out),
|
||||
+ FUNCTION(pwm_a_e),
|
||||
FUNCTION(pwm_ao_a),
|
||||
FUNCTION(pwm_ao_b),
|
||||
FUNCTION(pwm_ao_c),
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,52 +0,0 @@
|
||||
From 67ceba95531744f1217262ff2ad8259e58ace4a6 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Mon, 1 Jul 2019 06:47:01 -0400
|
||||
Subject: [PATCH 033/187] FROMGIT: media: dt-bindings: media: meson-ao-cec: add
|
||||
SM1 compatible
|
||||
|
||||
Add AO-CEC compatible string for the Amlogic SM1 SoC family,
|
||||
a derivate of the G12A AO-CECB controller.
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Reviewed-by: Rob Herring <robh@kernel.org>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
|
||||
(cherry picked from commit 9bef0d1d053de8db30bc07aa132c0ee94a05609c
|
||||
git://linuxtv.org/media_tree.git master)
|
||||
---
|
||||
Documentation/devicetree/bindings/media/meson-ao-cec.txt | 8 +++++---
|
||||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/media/meson-ao-cec.txt b/Documentation/devicetree/bindings/media/meson-ao-cec.txt
|
||||
index c67fc41d4aa2..ad92ee41c0dd 100644
|
||||
--- a/Documentation/devicetree/bindings/media/meson-ao-cec.txt
|
||||
+++ b/Documentation/devicetree/bindings/media/meson-ao-cec.txt
|
||||
@@ -5,10 +5,12 @@ to handle communication between HDMI connected devices over the CEC bus.
|
||||
|
||||
Required properties:
|
||||
- compatible : value should be following depending on the SoC :
|
||||
- For GXBB, GXL, GXM and G12A (AO_CEC_A module) :
|
||||
+ For GXBB, GXL, GXM, G12A and SM1 (AO_CEC_A module) :
|
||||
"amlogic,meson-gx-ao-cec"
|
||||
For G12A (AO_CEC_B module) :
|
||||
"amlogic,meson-g12a-ao-cec"
|
||||
+ For SM1 (AO_CEC_B module) :
|
||||
+ "amlogic,meson-sm1-ao-cec"
|
||||
|
||||
- reg : Physical base address of the IP registers and length of memory
|
||||
mapped region.
|
||||
@@ -16,9 +18,9 @@ Required properties:
|
||||
- interrupts : AO-CEC interrupt number to the CPU.
|
||||
- clocks : from common clock binding: handle to AO-CEC clock.
|
||||
- clock-names : from common clock binding, must contain :
|
||||
- For GXBB, GXL, GXM and G12A (AO_CEC_A module) :
|
||||
+ For GXBB, GXL, GXM, G12A and SM1 (AO_CEC_A module) :
|
||||
- "core"
|
||||
- For G12A (AO_CEC_B module) :
|
||||
+ For G12A, SM1 (AO_CEC_B module) :
|
||||
- "oscin"
|
||||
corresponding to entry in the clocks property.
|
||||
- hdmi-phandle: phandle to the HDMI controller
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,7 +1,7 @@
|
||||
From 75d004308fdbad58bf576ca3f20f605d0a3e6668 Mon Sep 17 00:00:00 2001
|
||||
From f346db4e5460337ece11280792aae0f7064a072f Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Mon, 13 May 2019 14:45:31 +0200
|
||||
Subject: [PATCH 067/187] FROMLIST: clk: meson: g12a: fix gp0 and hifi ranges
|
||||
Date: Fri, 15 Feb 2019 14:21:27 +0100
|
||||
Subject: [PATCH 033/146] WIP: clk: meson: g12a: fix gp0 and hifi ranges
|
||||
|
||||
While some SoC samples are able to lock with a PLL factor of 55, others
|
||||
samples can't. ATM, a minimum of 60 appears to work on all the samples
|
||||
@ -16,16 +16,15 @@ It is still unclear if the range was the only reason for the delay.
|
||||
|
||||
Fixes: 085a4ea93d54 ("clk: meson: g12a: add peripheral clock controller")
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/clk/meson/g12a.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c
|
||||
index c3f0ffc3280d..e6011d18a719 100644
|
||||
index d2760a021301..cd1de3e004e4 100644
|
||||
--- a/drivers/clk/meson/g12a.c
|
||||
+++ b/drivers/clk/meson/g12a.c
|
||||
@@ -1362,7 +1362,7 @@ static struct clk_regmap g12b_cpub_clk_trace = {
|
||||
@@ -1591,7 +1591,7 @@ static struct clk_regmap g12b_cpub_clk_trace = {
|
||||
};
|
||||
|
||||
static const struct pll_mult_range g12a_gp0_pll_mult_range = {
|
@ -1,107 +0,0 @@
|
||||
From 26d7eba2afa7827f7d3cdab82f60bfc063e5406b Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Mon, 1 Jul 2019 06:47:02 -0400
|
||||
Subject: [PATCH 034/187] FROMGIT: media: platform: meson-ao-cec-g12a: add
|
||||
support for SM1
|
||||
|
||||
Add support for the Amlogic SM1 SoC Family to the G12A AO-CECB
|
||||
derivative.
|
||||
|
||||
It only adds a single init register.
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
[hverkuil-cisco@xs4all.nl: dropped spurious newline]
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
|
||||
(cherry picked from commit aef5f47c9907ed6bfe9245124279b9c049077fd7
|
||||
git://linuxtv.org/media_tree.git master)
|
||||
---
|
||||
drivers/media/platform/meson/ao-cec-g12a.c | 36 +++++++++++++++++++++-
|
||||
1 file changed, 35 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/media/platform/meson/ao-cec-g12a.c b/drivers/media/platform/meson/ao-cec-g12a.c
|
||||
index fb52e5dd044a..d302eae569b3 100644
|
||||
--- a/drivers/media/platform/meson/ao-cec-g12a.c
|
||||
+++ b/drivers/media/platform/meson/ao-cec-g12a.c
|
||||
@@ -121,6 +121,9 @@
|
||||
#define CECB_CTRL_TYPE_NEXT 2
|
||||
|
||||
#define CECB_CTRL2 0x01
|
||||
+
|
||||
+#define CECB_CTRL2_RISE_DEL_MAX GENMASK(4, 0)
|
||||
+
|
||||
#define CECB_INTR_MASK 0x02
|
||||
#define CECB_LADD_LOW 0x05
|
||||
#define CECB_LADD_HIGH 0x06
|
||||
@@ -165,6 +168,11 @@
|
||||
|
||||
#define CECB_WAKEUPCTRL 0x31
|
||||
|
||||
+struct meson_ao_cec_g12a_data {
|
||||
+ /* Setup the internal CECB_CTRL2 register */
|
||||
+ bool ctrl2_setup;
|
||||
+};
|
||||
+
|
||||
struct meson_ao_cec_g12a_device {
|
||||
struct platform_device *pdev;
|
||||
struct regmap *regmap;
|
||||
@@ -175,6 +183,7 @@ struct meson_ao_cec_g12a_device {
|
||||
struct cec_msg rx_msg;
|
||||
struct clk *oscin;
|
||||
struct clk *core;
|
||||
+ const struct meson_ao_cec_g12a_data *data;
|
||||
};
|
||||
|
||||
static const struct regmap_config meson_ao_cec_g12a_regmap_conf = {
|
||||
@@ -605,6 +614,10 @@ static int meson_ao_cec_g12a_adap_enable(struct cec_adapter *adap, bool enable)
|
||||
regmap_update_bits(ao_cec->regmap, CECB_GEN_CNTL_REG,
|
||||
CECB_GEN_CNTL_RESET, 0);
|
||||
|
||||
+ if (ao_cec->data->ctrl2_setup)
|
||||
+ regmap_write(ao_cec->regmap_cec, CECB_CTRL2,
|
||||
+ FIELD_PREP(CECB_CTRL2_RISE_DEL_MAX, 2));
|
||||
+
|
||||
meson_ao_cec_g12a_irq_setup(ao_cec, true);
|
||||
|
||||
return 0;
|
||||
@@ -632,6 +645,12 @@ static int meson_ao_cec_g12a_probe(struct platform_device *pdev)
|
||||
if (!ao_cec)
|
||||
return -ENOMEM;
|
||||
|
||||
+ ao_cec->data = of_device_get_match_data(&pdev->dev);
|
||||
+ if (!ao_cec->data) {
|
||||
+ dev_err(&pdev->dev, "failed to get match data\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
spin_lock_init(&ao_cec->cec_reg_lock);
|
||||
ao_cec->pdev = pdev;
|
||||
|
||||
@@ -742,8 +761,23 @@ static int meson_ao_cec_g12a_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static const struct meson_ao_cec_g12a_data ao_cec_g12a_data = {
|
||||
+ .ctrl2_setup = false,
|
||||
+};
|
||||
+
|
||||
+static const struct meson_ao_cec_g12a_data ao_cec_sm1_data = {
|
||||
+ .ctrl2_setup = true,
|
||||
+};
|
||||
+
|
||||
static const struct of_device_id meson_ao_cec_g12a_of_match[] = {
|
||||
- { .compatible = "amlogic,meson-g12a-ao-cec", },
|
||||
+ {
|
||||
+ .compatible = "amlogic,meson-g12a-ao-cec",
|
||||
+ .data = &ao_cec_g12a_data,
|
||||
+ },
|
||||
+ {
|
||||
+ .compatible = "amlogic,meson-sm1-ao-cec",
|
||||
+ .data = &ao_cec_sm1_data,
|
||||
+ },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, meson_ao_cec_g12a_of_match);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,79 @@
|
||||
From db99ae06c558d1e9b1ab00c078294ee5448e61af Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Tue, 28 Jan 2020 13:38:38 +0100
|
||||
Subject: [PATCH 034/146] FROMLIST: ASoC: meson: add t9015 internal codec
|
||||
binding documentation
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
.../bindings/sound/amlogic,t9015.yaml | 58 +++++++++++++++++++
|
||||
1 file changed, 58 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,t9015.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,t9015.yaml b/Documentation/devicetree/bindings/sound/amlogic,t9015.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..b7c38c2b5b54
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,t9015.yaml
|
||||
@@ -0,0 +1,58 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,t9015.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic T9015 Internal Audio DAC
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ $nodename:
|
||||
+ pattern: "^audio-controller@.*"
|
||||
+
|
||||
+ "#sound-dai-cells":
|
||||
+ const: 0
|
||||
+
|
||||
+ compatible:
|
||||
+ items:
|
||||
+ - const: amlogic,t9015
|
||||
+
|
||||
+ clocks:
|
||||
+ items:
|
||||
+ - description: Peripheral clock
|
||||
+
|
||||
+ clock-names:
|
||||
+ items:
|
||||
+ - const: pclk
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ resets:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+required:
|
||||
+ - "#sound-dai-cells"
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+ - resets
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/clock/g12a-clkc.h>
|
||||
+ #include <dt-bindings/reset/amlogic,meson-g12a-reset.h>
|
||||
+
|
||||
+ acodec: audio-controller@32000 {
|
||||
+ compatible = "amlogic,t9015";
|
||||
+ reg = <0x0 0x32000 0x0 0x14>;
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ clocks = <&clkc CLKID_AUDIO_CODEC>;
|
||||
+ clock-names = "pclk";
|
||||
+ resets = <&reset RESET_AUDIO_CODEC>;
|
||||
+ };
|
||||
+
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,574 +0,0 @@
|
||||
From e44570b26f3585a403194ca5124d4f815ca4f181 Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:32:12 +0900
|
||||
Subject: [PATCH 035/187] FROMGIT: ASoC: add soc-dai.c
|
||||
|
||||
Current ALSA SoC has many snd_soc_dai_xxx() function which is
|
||||
using dai->driver->ops->xxx.
|
||||
But, some of them are implemented as snd_soc_dai_xxx(),
|
||||
but others are directly using dai->driver->ops->xxx.
|
||||
Because of it, the code is not easy to read.
|
||||
|
||||
This patch creats new soc-dai.c and moves snd_soc_dai_xxx()
|
||||
functions into it.
|
||||
One exception is snd_soc_dai_is_dummy() which is based on
|
||||
soc-utils local variable. We need to keep it as-is there.
|
||||
|
||||
Others which is directly using dai->driver->ops->xxx will be
|
||||
implemented at soc-dai.c by incremental patches.
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/871ryij1r6.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit 06f6e1d41427f394ad3f67ecf06efcd28a46932c
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
sound/soc/Makefile | 2 +-
|
||||
sound/soc/soc-core.c | 243 -----------------------------------------
|
||||
sound/soc/soc-dai.c | 254 +++++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 255 insertions(+), 244 deletions(-)
|
||||
create mode 100644 sound/soc/soc-dai.c
|
||||
|
||||
diff --git a/sound/soc/Makefile b/sound/soc/Makefile
|
||||
index d90ce8a32887..919c3c027c62 100644
|
||||
--- a/sound/soc/Makefile
|
||||
+++ b/sound/soc/Makefile
|
||||
@@ -1,5 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
-snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-utils.o
|
||||
+snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-utils.o soc-dai.o
|
||||
snd-soc-core-objs += soc-pcm.o soc-io.o soc-devres.o soc-ops.o
|
||||
snd-soc-core-$(CONFIG_SND_SOC_COMPRESS) += soc-compress.o
|
||||
|
||||
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
|
||||
index 44f899b970c2..a8d2c4ec0ec9 100644
|
||||
--- a/sound/soc/soc-core.c
|
||||
+++ b/sound/soc/soc-core.c
|
||||
@@ -2397,26 +2397,6 @@ int snd_soc_add_dai_controls(struct snd_soc_dai *dai,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls);
|
||||
|
||||
-/**
|
||||
- * snd_soc_dai_set_sysclk - configure DAI system or master clock.
|
||||
- * @dai: DAI
|
||||
- * @clk_id: DAI specific clock ID
|
||||
- * @freq: new clock frequency in Hz
|
||||
- * @dir: new clock direction - input/output.
|
||||
- *
|
||||
- * Configures the DAI master (MCLK) or system (SYSCLK) clocking.
|
||||
- */
|
||||
-int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
|
||||
- unsigned int freq, int dir)
|
||||
-{
|
||||
- if (dai->driver->ops->set_sysclk)
|
||||
- return dai->driver->ops->set_sysclk(dai, clk_id, freq, dir);
|
||||
-
|
||||
- return snd_soc_component_set_sysclk(dai->component, clk_id, 0,
|
||||
- freq, dir);
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk);
|
||||
-
|
||||
/**
|
||||
* snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
|
||||
* @component: COMPONENT
|
||||
@@ -2439,48 +2419,6 @@ int snd_soc_component_set_sysclk(struct snd_soc_component *component,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk);
|
||||
|
||||
-/**
|
||||
- * snd_soc_dai_set_clkdiv - configure DAI clock dividers.
|
||||
- * @dai: DAI
|
||||
- * @div_id: DAI specific clock divider ID
|
||||
- * @div: new clock divisor.
|
||||
- *
|
||||
- * Configures the clock dividers. This is used to derive the best DAI bit and
|
||||
- * frame clocks from the system or master clock. It's best to set the DAI bit
|
||||
- * and frame clocks as low as possible to save system power.
|
||||
- */
|
||||
-int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
|
||||
- int div_id, int div)
|
||||
-{
|
||||
- if (dai->driver->ops->set_clkdiv)
|
||||
- return dai->driver->ops->set_clkdiv(dai, div_id, div);
|
||||
- else
|
||||
- return -EINVAL;
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(snd_soc_dai_set_clkdiv);
|
||||
-
|
||||
-/**
|
||||
- * snd_soc_dai_set_pll - configure DAI PLL.
|
||||
- * @dai: DAI
|
||||
- * @pll_id: DAI specific PLL ID
|
||||
- * @source: DAI specific source for the PLL
|
||||
- * @freq_in: PLL input clock frequency in Hz
|
||||
- * @freq_out: requested PLL output clock frequency in Hz
|
||||
- *
|
||||
- * Configures and enables PLL to generate output clock based on input clock.
|
||||
- */
|
||||
-int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source,
|
||||
- unsigned int freq_in, unsigned int freq_out)
|
||||
-{
|
||||
- if (dai->driver->ops->set_pll)
|
||||
- return dai->driver->ops->set_pll(dai, pll_id, source,
|
||||
- freq_in, freq_out);
|
||||
-
|
||||
- return snd_soc_component_set_pll(dai->component, pll_id, source,
|
||||
- freq_in, freq_out);
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll);
|
||||
-
|
||||
/*
|
||||
* snd_soc_component_set_pll - configure component PLL.
|
||||
* @component: COMPONENT
|
||||
@@ -2503,187 +2441,6 @@ int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_set_pll);
|
||||
|
||||
-/**
|
||||
- * snd_soc_dai_set_bclk_ratio - configure BCLK to sample rate ratio.
|
||||
- * @dai: DAI
|
||||
- * @ratio: Ratio of BCLK to Sample rate.
|
||||
- *
|
||||
- * Configures the DAI for a preset BCLK to sample rate ratio.
|
||||
- */
|
||||
-int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
|
||||
-{
|
||||
- if (dai->driver->ops->set_bclk_ratio)
|
||||
- return dai->driver->ops->set_bclk_ratio(dai, ratio);
|
||||
- else
|
||||
- return -EINVAL;
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(snd_soc_dai_set_bclk_ratio);
|
||||
-
|
||||
-/**
|
||||
- * snd_soc_dai_set_fmt - configure DAI hardware audio format.
|
||||
- * @dai: DAI
|
||||
- * @fmt: SND_SOC_DAIFMT_* format value.
|
||||
- *
|
||||
- * Configures the DAI hardware format and clocking.
|
||||
- */
|
||||
-int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
-{
|
||||
- if (dai->driver->ops->set_fmt == NULL)
|
||||
- return -ENOTSUPP;
|
||||
- return dai->driver->ops->set_fmt(dai, fmt);
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt);
|
||||
-
|
||||
-/**
|
||||
- * snd_soc_xlate_tdm_slot - generate tx/rx slot mask.
|
||||
- * @slots: Number of slots in use.
|
||||
- * @tx_mask: bitmask representing active TX slots.
|
||||
- * @rx_mask: bitmask representing active RX slots.
|
||||
- *
|
||||
- * Generates the TDM tx and rx slot default masks for DAI.
|
||||
- */
|
||||
-static int snd_soc_xlate_tdm_slot_mask(unsigned int slots,
|
||||
- unsigned int *tx_mask,
|
||||
- unsigned int *rx_mask)
|
||||
-{
|
||||
- if (*tx_mask || *rx_mask)
|
||||
- return 0;
|
||||
-
|
||||
- if (!slots)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- *tx_mask = (1 << slots) - 1;
|
||||
- *rx_mask = (1 << slots) - 1;
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
- * snd_soc_dai_set_tdm_slot() - Configures a DAI for TDM operation
|
||||
- * @dai: The DAI to configure
|
||||
- * @tx_mask: bitmask representing active TX slots.
|
||||
- * @rx_mask: bitmask representing active RX slots.
|
||||
- * @slots: Number of slots in use.
|
||||
- * @slot_width: Width in bits for each slot.
|
||||
- *
|
||||
- * This function configures the specified DAI for TDM operation. @slot contains
|
||||
- * the total number of slots of the TDM stream and @slot_with the width of each
|
||||
- * slot in bit clock cycles. @tx_mask and @rx_mask are bitmasks specifying the
|
||||
- * active slots of the TDM stream for the specified DAI, i.e. which slots the
|
||||
- * DAI should write to or read from. If a bit is set the corresponding slot is
|
||||
- * active, if a bit is cleared the corresponding slot is inactive. Bit 0 maps to
|
||||
- * the first slot, bit 1 to the second slot and so on. The first active slot
|
||||
- * maps to the first channel of the DAI, the second active slot to the second
|
||||
- * channel and so on.
|
||||
- *
|
||||
- * TDM mode can be disabled by passing 0 for @slots. In this case @tx_mask,
|
||||
- * @rx_mask and @slot_width will be ignored.
|
||||
- *
|
||||
- * Returns 0 on success, a negative error code otherwise.
|
||||
- */
|
||||
-int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
|
||||
- unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
|
||||
-{
|
||||
- if (dai->driver->ops->xlate_tdm_slot_mask)
|
||||
- dai->driver->ops->xlate_tdm_slot_mask(slots,
|
||||
- &tx_mask, &rx_mask);
|
||||
- else
|
||||
- snd_soc_xlate_tdm_slot_mask(slots, &tx_mask, &rx_mask);
|
||||
-
|
||||
- dai->tx_mask = tx_mask;
|
||||
- dai->rx_mask = rx_mask;
|
||||
-
|
||||
- if (dai->driver->ops->set_tdm_slot)
|
||||
- return dai->driver->ops->set_tdm_slot(dai, tx_mask, rx_mask,
|
||||
- slots, slot_width);
|
||||
- else
|
||||
- return -ENOTSUPP;
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(snd_soc_dai_set_tdm_slot);
|
||||
-
|
||||
-/**
|
||||
- * snd_soc_dai_set_channel_map - configure DAI audio channel map
|
||||
- * @dai: DAI
|
||||
- * @tx_num: how many TX channels
|
||||
- * @tx_slot: pointer to an array which imply the TX slot number channel
|
||||
- * 0~num-1 uses
|
||||
- * @rx_num: how many RX channels
|
||||
- * @rx_slot: pointer to an array which imply the RX slot number channel
|
||||
- * 0~num-1 uses
|
||||
- *
|
||||
- * configure the relationship between channel number and TDM slot number.
|
||||
- */
|
||||
-int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,
|
||||
- unsigned int tx_num, unsigned int *tx_slot,
|
||||
- unsigned int rx_num, unsigned int *rx_slot)
|
||||
-{
|
||||
- if (dai->driver->ops->set_channel_map)
|
||||
- return dai->driver->ops->set_channel_map(dai, tx_num, tx_slot,
|
||||
- rx_num, rx_slot);
|
||||
- else
|
||||
- return -ENOTSUPP;
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(snd_soc_dai_set_channel_map);
|
||||
-
|
||||
-/**
|
||||
- * snd_soc_dai_get_channel_map - Get DAI audio channel map
|
||||
- * @dai: DAI
|
||||
- * @tx_num: how many TX channels
|
||||
- * @tx_slot: pointer to an array which imply the TX slot number channel
|
||||
- * 0~num-1 uses
|
||||
- * @rx_num: how many RX channels
|
||||
- * @rx_slot: pointer to an array which imply the RX slot number channel
|
||||
- * 0~num-1 uses
|
||||
- */
|
||||
-int snd_soc_dai_get_channel_map(struct snd_soc_dai *dai,
|
||||
- unsigned int *tx_num, unsigned int *tx_slot,
|
||||
- unsigned int *rx_num, unsigned int *rx_slot)
|
||||
-{
|
||||
- if (dai->driver->ops->get_channel_map)
|
||||
- return dai->driver->ops->get_channel_map(dai, tx_num, tx_slot,
|
||||
- rx_num, rx_slot);
|
||||
- else
|
||||
- return -ENOTSUPP;
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(snd_soc_dai_get_channel_map);
|
||||
-
|
||||
-/**
|
||||
- * snd_soc_dai_set_tristate - configure DAI system or master clock.
|
||||
- * @dai: DAI
|
||||
- * @tristate: tristate enable
|
||||
- *
|
||||
- * Tristates the DAI so that others can use it.
|
||||
- */
|
||||
-int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate)
|
||||
-{
|
||||
- if (dai->driver->ops->set_tristate)
|
||||
- return dai->driver->ops->set_tristate(dai, tristate);
|
||||
- else
|
||||
- return -EINVAL;
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(snd_soc_dai_set_tristate);
|
||||
-
|
||||
-/**
|
||||
- * snd_soc_dai_digital_mute - configure DAI system or master clock.
|
||||
- * @dai: DAI
|
||||
- * @mute: mute enable
|
||||
- * @direction: stream to mute
|
||||
- *
|
||||
- * Mutes the DAI DAC.
|
||||
- */
|
||||
-int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
|
||||
- int direction)
|
||||
-{
|
||||
- if (dai->driver->ops->mute_stream)
|
||||
- return dai->driver->ops->mute_stream(dai, mute, direction);
|
||||
- else if (direction == SNDRV_PCM_STREAM_PLAYBACK &&
|
||||
- dai->driver->ops->digital_mute)
|
||||
- return dai->driver->ops->digital_mute(dai, mute);
|
||||
- else
|
||||
- return -ENOTSUPP;
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute);
|
||||
-
|
||||
static int snd_soc_bind_card(struct snd_soc_card *card)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd;
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
new file mode 100644
|
||||
index 000000000000..a1009ead40de
|
||||
--- /dev/null
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -0,0 +1,254 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+//
|
||||
+// soc-dai.c
|
||||
+//
|
||||
+// Copyright (C) 2019 Renesas Electronics Corp.
|
||||
+// Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
+//
|
||||
+
|
||||
+#include <sound/soc.h>
|
||||
+#include <sound/soc-dai.h>
|
||||
+
|
||||
+/**
|
||||
+ * snd_soc_dai_set_sysclk - configure DAI system or master clock.
|
||||
+ * @dai: DAI
|
||||
+ * @clk_id: DAI specific clock ID
|
||||
+ * @freq: new clock frequency in Hz
|
||||
+ * @dir: new clock direction - input/output.
|
||||
+ *
|
||||
+ * Configures the DAI master (MCLK) or system (SYSCLK) clocking.
|
||||
+ */
|
||||
+int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
|
||||
+ unsigned int freq, int dir)
|
||||
+{
|
||||
+ if (dai->driver->ops->set_sysclk)
|
||||
+ return dai->driver->ops->set_sysclk(dai, clk_id, freq, dir);
|
||||
+
|
||||
+ return snd_soc_component_set_sysclk(dai->component, clk_id, 0,
|
||||
+ freq, dir);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk);
|
||||
+
|
||||
+/**
|
||||
+ * snd_soc_dai_set_clkdiv - configure DAI clock dividers.
|
||||
+ * @dai: DAI
|
||||
+ * @div_id: DAI specific clock divider ID
|
||||
+ * @div: new clock divisor.
|
||||
+ *
|
||||
+ * Configures the clock dividers. This is used to derive the best DAI bit and
|
||||
+ * frame clocks from the system or master clock. It's best to set the DAI bit
|
||||
+ * and frame clocks as low as possible to save system power.
|
||||
+ */
|
||||
+int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
|
||||
+ int div_id, int div)
|
||||
+{
|
||||
+ if (dai->driver->ops->set_clkdiv)
|
||||
+ return dai->driver->ops->set_clkdiv(dai, div_id, div);
|
||||
+ else
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(snd_soc_dai_set_clkdiv);
|
||||
+
|
||||
+/**
|
||||
+ * snd_soc_dai_set_pll - configure DAI PLL.
|
||||
+ * @dai: DAI
|
||||
+ * @pll_id: DAI specific PLL ID
|
||||
+ * @source: DAI specific source for the PLL
|
||||
+ * @freq_in: PLL input clock frequency in Hz
|
||||
+ * @freq_out: requested PLL output clock frequency in Hz
|
||||
+ *
|
||||
+ * Configures and enables PLL to generate output clock based on input clock.
|
||||
+ */
|
||||
+int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source,
|
||||
+ unsigned int freq_in, unsigned int freq_out)
|
||||
+{
|
||||
+ if (dai->driver->ops->set_pll)
|
||||
+ return dai->driver->ops->set_pll(dai, pll_id, source,
|
||||
+ freq_in, freq_out);
|
||||
+
|
||||
+ return snd_soc_component_set_pll(dai->component, pll_id, source,
|
||||
+ freq_in, freq_out);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll);
|
||||
+
|
||||
+/**
|
||||
+ * snd_soc_dai_set_bclk_ratio - configure BCLK to sample rate ratio.
|
||||
+ * @dai: DAI
|
||||
+ * @ratio: Ratio of BCLK to Sample rate.
|
||||
+ *
|
||||
+ * Configures the DAI for a preset BCLK to sample rate ratio.
|
||||
+ */
|
||||
+int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
|
||||
+{
|
||||
+ if (dai->driver->ops->set_bclk_ratio)
|
||||
+ return dai->driver->ops->set_bclk_ratio(dai, ratio);
|
||||
+ else
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(snd_soc_dai_set_bclk_ratio);
|
||||
+
|
||||
+/**
|
||||
+ * snd_soc_dai_set_fmt - configure DAI hardware audio format.
|
||||
+ * @dai: DAI
|
||||
+ * @fmt: SND_SOC_DAIFMT_* format value.
|
||||
+ *
|
||||
+ * Configures the DAI hardware format and clocking.
|
||||
+ */
|
||||
+int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
+{
|
||||
+ if (dai->driver->ops->set_fmt == NULL)
|
||||
+ return -ENOTSUPP;
|
||||
+ return dai->driver->ops->set_fmt(dai, fmt);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt);
|
||||
+
|
||||
+/**
|
||||
+ * snd_soc_xlate_tdm_slot - generate tx/rx slot mask.
|
||||
+ * @slots: Number of slots in use.
|
||||
+ * @tx_mask: bitmask representing active TX slots.
|
||||
+ * @rx_mask: bitmask representing active RX slots.
|
||||
+ *
|
||||
+ * Generates the TDM tx and rx slot default masks for DAI.
|
||||
+ */
|
||||
+static int snd_soc_xlate_tdm_slot_mask(unsigned int slots,
|
||||
+ unsigned int *tx_mask,
|
||||
+ unsigned int *rx_mask)
|
||||
+{
|
||||
+ if (*tx_mask || *rx_mask)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (!slots)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ *tx_mask = (1 << slots) - 1;
|
||||
+ *rx_mask = (1 << slots) - 1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * snd_soc_dai_set_tdm_slot() - Configures a DAI for TDM operation
|
||||
+ * @dai: The DAI to configure
|
||||
+ * @tx_mask: bitmask representing active TX slots.
|
||||
+ * @rx_mask: bitmask representing active RX slots.
|
||||
+ * @slots: Number of slots in use.
|
||||
+ * @slot_width: Width in bits for each slot.
|
||||
+ *
|
||||
+ * This function configures the specified DAI for TDM operation. @slot contains
|
||||
+ * the total number of slots of the TDM stream and @slot_with the width of each
|
||||
+ * slot in bit clock cycles. @tx_mask and @rx_mask are bitmasks specifying the
|
||||
+ * active slots of the TDM stream for the specified DAI, i.e. which slots the
|
||||
+ * DAI should write to or read from. If a bit is set the corresponding slot is
|
||||
+ * active, if a bit is cleared the corresponding slot is inactive. Bit 0 maps to
|
||||
+ * the first slot, bit 1 to the second slot and so on. The first active slot
|
||||
+ * maps to the first channel of the DAI, the second active slot to the second
|
||||
+ * channel and so on.
|
||||
+ *
|
||||
+ * TDM mode can be disabled by passing 0 for @slots. In this case @tx_mask,
|
||||
+ * @rx_mask and @slot_width will be ignored.
|
||||
+ *
|
||||
+ * Returns 0 on success, a negative error code otherwise.
|
||||
+ */
|
||||
+int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
|
||||
+ unsigned int tx_mask, unsigned int rx_mask,
|
||||
+ int slots, int slot_width)
|
||||
+{
|
||||
+ if (dai->driver->ops->xlate_tdm_slot_mask)
|
||||
+ dai->driver->ops->xlate_tdm_slot_mask(slots,
|
||||
+ &tx_mask, &rx_mask);
|
||||
+ else
|
||||
+ snd_soc_xlate_tdm_slot_mask(slots, &tx_mask, &rx_mask);
|
||||
+
|
||||
+ dai->tx_mask = tx_mask;
|
||||
+ dai->rx_mask = rx_mask;
|
||||
+
|
||||
+ if (dai->driver->ops->set_tdm_slot)
|
||||
+ return dai->driver->ops->set_tdm_slot(dai, tx_mask, rx_mask,
|
||||
+ slots, slot_width);
|
||||
+ else
|
||||
+ return -ENOTSUPP;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(snd_soc_dai_set_tdm_slot);
|
||||
+
|
||||
+/**
|
||||
+ * snd_soc_dai_set_channel_map - configure DAI audio channel map
|
||||
+ * @dai: DAI
|
||||
+ * @tx_num: how many TX channels
|
||||
+ * @tx_slot: pointer to an array which imply the TX slot number channel
|
||||
+ * 0~num-1 uses
|
||||
+ * @rx_num: how many RX channels
|
||||
+ * @rx_slot: pointer to an array which imply the RX slot number channel
|
||||
+ * 0~num-1 uses
|
||||
+ *
|
||||
+ * configure the relationship between channel number and TDM slot number.
|
||||
+ */
|
||||
+int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,
|
||||
+ unsigned int tx_num, unsigned int *tx_slot,
|
||||
+ unsigned int rx_num, unsigned int *rx_slot)
|
||||
+{
|
||||
+ if (dai->driver->ops->set_channel_map)
|
||||
+ return dai->driver->ops->set_channel_map(dai, tx_num, tx_slot,
|
||||
+ rx_num, rx_slot);
|
||||
+ else
|
||||
+ return -ENOTSUPP;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(snd_soc_dai_set_channel_map);
|
||||
+
|
||||
+/**
|
||||
+ * snd_soc_dai_get_channel_map - Get DAI audio channel map
|
||||
+ * @dai: DAI
|
||||
+ * @tx_num: how many TX channels
|
||||
+ * @tx_slot: pointer to an array which imply the TX slot number channel
|
||||
+ * 0~num-1 uses
|
||||
+ * @rx_num: how many RX channels
|
||||
+ * @rx_slot: pointer to an array which imply the RX slot number channel
|
||||
+ * 0~num-1 uses
|
||||
+ */
|
||||
+int snd_soc_dai_get_channel_map(struct snd_soc_dai *dai,
|
||||
+ unsigned int *tx_num, unsigned int *tx_slot,
|
||||
+ unsigned int *rx_num, unsigned int *rx_slot)
|
||||
+{
|
||||
+ if (dai->driver->ops->get_channel_map)
|
||||
+ return dai->driver->ops->get_channel_map(dai, tx_num, tx_slot,
|
||||
+ rx_num, rx_slot);
|
||||
+ else
|
||||
+ return -ENOTSUPP;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(snd_soc_dai_get_channel_map);
|
||||
+
|
||||
+/**
|
||||
+ * snd_soc_dai_set_tristate - configure DAI system or master clock.
|
||||
+ * @dai: DAI
|
||||
+ * @tristate: tristate enable
|
||||
+ *
|
||||
+ * Tristates the DAI so that others can use it.
|
||||
+ */
|
||||
+int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate)
|
||||
+{
|
||||
+ if (dai->driver->ops->set_tristate)
|
||||
+ return dai->driver->ops->set_tristate(dai, tristate);
|
||||
+ else
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(snd_soc_dai_set_tristate);
|
||||
+
|
||||
+/**
|
||||
+ * snd_soc_dai_digital_mute - configure DAI system or master clock.
|
||||
+ * @dai: DAI
|
||||
+ * @mute: mute enable
|
||||
+ * @direction: stream to mute
|
||||
+ *
|
||||
+ * Mutes the DAI DAC.
|
||||
+ */
|
||||
+int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
|
||||
+ int direction)
|
||||
+{
|
||||
+ if (dai->driver->ops->mute_stream)
|
||||
+ return dai->driver->ops->mute_stream(dai, mute, direction);
|
||||
+ else if (direction == SNDRV_PCM_STREAM_PLAYBACK &&
|
||||
+ dai->driver->ops->digital_mute)
|
||||
+ return dai->driver->ops->digital_mute(dai, mute);
|
||||
+ else
|
||||
+ return -ENOTSUPP;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,392 @@
|
||||
From d0a549baa248b9c97babc29a5f9475f62b32266c Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Wed, 14 Aug 2019 17:09:18 +0200
|
||||
Subject: [PATCH 035/146] FROMLIST: ASoC: meson: add t9015 internal DAC driver
|
||||
|
||||
Add the codec driver of the internal DAC found on Amlogic gxl, g12a and
|
||||
sm1 family.
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/Kconfig | 8 +
|
||||
sound/soc/meson/Makefile | 2 +
|
||||
sound/soc/meson/t9015.c | 326 +++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 336 insertions(+)
|
||||
create mode 100644 sound/soc/meson/t9015.c
|
||||
|
||||
diff --git a/sound/soc/meson/Kconfig b/sound/soc/meson/Kconfig
|
||||
index 22d2af75b59e..897a706dcda0 100644
|
||||
--- a/sound/soc/meson/Kconfig
|
||||
+++ b/sound/soc/meson/Kconfig
|
||||
@@ -6,6 +6,7 @@ config SND_MESON_AIU
|
||||
tristate "Amlogic AIU"
|
||||
select SND_MESON_CODEC_GLUE
|
||||
select SND_PCM_IEC958
|
||||
+ imply SND_SOC_MESON_T9015
|
||||
imply SND_SOC_HDMI_CODEC if DRM_MESON_DW_HDMI
|
||||
help
|
||||
Select Y or M to add support for the Audio output subsystem found
|
||||
@@ -116,4 +117,11 @@ config SND_MESON_G12A_TOHDMITX
|
||||
help
|
||||
Select Y or M to add support for HDMI audio on the g12a SoC
|
||||
family
|
||||
+
|
||||
+config SND_SOC_MESON_T9015
|
||||
+ tristate "Amlogic T9015 DAC"
|
||||
+ select REGMAP_MMIO
|
||||
+ help
|
||||
+ Say Y or M if you want to add support for the internal DAC found
|
||||
+ on GXL, G12 and SM1 SoC family.
|
||||
endmenu
|
||||
diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile
|
||||
index f9c90c391498..3c9d48846816 100644
|
||||
--- a/sound/soc/meson/Makefile
|
||||
+++ b/sound/soc/meson/Makefile
|
||||
@@ -23,6 +23,7 @@ snd-soc-meson-card-utils-objs := meson-card-utils.o
|
||||
snd-soc-meson-codec-glue-objs := meson-codec-glue.o
|
||||
snd-soc-meson-gx-sound-card-objs := gx-card.o
|
||||
snd-soc-meson-g12a-tohdmitx-objs := g12a-tohdmitx.o
|
||||
+snd-soc-meson-t9015-objs := t9015.o
|
||||
|
||||
obj-$(CONFIG_SND_MESON_AIU) += snd-soc-meson-aiu.o
|
||||
obj-$(CONFIG_SND_MESON_AXG_FIFO) += snd-soc-meson-axg-fifo.o
|
||||
@@ -40,3 +41,4 @@ obj-$(CONFIG_SND_MESON_CARD_UTILS) += snd-soc-meson-card-utils.o
|
||||
obj-$(CONFIG_SND_MESON_CODEC_GLUE) += snd-soc-meson-codec-glue.o
|
||||
obj-$(CONFIG_SND_MESON_GX_SOUND_CARD) += snd-soc-meson-gx-sound-card.o
|
||||
obj-$(CONFIG_SND_MESON_G12A_TOHDMITX) += snd-soc-meson-g12a-tohdmitx.o
|
||||
+obj-$(CONFIG_SND_SOC_MESON_T9015) += snd-soc-meson-t9015.o
|
||||
diff --git a/sound/soc/meson/t9015.c b/sound/soc/meson/t9015.c
|
||||
new file mode 100644
|
||||
index 000000000000..4f26708b6adc
|
||||
--- /dev/null
|
||||
+++ b/sound/soc/meson/t9015.c
|
||||
@@ -0,0 +1,326 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+//
|
||||
+// Copyright (c) 2020 BayLibre, SAS.
|
||||
+// Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/regmap.h>
|
||||
+#include <linux/regulator/consumer.h>
|
||||
+#include <linux/reset.h>
|
||||
+#include <sound/soc.h>
|
||||
+#include <sound/tlv.h>
|
||||
+
|
||||
+#define BLOCK_EN 0x00
|
||||
+#define LORN_EN 0
|
||||
+#define LORP_EN 1
|
||||
+#define LOLN_EN 2
|
||||
+#define LOLP_EN 3
|
||||
+#define DACR_EN 4
|
||||
+#define DACL_EN 5
|
||||
+
|
||||
+#define DACR_INV 20
|
||||
+#define DACL_INV 21
|
||||
+#define DACR_SRC 22
|
||||
+#define DACL_SRC 23
|
||||
+#define REFP_BUF_EN BIT(12)
|
||||
+#define BIAS_CURRENT_EN BIT(13)
|
||||
+#define VMID_GEN_FAST BIT(14)
|
||||
+#define VMID_GEN_EN BIT(15)
|
||||
+#define I2S_MODE BIT(30)
|
||||
+#define VOL_CTRL0 0x04
|
||||
+#define GAIN_H 31
|
||||
+#define GAIN_L 23
|
||||
+#define VOL_CTRL1 0x08
|
||||
+#define DAC_MONO 8
|
||||
+#define RAMP_RATE 10
|
||||
+#define VC_RAMP_MODE 12
|
||||
+#define MUTE_MODE 13
|
||||
+#define UNMUTE_MODE 14
|
||||
+#define DAC_SOFT_MUTE 15
|
||||
+#define DACR_VC 16
|
||||
+#define DACL_VC 24
|
||||
+#define LINEOUT_CFG 0x0c
|
||||
+#define LORN_POL 0
|
||||
+#define LORP_POL 4
|
||||
+#define LOLN_POL 8
|
||||
+#define LOLP_POL 12
|
||||
+#define POWER_CFG 0x10
|
||||
+
|
||||
+struct t9015 {
|
||||
+ struct clk *pclk;
|
||||
+ struct regulator *avdd;
|
||||
+};
|
||||
+
|
||||
+static int t9015_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
+{
|
||||
+ struct snd_soc_component *component = dai->component;
|
||||
+ unsigned int val;
|
||||
+
|
||||
+ switch(fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
||||
+ case SND_SOC_DAIFMT_CBM_CFM:
|
||||
+ val = I2S_MODE;
|
||||
+ break;
|
||||
+
|
||||
+ case SND_SOC_DAIFMT_CBS_CFS:
|
||||
+ val = 0;
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ snd_soc_component_update_bits(component, BLOCK_EN, I2S_MODE, val);
|
||||
+
|
||||
+ if (((fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_I2S) &&
|
||||
+ ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_LEFT_J))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct snd_soc_dai_ops t9015_dai_ops = {
|
||||
+ .set_fmt = t9015_dai_set_fmt,
|
||||
+};
|
||||
+
|
||||
+static struct snd_soc_dai_driver t9015_dai = {
|
||||
+ .name = "t9015-hifi",
|
||||
+ .playback = {
|
||||
+ .stream_name = "Playback",
|
||||
+ .channels_min = 1,
|
||||
+ .channels_max = 2,
|
||||
+ .rates = SNDRV_PCM_RATE_8000_96000,
|
||||
+ .formats = (SNDRV_PCM_FMTBIT_S8 |
|
||||
+ SNDRV_PCM_FMTBIT_S16_LE |
|
||||
+ SNDRV_PCM_FMTBIT_S20_LE |
|
||||
+ SNDRV_PCM_FMTBIT_S24_LE),
|
||||
+ },
|
||||
+ .ops = &t9015_dai_ops,
|
||||
+};
|
||||
+
|
||||
+static const DECLARE_TLV_DB_MINMAX_MUTE(dac_vol_tlv, -9525, 0);
|
||||
+
|
||||
+static const char * const ramp_rate_txt[] = { "Fast", "Slow" };
|
||||
+static SOC_ENUM_SINGLE_DECL(ramp_rate_enum, VOL_CTRL1, RAMP_RATE,
|
||||
+ ramp_rate_txt);
|
||||
+
|
||||
+static const char * const dacr_in_txt[] = { "Right", "Left" };
|
||||
+static SOC_ENUM_SINGLE_DECL(dacr_in_enum, BLOCK_EN, DACR_SRC, dacr_in_txt);
|
||||
+
|
||||
+static const char * const dacl_in_txt[] = { "Left", "Right" };
|
||||
+static SOC_ENUM_SINGLE_DECL(dacl_in_enum, BLOCK_EN, DACL_SRC, dacl_in_txt);
|
||||
+
|
||||
+static const char * const mono_txt[] = { "Stereo", "Mono"};
|
||||
+static SOC_ENUM_SINGLE_DECL(mono_enum, VOL_CTRL1, DAC_MONO, mono_txt);
|
||||
+
|
||||
+static const struct snd_kcontrol_new t9015_snd_controls[] = {
|
||||
+ /* Volume Controls */
|
||||
+ SOC_SINGLE("Playback Mute", VOL_CTRL1, DAC_SOFT_MUTE, 1, 0),
|
||||
+ SOC_DOUBLE_TLV("Playback Volume", VOL_CTRL1, DACL_VC, DACR_VC,
|
||||
+ 0xff, 0, dac_vol_tlv),
|
||||
+
|
||||
+ /* Ramp Controls */
|
||||
+ SOC_ENUM("Ramp Rate", ramp_rate_enum),
|
||||
+ SOC_SINGLE("Volume Ramp Enable", VOL_CTRL1, VC_RAMP_MODE, 1, 0),
|
||||
+ SOC_SINGLE("Mute Ramp Enable", VOL_CTRL1, MUTE_MODE, 1, 0),
|
||||
+ SOC_SINGLE("Unmute Ramp Enable", VOL_CTRL1, UNMUTE_MODE, 1, 0),
|
||||
+
|
||||
+ /* Channel Src */
|
||||
+ SOC_ENUM("Right DAC Source", dacr_in_enum),
|
||||
+ SOC_ENUM("Left DAC Source", dacl_in_enum),
|
||||
+ SOC_ENUM("Channel Mode", mono_enum),
|
||||
+};
|
||||
+
|
||||
+static const struct snd_soc_dapm_widget t9015_dapm_widgets[] = {
|
||||
+ SND_SOC_DAPM_DAC("Right DAC", NULL, BLOCK_EN, DACR_EN, 0),
|
||||
+ SND_SOC_DAPM_DAC("Left DAC", NULL, BLOCK_EN, DACL_EN, 0),
|
||||
+ SND_SOC_DAPM_OUT_DRV("Right- Driver", BLOCK_EN, LORN_EN, 0,
|
||||
+ NULL, 0),
|
||||
+ SND_SOC_DAPM_OUT_DRV("Right+ Driver", BLOCK_EN, LORP_EN, 0,
|
||||
+ NULL, 0),
|
||||
+ SND_SOC_DAPM_OUT_DRV("Left- Driver", BLOCK_EN, LOLN_EN, 0,
|
||||
+ NULL, 0),
|
||||
+ SND_SOC_DAPM_OUT_DRV("Left+ Driver", BLOCK_EN, LOLP_EN, 0,
|
||||
+ NULL, 0),
|
||||
+ SND_SOC_DAPM_OUTPUT("LORN"),
|
||||
+ SND_SOC_DAPM_OUTPUT("LORP"),
|
||||
+ SND_SOC_DAPM_OUTPUT("LOLN"),
|
||||
+ SND_SOC_DAPM_OUTPUT("LOLP"),
|
||||
+};
|
||||
+
|
||||
+static const struct snd_soc_dapm_route t9015_dapm_routes[] = {
|
||||
+ { "Right DAC", NULL, "Playback" },
|
||||
+ { "Left DAC", NULL, "Playback" },
|
||||
+ { "Right- Driver", NULL, "Right DAC" },
|
||||
+ { "Right+ Driver", NULL, "Right DAC" },
|
||||
+ { "Left- Driver", NULL, "Left DAC" },
|
||||
+ { "Left+ Driver", NULL, "Left DAC" },
|
||||
+ { "LORN", NULL, "Right- Driver", },
|
||||
+ { "LORP", NULL, "Right+ Driver", },
|
||||
+ { "LOLN", NULL, "Left- Driver", },
|
||||
+ { "LOLP", NULL, "Left+ Driver", },
|
||||
+};
|
||||
+
|
||||
+static int t9015_set_bias_level(struct snd_soc_component *component,
|
||||
+ enum snd_soc_bias_level level)
|
||||
+{
|
||||
+ struct t9015 *priv = snd_soc_component_get_drvdata(component);
|
||||
+ enum snd_soc_bias_level now =
|
||||
+ snd_soc_component_get_bias_level(component);
|
||||
+ int ret;
|
||||
+
|
||||
+ switch (level) {
|
||||
+ case SND_SOC_BIAS_ON:
|
||||
+ snd_soc_component_update_bits(component, BLOCK_EN,
|
||||
+ BIAS_CURRENT_EN,
|
||||
+ BIAS_CURRENT_EN);
|
||||
+ break;
|
||||
+ case SND_SOC_BIAS_PREPARE:
|
||||
+ snd_soc_component_update_bits(component, BLOCK_EN,
|
||||
+ BIAS_CURRENT_EN,
|
||||
+ 0);
|
||||
+ break;
|
||||
+ case SND_SOC_BIAS_STANDBY:
|
||||
+ ret = regulator_enable(priv->avdd);
|
||||
+ if (ret) {
|
||||
+ dev_err(component->dev, "AVDD enable failed\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ if (now == SND_SOC_BIAS_OFF) {
|
||||
+ snd_soc_component_update_bits(component, BLOCK_EN,
|
||||
+ VMID_GEN_EN | VMID_GEN_FAST | REFP_BUF_EN,
|
||||
+ VMID_GEN_EN | VMID_GEN_FAST | REFP_BUF_EN);
|
||||
+
|
||||
+ mdelay(200);
|
||||
+ snd_soc_component_update_bits(component, BLOCK_EN,
|
||||
+ VMID_GEN_FAST,
|
||||
+ 0);
|
||||
+ }
|
||||
+
|
||||
+ break;
|
||||
+ case SND_SOC_BIAS_OFF:
|
||||
+ snd_soc_component_update_bits(component, BLOCK_EN,
|
||||
+ VMID_GEN_EN | VMID_GEN_FAST | REFP_BUF_EN,
|
||||
+ 0);
|
||||
+
|
||||
+ regulator_disable(priv->avdd);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int t9015_component_probe(struct snd_soc_component *c)
|
||||
+{
|
||||
+ /* FIXME */
|
||||
+ return snd_soc_component_write(c, LINEOUT_CFG, 0x00001111);
|
||||
+}
|
||||
+
|
||||
+static const struct snd_soc_component_driver t9015_codec_driver = {
|
||||
+ .probe = t9015_component_probe,
|
||||
+ .set_bias_level = t9015_set_bias_level,
|
||||
+ .controls = t9015_snd_controls,
|
||||
+ .num_controls = ARRAY_SIZE(t9015_snd_controls),
|
||||
+ .dapm_widgets = t9015_dapm_widgets,
|
||||
+ .num_dapm_widgets = ARRAY_SIZE(t9015_dapm_widgets),
|
||||
+ .dapm_routes = t9015_dapm_routes,
|
||||
+ .num_dapm_routes = ARRAY_SIZE(t9015_dapm_routes),
|
||||
+ .suspend_bias_off = 1,
|
||||
+ .idle_bias_on = 1,
|
||||
+ .endianness = 1,
|
||||
+ .non_legacy_dai_naming = 1,
|
||||
+};
|
||||
+
|
||||
+static const struct regmap_config t9015_regmap_config = {
|
||||
+ .reg_bits = 32,
|
||||
+ .reg_stride = 4,
|
||||
+ .val_bits = 32,
|
||||
+ .max_register = POWER_CFG,
|
||||
+};
|
||||
+
|
||||
+static int t9015_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct t9015 *priv;
|
||||
+ void __iomem *regs;
|
||||
+ struct regmap *regmap;
|
||||
+ int ret;
|
||||
+
|
||||
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
+ if (!priv)
|
||||
+ return -ENOMEM;
|
||||
+ platform_set_drvdata(pdev, priv);
|
||||
+
|
||||
+ priv->pclk = devm_clk_get(dev, "pclk");
|
||||
+ if (IS_ERR(priv->pclk)) {
|
||||
+ if (PTR_ERR(priv->pclk) != -EPROBE_DEFER)
|
||||
+ dev_err(dev, "failed to get core clock\n");
|
||||
+ return PTR_ERR(priv->pclk);
|
||||
+ }
|
||||
+
|
||||
+ priv->avdd = devm_regulator_get(dev, "AVDD");
|
||||
+ if (IS_ERR(priv->avdd)) {
|
||||
+ if (PTR_ERR(priv->avdd) != -EPROBE_DEFER)
|
||||
+ dev_err(dev, "failed to AVDD\n");
|
||||
+ return PTR_ERR(priv->avdd);
|
||||
+ }
|
||||
+
|
||||
+ ret = clk_prepare_enable(priv->pclk);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "core clock enable failed\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = devm_add_action_or_reset(dev,
|
||||
+ (void(*)(void *))clk_disable_unprepare,
|
||||
+ priv->pclk);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = device_reset(dev);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "reset failed\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ regs = devm_platform_ioremap_resource(pdev, 0);
|
||||
+ if (IS_ERR(regs)) {
|
||||
+ dev_err(dev, "register map failed\n");
|
||||
+ return PTR_ERR(regs);
|
||||
+ }
|
||||
+
|
||||
+ regmap = devm_regmap_init_mmio(dev, regs, &t9015_regmap_config);
|
||||
+ if (IS_ERR(regmap)) {
|
||||
+ dev_err(dev, "regmap init failed\n");
|
||||
+ return PTR_ERR(regmap);
|
||||
+ }
|
||||
+
|
||||
+ /* Add polarity parsing here */
|
||||
+
|
||||
+ return devm_snd_soc_register_component(dev, &t9015_codec_driver,
|
||||
+ &t9015_dai, 1);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id t9015_ids[] = {
|
||||
+ { .compatible = "amlogic,t9015", },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, t9015_ids);
|
||||
+
|
||||
+static struct platform_driver t9015_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "t9015-codec",
|
||||
+ .of_match_table = of_match_ptr(t9015_ids),
|
||||
+ },
|
||||
+ .probe = t9015_probe,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(t9015_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("ASoC Amlogic T9015 codec driver");
|
||||
+MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
+
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,179 +0,0 @@
|
||||
From 31099c95ddae55746b2bae97c4853c215818f2bb Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:33:04 +0900
|
||||
Subject: [PATCH 036/187] FROMGIT: ASoC: soc-dai: mv soc_dai_hw_params() to
|
||||
soc-dai
|
||||
|
||||
Sometimes ALSA SoC naming is very random.
|
||||
Current soc_dai_hw_params() should use snd_soc_dai_xxx() style.
|
||||
And then, 1st parameter should be dai. Otherwise it is confusable.
|
||||
- soc_dai_hw_params(..., dai);
|
||||
+ snd_soc_dai_hw_params(dai, ...);
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/87zhl6hn5b.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit aa6166c2ac28392d64f2d8b3acfb56c8fe657147
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/sound/soc-dai.h | 4 ++++
|
||||
include/sound/soc.h | 4 ----
|
||||
sound/soc/soc-dai.c | 30 ++++++++++++++++++++++++++++++
|
||||
sound/soc/soc-dapm.c | 4 ++--
|
||||
sound/soc/soc-pcm.c | 35 +++--------------------------------
|
||||
5 files changed, 39 insertions(+), 38 deletions(-)
|
||||
|
||||
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
|
||||
index f5d70041108f..3773262a1b77 100644
|
||||
--- a/include/sound/soc-dai.h
|
||||
+++ b/include/sound/soc-dai.h
|
||||
@@ -145,6 +145,10 @@ int snd_soc_dai_get_channel_map(struct snd_soc_dai *dai,
|
||||
|
||||
int snd_soc_dai_is_dummy(struct snd_soc_dai *dai);
|
||||
|
||||
+int snd_soc_dai_hw_params(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream,
|
||||
+ struct snd_pcm_hw_params *params);
|
||||
+
|
||||
struct snd_soc_dai_ops {
|
||||
/*
|
||||
* DAI clocking configuration, all optional.
|
||||
diff --git a/include/sound/soc.h b/include/sound/soc.h
|
||||
index 4e8071269639..d770606732cd 100644
|
||||
--- a/include/sound/soc.h
|
||||
+++ b/include/sound/soc.h
|
||||
@@ -505,10 +505,6 @@ int snd_soc_params_to_bclk(struct snd_pcm_hw_params *parms);
|
||||
int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
|
||||
const struct snd_pcm_hardware *hw);
|
||||
|
||||
-int soc_dai_hw_params(struct snd_pcm_substream *substream,
|
||||
- struct snd_pcm_hw_params *params,
|
||||
- struct snd_soc_dai *dai);
|
||||
-
|
||||
/* Jack reporting */
|
||||
int snd_soc_card_jack_new(struct snd_soc_card *card, const char *id, int type,
|
||||
struct snd_soc_jack *jack, struct snd_soc_jack_pin *pins,
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
index a1009ead40de..f883d27d136f 100644
|
||||
--- a/sound/soc/soc-dai.c
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -252,3 +252,33 @@ int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute);
|
||||
+
|
||||
+int snd_soc_dai_hw_params(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream,
|
||||
+ struct snd_pcm_hw_params *params)
|
||||
+{
|
||||
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
+ int ret;
|
||||
+
|
||||
+ /* perform any topology hw_params fixups before DAI */
|
||||
+ if (rtd->dai_link->be_hw_params_fixup) {
|
||||
+ ret = rtd->dai_link->be_hw_params_fixup(rtd, params);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(rtd->dev,
|
||||
+ "ASoC: hw_params topology fixup failed %d\n",
|
||||
+ ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (dai->driver->ops->hw_params) {
|
||||
+ ret = dai->driver->ops->hw_params(substream, params, dai);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(dai->dev, "ASoC: can't set %s hw params: %d\n",
|
||||
+ dai->name, ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
|
||||
index 2790c00735f3..e86a2d8d4f35 100644
|
||||
--- a/sound/soc/soc-dapm.c
|
||||
+++ b/sound/soc/soc-dapm.c
|
||||
@@ -3841,7 +3841,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
|
||||
}
|
||||
}
|
||||
source->active++;
|
||||
- ret = soc_dai_hw_params(&substream, params, source);
|
||||
+ ret = snd_soc_dai_hw_params(source, &substream, params);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
@@ -3863,7 +3863,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
|
||||
}
|
||||
}
|
||||
sink->active++;
|
||||
- ret = soc_dai_hw_params(&substream, params, sink);
|
||||
+ ret = snd_soc_dai_hw_params(sink, &substream, params);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
|
||||
index 4878d22ebd8c..420cc94e0a46 100644
|
||||
--- a/sound/soc/soc-pcm.c
|
||||
+++ b/sound/soc/soc-pcm.c
|
||||
@@ -877,36 +877,6 @@ static void soc_pcm_codec_params_fixup(struct snd_pcm_hw_params *params,
|
||||
interval->max = channels;
|
||||
}
|
||||
|
||||
-int soc_dai_hw_params(struct snd_pcm_substream *substream,
|
||||
- struct snd_pcm_hw_params *params,
|
||||
- struct snd_soc_dai *dai)
|
||||
-{
|
||||
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
- int ret;
|
||||
-
|
||||
- /* perform any topology hw_params fixups before DAI */
|
||||
- if (rtd->dai_link->be_hw_params_fixup) {
|
||||
- ret = rtd->dai_link->be_hw_params_fixup(rtd, params);
|
||||
- if (ret < 0) {
|
||||
- dev_err(rtd->dev,
|
||||
- "ASoC: hw_params topology fixup failed %d\n",
|
||||
- ret);
|
||||
- return ret;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (dai->driver->ops->hw_params) {
|
||||
- ret = dai->driver->ops->hw_params(substream, params, dai);
|
||||
- if (ret < 0) {
|
||||
- dev_err(dai->dev, "ASoC: can't set %s hw params: %d\n",
|
||||
- dai->name, ret);
|
||||
- return ret;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
static int soc_pcm_components_hw_free(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_component *last)
|
||||
{
|
||||
@@ -989,7 +959,8 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
soc_pcm_codec_params_fixup(&codec_params,
|
||||
codec_dai->rx_mask);
|
||||
|
||||
- ret = soc_dai_hw_params(substream, &codec_params, codec_dai);
|
||||
+ ret = snd_soc_dai_hw_params(codec_dai, substream,
|
||||
+ &codec_params);
|
||||
if(ret < 0)
|
||||
goto codec_err;
|
||||
|
||||
@@ -1001,7 +972,7 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
snd_soc_dapm_update_dai(substream, &codec_params, codec_dai);
|
||||
}
|
||||
|
||||
- ret = soc_dai_hw_params(substream, params, cpu_dai);
|
||||
+ ret = snd_soc_dai_hw_params(cpu_dai, substream, params);
|
||||
if (ret < 0)
|
||||
goto interface_err;
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,107 @@
|
||||
From 0ea69450c57f01517fb17edcb744fc5100c13868 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Fri, 24 Jan 2020 11:08:09 +0100
|
||||
Subject: [PATCH 036/146] WIP: ASoC: meson: convert axg tdm interface to schema
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
.../bindings/sound/amlogic,axg-tdm-iface.txt | 22 -------
|
||||
.../bindings/sound/amlogic,axg-tdm-iface.yaml | 57 +++++++++++++++++++
|
||||
2 files changed, 57 insertions(+), 22 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.txt
|
||||
deleted file mode 100644
|
||||
index cabfb26a5f22..000000000000
|
||||
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.txt
|
||||
+++ /dev/null
|
||||
@@ -1,22 +0,0 @@
|
||||
-* Amlogic Audio TDM Interfaces
|
||||
-
|
||||
-Required properties:
|
||||
-- compatible: 'amlogic,axg-tdm-iface'
|
||||
-- clocks: list of clock phandle, one for each entry clock-names.
|
||||
-- clock-names: should contain the following:
|
||||
- * "sclk" : bit clock.
|
||||
- * "lrclk": sample clock
|
||||
- * "mclk" : master clock
|
||||
- -> optional if the interface is in clock slave mode.
|
||||
-- #sound-dai-cells: must be 0.
|
||||
-
|
||||
-Example of TDM_A on the A113 SoC:
|
||||
-
|
||||
-tdmif_a: audio-controller@0 {
|
||||
- compatible = "amlogic,axg-tdm-iface";
|
||||
- #sound-dai-cells = <0>;
|
||||
- clocks = <&clkc_audio AUD_CLKID_MST_A_MCLK>,
|
||||
- <&clkc_audio AUD_CLKID_MST_A_SCLK>,
|
||||
- <&clkc_audio AUD_CLKID_MST_A_LRCLK>;
|
||||
- clock-names = "mclk", "sclk", "lrclk";
|
||||
-};
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..5f04f9cf30a0
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.yaml
|
||||
@@ -0,0 +1,57 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic Audio TDM Interfaces
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ $nodename:
|
||||
+ pattern: "^audio-controller-.*"
|
||||
+
|
||||
+ "#sound-dai-cells":
|
||||
+ const: 0
|
||||
+
|
||||
+ compatible:
|
||||
+ items:
|
||||
+ - const: 'amlogic,axg-tdm-iface'
|
||||
+
|
||||
+ clocks:
|
||||
+ minItems: 2
|
||||
+ maxItems: 3
|
||||
+ items:
|
||||
+ - description: Bit clock
|
||||
+ - description: Sample clock
|
||||
+ - description: Master clock #optional
|
||||
+
|
||||
+ clock-names:
|
||||
+ minItems: 2
|
||||
+ maxItems: 3
|
||||
+ items:
|
||||
+ - const: sclk
|
||||
+ - const: lrclk
|
||||
+ - const: mclk
|
||||
+
|
||||
+required:
|
||||
+ - "#sound-dai-cells"
|
||||
+ - compatible
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||
+
|
||||
+ tdmif_a: audio-controller-0 {
|
||||
+ compatible = "amlogic,axg-tdm-iface";
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ clocks = <&clkc_audio AUD_CLKID_MST_A_SCLK>,
|
||||
+ <&clkc_audio AUD_CLKID_MST_A_LRCLK>,
|
||||
+ <&clkc_audio AUD_CLKID_MST_A_MCLK>;
|
||||
+ clock-names = "sclk", "lrclk", "mclk";
|
||||
+ };
|
||||
+
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,117 +0,0 @@
|
||||
From 0b897bd6ab6b787482da3fc67dab3e49c3034dff Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:33:19 +0900
|
||||
Subject: [PATCH 037/187] FROMGIT: ASoC: soc-dai: add snd_soc_dai_hw_free()
|
||||
|
||||
Current ALSA SoC is directly using dai->driver->ops->xxx,
|
||||
thus, it has deep nested bracket, and it makes code unreadable.
|
||||
This patch adds new snd_soc_dai_hw_free() and use it.
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/87y30qhn4w.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit 846faaed9df7899e74311db3aec0a41a2f6bc345
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/sound/soc-dai.h | 2 ++
|
||||
sound/soc/soc-dai.c | 7 +++++++
|
||||
sound/soc/soc-dapm.c | 7 ++-----
|
||||
sound/soc/soc-pcm.c | 12 ++++--------
|
||||
4 files changed, 15 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
|
||||
index 3773262a1b77..5222b6a758f2 100644
|
||||
--- a/include/sound/soc-dai.h
|
||||
+++ b/include/sound/soc-dai.h
|
||||
@@ -148,6 +148,8 @@ int snd_soc_dai_is_dummy(struct snd_soc_dai *dai);
|
||||
int snd_soc_dai_hw_params(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params);
|
||||
+void snd_soc_dai_hw_free(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream);
|
||||
|
||||
struct snd_soc_dai_ops {
|
||||
/*
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
index f883d27d136f..39a685e6acd5 100644
|
||||
--- a/sound/soc/soc-dai.c
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -282,3 +282,10 @@ int snd_soc_dai_hw_params(struct snd_soc_dai *dai,
|
||||
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+void snd_soc_dai_hw_free(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream)
|
||||
+{
|
||||
+ if (dai->driver->ops->hw_free)
|
||||
+ dai->driver->ops->hw_free(substream, dai);
|
||||
+}
|
||||
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
|
||||
index e86a2d8d4f35..a9a717376767 100644
|
||||
--- a/sound/soc/soc-dapm.c
|
||||
+++ b/sound/soc/soc-dapm.c
|
||||
@@ -3900,9 +3900,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
|
||||
snd_soc_dapm_widget_for_each_source_path(w, path) {
|
||||
source = path->source->priv;
|
||||
|
||||
- if (source->driver->ops->hw_free)
|
||||
- source->driver->ops->hw_free(&substream,
|
||||
- source);
|
||||
+ snd_soc_dai_hw_free(source, &substream);
|
||||
|
||||
source->active--;
|
||||
if (source->driver->ops->shutdown)
|
||||
@@ -3914,8 +3912,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
|
||||
snd_soc_dapm_widget_for_each_sink_path(w, path) {
|
||||
sink = path->sink->priv;
|
||||
|
||||
- if (sink->driver->ops->hw_free)
|
||||
- sink->driver->ops->hw_free(&substream, sink);
|
||||
+ snd_soc_dai_hw_free(sink, &substream);
|
||||
|
||||
sink->active--;
|
||||
if (sink->driver->ops->shutdown)
|
||||
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
|
||||
index 420cc94e0a46..58fc4e98ab59 100644
|
||||
--- a/sound/soc/soc-pcm.c
|
||||
+++ b/sound/soc/soc-pcm.c
|
||||
@@ -1011,8 +1011,7 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
component_err:
|
||||
soc_pcm_components_hw_free(substream, component);
|
||||
|
||||
- if (cpu_dai->driver->ops->hw_free)
|
||||
- cpu_dai->driver->ops->hw_free(substream, cpu_dai);
|
||||
+ snd_soc_dai_hw_free(cpu_dai, substream);
|
||||
cpu_dai->rate = 0;
|
||||
|
||||
interface_err:
|
||||
@@ -1023,8 +1022,7 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
if (!snd_soc_dai_stream_valid(codec_dai, substream->stream))
|
||||
continue;
|
||||
|
||||
- if (codec_dai->driver->ops->hw_free)
|
||||
- codec_dai->driver->ops->hw_free(substream, codec_dai);
|
||||
+ snd_soc_dai_hw_free(codec_dai, substream);
|
||||
codec_dai->rate = 0;
|
||||
}
|
||||
|
||||
@@ -1083,12 +1081,10 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
|
||||
if (!snd_soc_dai_stream_valid(codec_dai, substream->stream))
|
||||
continue;
|
||||
|
||||
- if (codec_dai->driver->ops->hw_free)
|
||||
- codec_dai->driver->ops->hw_free(substream, codec_dai);
|
||||
+ snd_soc_dai_hw_free(codec_dai, substream);
|
||||
}
|
||||
|
||||
- if (cpu_dai->driver->ops->hw_free)
|
||||
- cpu_dai->driver->ops->hw_free(substream, cpu_dai);
|
||||
+ snd_soc_dai_hw_free(cpu_dai, substream);
|
||||
|
||||
mutex_unlock(&rtd->pcm_mutex);
|
||||
return 0;
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,166 @@
|
||||
From 8ad9165f35eda957aaeee673475909469945906a Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Fri, 24 Jan 2020 12:00:01 +0100
|
||||
Subject: [PATCH 037/146] WIP: ASoC: meson: convert axg tdm formatters to
|
||||
schema
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
.../sound/amlogic,axg-tdm-formatters.txt | 36 -------
|
||||
.../sound/amlogic,axg-tdm-formatters.yaml | 101 ++++++++++++++++++
|
||||
2 files changed, 101 insertions(+), 36 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.txt
|
||||
deleted file mode 100644
|
||||
index 5996c0cd89c2..000000000000
|
||||
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.txt
|
||||
+++ /dev/null
|
||||
@@ -1,36 +0,0 @@
|
||||
-* Amlogic Audio TDM formatters
|
||||
-
|
||||
-Required properties:
|
||||
-- compatible: 'amlogic,axg-tdmin' or
|
||||
- 'amlogic,axg-tdmout' or
|
||||
- 'amlogic,g12a-tdmin' or
|
||||
- 'amlogic,g12a-tdmout' or
|
||||
- 'amlogic,sm1-tdmin' or
|
||||
- 'amlogic,sm1-tdmout
|
||||
-- reg: physical base address of the controller and length of memory
|
||||
- mapped region.
|
||||
-- clocks: list of clock phandle, one for each entry clock-names.
|
||||
-- clock-names: should contain the following:
|
||||
- * "pclk" : peripheral clock.
|
||||
- * "sclk" : bit clock.
|
||||
- * "sclk_sel" : bit clock input multiplexer.
|
||||
- * "lrclk" : sample clock
|
||||
- * "lrclk_sel": sample clock input multiplexer
|
||||
-
|
||||
-Optional property:
|
||||
-- resets: phandle to the dedicated reset line of the tdm formatter.
|
||||
-
|
||||
-Example of TDMOUT_A on the S905X2 SoC:
|
||||
-
|
||||
-tdmout_a: audio-controller@500 {
|
||||
- compatible = "amlogic,axg-tdmout";
|
||||
- reg = <0x0 0x500 0x0 0x40>;
|
||||
- resets = <&clkc_audio AUD_RESET_TDMOUT_A>;
|
||||
- clocks = <&clkc_audio AUD_CLKID_TDMOUT_A>,
|
||||
- <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK>,
|
||||
- <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK_SEL>,
|
||||
- <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>,
|
||||
- <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>;
|
||||
- clock-names = "pclk", "sclk", "sclk_sel",
|
||||
- "lrclk", "lrclk_sel";
|
||||
-};
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..77b994df0c84
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.yaml
|
||||
@@ -0,0 +1,101 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-formatters.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic Audio AXG TDM formatters
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ $nodename:
|
||||
+ pattern: "^audio-controller@.*"
|
||||
+
|
||||
+ "#sound-dai-cells":
|
||||
+ const: 0
|
||||
+
|
||||
+ compatible:
|
||||
+ oneOf:
|
||||
+ - items:
|
||||
+ - enum:
|
||||
+ - amlogic,g12a-tdmout
|
||||
+ - amlogic,sm1-tdmout
|
||||
+ - const:
|
||||
+ amlogic,axg-tdmout
|
||||
+ - items:
|
||||
+ - const:
|
||||
+ amlogic,axg-tdmout
|
||||
+ - items:
|
||||
+ - enum:
|
||||
+ - amlogic,g12a-tdmin
|
||||
+ - amlogic,sm1-tdmin
|
||||
+ - const:
|
||||
+ amlogic,axg-tdmin
|
||||
+ - items:
|
||||
+ - const:
|
||||
+ amlogic,axg-tdmin
|
||||
+
|
||||
+ clocks:
|
||||
+ items:
|
||||
+ - description: Peripheral clock
|
||||
+ - description: Bit clock
|
||||
+ - description: Bit clock input multiplexer
|
||||
+ - description: Sample clock
|
||||
+ - description: Sample clock input multiplexer
|
||||
+
|
||||
+ clock-names:
|
||||
+ items:
|
||||
+ - const: pclk
|
||||
+ - const: sclk
|
||||
+ - const: sclk_sel
|
||||
+ - const: lrclk
|
||||
+ - const: lrclk_sel
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ resets:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+required:
|
||||
+ - "#sound-dai-cells"
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+
|
||||
+if:
|
||||
+ properties:
|
||||
+ compatible:
|
||||
+ contains:
|
||||
+ enum:
|
||||
+ - amlogic,g12a-tdmin
|
||||
+ - amlogic,sm1-tdmin
|
||||
+ - amlogic,g12a-tdmout
|
||||
+ - amlogic,sm1-tdmout
|
||||
+then:
|
||||
+ required:
|
||||
+ - resets
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||
+ #include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h>
|
||||
+
|
||||
+ tdmout_a: audio-controller@500 {
|
||||
+ compatible = "amlogic,g12a-tdmout",
|
||||
+ "amlogic,axg-tdmout";
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ reg = <0x0 0x500 0x0 0x40>;
|
||||
+ resets = <&clkc_audio AUD_RESET_TDMOUT_A>;
|
||||
+ clocks = <&clkc_audio AUD_CLKID_TDMOUT_A>,
|
||||
+ <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK>,
|
||||
+ <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK_SEL>,
|
||||
+ <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>,
|
||||
+ <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>;
|
||||
+ clock-names = "pclk", "sclk", "sclk_sel",
|
||||
+ "lrclk", "lrclk_sel";
|
||||
+ };
|
||||
+
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,148 +0,0 @@
|
||||
From 802e00bb5509e6f632e191b43d6fca75d4633890 Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:33:32 +0900
|
||||
Subject: [PATCH 038/187] FROMGIT: ASoC: soc-dai: add snd_soc_dai_startup()
|
||||
|
||||
Current ALSA SoC is directly using dai->driver->ops->xxx,
|
||||
thus, it has deep nested bracket, and it makes code unreadable.
|
||||
This patch adds new snd_soc_dai_startup() and use it.
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/87wogahn4i.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit 5a52a04531486e2ab069b7882432c8b266db36e6
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/sound/soc-dai.h | 2 ++
|
||||
sound/soc/soc-dai.c | 11 +++++++++++
|
||||
sound/soc/soc-dapm.c | 28 ++++++++++------------------
|
||||
sound/soc/soc-pcm.c | 27 +++++++++++----------------
|
||||
4 files changed, 34 insertions(+), 34 deletions(-)
|
||||
|
||||
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
|
||||
index 5222b6a758f2..0d16c5bb20bb 100644
|
||||
--- a/include/sound/soc-dai.h
|
||||
+++ b/include/sound/soc-dai.h
|
||||
@@ -150,6 +150,8 @@ int snd_soc_dai_hw_params(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_hw_params *params);
|
||||
void snd_soc_dai_hw_free(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream);
|
||||
+int snd_soc_dai_startup(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream);
|
||||
|
||||
struct snd_soc_dai_ops {
|
||||
/*
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
index 39a685e6acd5..6e196636e42f 100644
|
||||
--- a/sound/soc/soc-dai.c
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -289,3 +289,14 @@ void snd_soc_dai_hw_free(struct snd_soc_dai *dai,
|
||||
if (dai->driver->ops->hw_free)
|
||||
dai->driver->ops->hw_free(substream, dai);
|
||||
}
|
||||
+
|
||||
+int snd_soc_dai_startup(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ if (dai->driver->ops->startup)
|
||||
+ ret = dai->driver->ops->startup(substream, dai);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
|
||||
index a9a717376767..07fe331bce94 100644
|
||||
--- a/sound/soc/soc-dapm.c
|
||||
+++ b/sound/soc/soc-dapm.c
|
||||
@@ -3830,15 +3830,11 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
|
||||
snd_soc_dapm_widget_for_each_source_path(w, path) {
|
||||
source = path->source->priv;
|
||||
|
||||
- if (source->driver->ops->startup) {
|
||||
- ret = source->driver->ops->startup(&substream,
|
||||
- source);
|
||||
- if (ret < 0) {
|
||||
- dev_err(source->dev,
|
||||
- "ASoC: startup() failed: %d\n",
|
||||
- ret);
|
||||
- goto out;
|
||||
- }
|
||||
+ ret = snd_soc_dai_startup(source, &substream);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(source->dev,
|
||||
+ "ASoC: startup() failed: %d\n", ret);
|
||||
+ goto out;
|
||||
}
|
||||
source->active++;
|
||||
ret = snd_soc_dai_hw_params(source, &substream, params);
|
||||
@@ -3852,15 +3848,11 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
|
||||
snd_soc_dapm_widget_for_each_sink_path(w, path) {
|
||||
sink = path->sink->priv;
|
||||
|
||||
- if (sink->driver->ops->startup) {
|
||||
- ret = sink->driver->ops->startup(&substream,
|
||||
- sink);
|
||||
- if (ret < 0) {
|
||||
- dev_err(sink->dev,
|
||||
- "ASoC: startup() failed: %d\n",
|
||||
- ret);
|
||||
- goto out;
|
||||
- }
|
||||
+ ret = snd_soc_dai_startup(sink, &substream);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(sink->dev,
|
||||
+ "ASoC: startup() failed: %d\n", ret);
|
||||
+ goto out;
|
||||
}
|
||||
sink->active++;
|
||||
ret = snd_soc_dai_hw_params(sink, &substream, params);
|
||||
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
|
||||
index 58fc4e98ab59..9c8713a3eef1 100644
|
||||
--- a/sound/soc/soc-pcm.c
|
||||
+++ b/sound/soc/soc-pcm.c
|
||||
@@ -535,13 +535,11 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
|
||||
mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
|
||||
|
||||
/* startup the audio subsystem */
|
||||
- if (cpu_dai->driver->ops->startup) {
|
||||
- ret = cpu_dai->driver->ops->startup(substream, cpu_dai);
|
||||
- if (ret < 0) {
|
||||
- dev_err(cpu_dai->dev, "ASoC: can't open interface"
|
||||
- " %s: %d\n", cpu_dai->name, ret);
|
||||
- goto out;
|
||||
- }
|
||||
+ ret = snd_soc_dai_startup(cpu_dai, substream);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(cpu_dai->dev, "ASoC: can't open interface %s: %d\n",
|
||||
+ cpu_dai->name, ret);
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
ret = soc_pcm_components_open(substream, &component);
|
||||
@@ -549,15 +547,12 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
|
||||
goto component_err;
|
||||
|
||||
for_each_rtd_codec_dai(rtd, i, codec_dai) {
|
||||
- if (codec_dai->driver->ops->startup) {
|
||||
- ret = codec_dai->driver->ops->startup(substream,
|
||||
- codec_dai);
|
||||
- if (ret < 0) {
|
||||
- dev_err(codec_dai->dev,
|
||||
- "ASoC: can't open codec %s: %d\n",
|
||||
- codec_dai->name, ret);
|
||||
- goto codec_dai_err;
|
||||
- }
|
||||
+ ret = snd_soc_dai_startup(codec_dai, substream);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(codec_dai->dev,
|
||||
+ "ASoC: can't open codec %s: %d\n",
|
||||
+ codec_dai->name, ret);
|
||||
+ goto codec_dai_err;
|
||||
}
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,136 @@
|
||||
From 5368de679f0a3a99ec1c41bb4d7a4d4b3b05021f Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Fri, 24 Jan 2020 12:13:40 +0100
|
||||
Subject: [PATCH 038/146] WIP: ASoC: meson: convert axg pdm to schema
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
.../bindings/sound/amlogic,axg-pdm.txt | 29 -------
|
||||
.../bindings/sound/amlogic,axg-pdm.yaml | 79 +++++++++++++++++++
|
||||
2 files changed, 79 insertions(+), 29 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-pdm.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-pdm.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.txt
|
||||
deleted file mode 100644
|
||||
index 716878107a24..000000000000
|
||||
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.txt
|
||||
+++ /dev/null
|
||||
@@ -1,29 +0,0 @@
|
||||
-* Amlogic Audio PDM input
|
||||
-
|
||||
-Required properties:
|
||||
-- compatible: 'amlogic,axg-pdm' or
|
||||
- 'amlogic,g12a-pdm' or
|
||||
- 'amlogic,sm1-pdm'
|
||||
-- reg: physical base address of the controller and length of memory
|
||||
- mapped region.
|
||||
-- clocks: list of clock phandle, one for each entry clock-names.
|
||||
-- clock-names: should contain the following:
|
||||
- * "pclk" : peripheral clock.
|
||||
- * "dclk" : pdm digital clock
|
||||
- * "sysclk" : dsp system clock
|
||||
-- #sound-dai-cells: must be 0.
|
||||
-
|
||||
-Optional property:
|
||||
-- resets: phandle to the dedicated reset line of the pdm input.
|
||||
-
|
||||
-Example of PDM on the A113 SoC:
|
||||
-
|
||||
-pdm: audio-controller@ff632000 {
|
||||
- compatible = "amlogic,axg-pdm";
|
||||
- reg = <0x0 0xff632000 0x0 0x34>;
|
||||
- #sound-dai-cells = <0>;
|
||||
- clocks = <&clkc_audio AUD_CLKID_PDM>,
|
||||
- <&clkc_audio AUD_CLKID_PDM_DCLK>,
|
||||
- <&clkc_audio AUD_CLKID_PDM_SYSCLK>;
|
||||
- clock-names = "pclk", "dclk", "sysclk";
|
||||
-};
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..aa90b77e593d
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-pdm.yaml
|
||||
@@ -0,0 +1,79 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,axg-pdm.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic Audio AXG PDM input
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ $nodename:
|
||||
+ pattern: "^audio-controller@.*"
|
||||
+
|
||||
+ "#sound-dai-cells":
|
||||
+ const: 0
|
||||
+
|
||||
+ compatible:
|
||||
+ oneOf:
|
||||
+ - items:
|
||||
+ - enum:
|
||||
+ - amlogic,g12a-pdm
|
||||
+ - amlogic,sm1-pdm
|
||||
+ - const:
|
||||
+ amlogic,axg-pdm
|
||||
+ - items:
|
||||
+ - const:
|
||||
+ amlogic,axg-pdm
|
||||
+
|
||||
+ clocks:
|
||||
+ items:
|
||||
+ - description: Peripheral clock
|
||||
+ - description: PDM digital clock
|
||||
+ - description: DSP system clock
|
||||
+
|
||||
+ clock-names:
|
||||
+ items:
|
||||
+ - const: pclk
|
||||
+ - const: dclk
|
||||
+ - const: sysclk
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ resets:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+required:
|
||||
+ - "#sound-dai-cells"
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+
|
||||
+if:
|
||||
+ properties:
|
||||
+ compatible:
|
||||
+ contains:
|
||||
+ enum:
|
||||
+ - amlogic,g12a-pdm
|
||||
+ - amlogic,sm1-pdm
|
||||
+then:
|
||||
+ required:
|
||||
+ - resets
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||
+
|
||||
+ pdm: audio-controller@ff632000 {
|
||||
+ compatible = "amlogic,axg-pdm";
|
||||
+ reg = <0x0 0xff632000 0x0 0x34>;
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ clocks = <&clkc_audio AUD_CLKID_PDM>,
|
||||
+ <&clkc_audio AUD_CLKID_PDM_DCLK>,
|
||||
+ <&clkc_audio AUD_CLKID_PDM_SYSCLK>;
|
||||
+ clock-names = "pclk", "dclk", "sysclk";
|
||||
+ };
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,119 +0,0 @@
|
||||
From 6a25933b0671bb527f87675fcc77e5606b010626 Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:33:39 +0900
|
||||
Subject: [PATCH 039/187] FROMGIT: ASoC: soc-dai: add snd_soc_dai_shutdown()
|
||||
|
||||
Current ALSA SoC is directly using dai->driver->ops->xxx,
|
||||
thus, it has deep nested bracket, and it makes code unreadable.
|
||||
This patch adds new snd_soc_dai_shutdown() and use it.
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/87v9vuhn4b.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit 330fcb5135e0588b1ea3b0bbab587d1317c1cf7b
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/sound/soc-dai.h | 2 ++
|
||||
sound/soc/soc-dai.c | 7 +++++++
|
||||
sound/soc/soc-dapm.c | 7 ++-----
|
||||
sound/soc/soc-pcm.c | 18 ++++++------------
|
||||
4 files changed, 17 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
|
||||
index 0d16c5bb20bb..32545d457b3d 100644
|
||||
--- a/include/sound/soc-dai.h
|
||||
+++ b/include/sound/soc-dai.h
|
||||
@@ -152,6 +152,8 @@ void snd_soc_dai_hw_free(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream);
|
||||
int snd_soc_dai_startup(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream);
|
||||
+void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream);
|
||||
|
||||
struct snd_soc_dai_ops {
|
||||
/*
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
index 6e196636e42f..67ff6cc1fe02 100644
|
||||
--- a/sound/soc/soc-dai.c
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -300,3 +300,10 @@ int snd_soc_dai_startup(struct snd_soc_dai *dai,
|
||||
|
||||
return ret;
|
||||
}
|
||||
+
|
||||
+void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream)
|
||||
+{
|
||||
+ if (dai->driver->ops->shutdown)
|
||||
+ dai->driver->ops->shutdown(substream, dai);
|
||||
+}
|
||||
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
|
||||
index 07fe331bce94..bf0481df870d 100644
|
||||
--- a/sound/soc/soc-dapm.c
|
||||
+++ b/sound/soc/soc-dapm.c
|
||||
@@ -3895,9 +3895,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
|
||||
snd_soc_dai_hw_free(source, &substream);
|
||||
|
||||
source->active--;
|
||||
- if (source->driver->ops->shutdown)
|
||||
- source->driver->ops->shutdown(&substream,
|
||||
- source);
|
||||
+ snd_soc_dai_shutdown(source, &substream);
|
||||
}
|
||||
|
||||
substream.stream = SNDRV_PCM_STREAM_PLAYBACK;
|
||||
@@ -3907,8 +3905,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
|
||||
snd_soc_dai_hw_free(sink, &substream);
|
||||
|
||||
sink->active--;
|
||||
- if (sink->driver->ops->shutdown)
|
||||
- sink->driver->ops->shutdown(&substream, sink);
|
||||
+ snd_soc_dai_shutdown(sink, &substream);
|
||||
}
|
||||
break;
|
||||
|
||||
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
|
||||
index 9c8713a3eef1..ed5ae23c7104 100644
|
||||
--- a/sound/soc/soc-pcm.c
|
||||
+++ b/sound/soc/soc-pcm.c
|
||||
@@ -641,16 +641,13 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
|
||||
i = rtd->num_codecs;
|
||||
|
||||
codec_dai_err:
|
||||
- for_each_rtd_codec_dai_rollback(rtd, i, codec_dai) {
|
||||
- if (codec_dai->driver->ops->shutdown)
|
||||
- codec_dai->driver->ops->shutdown(substream, codec_dai);
|
||||
- }
|
||||
+ for_each_rtd_codec_dai_rollback(rtd, i, codec_dai)
|
||||
+ snd_soc_dai_shutdown(codec_dai, substream);
|
||||
|
||||
component_err:
|
||||
soc_pcm_components_close(substream, component);
|
||||
|
||||
- if (cpu_dai->driver->ops->shutdown)
|
||||
- cpu_dai->driver->ops->shutdown(substream, cpu_dai);
|
||||
+ snd_soc_dai_shutdown(cpu_dai, substream);
|
||||
out:
|
||||
mutex_unlock(&rtd->pcm_mutex);
|
||||
|
||||
@@ -728,13 +725,10 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
|
||||
|
||||
snd_soc_dai_digital_mute(cpu_dai, 1, substream->stream);
|
||||
|
||||
- if (cpu_dai->driver->ops->shutdown)
|
||||
- cpu_dai->driver->ops->shutdown(substream, cpu_dai);
|
||||
+ snd_soc_dai_shutdown(cpu_dai, substream);
|
||||
|
||||
- for_each_rtd_codec_dai(rtd, i, codec_dai) {
|
||||
- if (codec_dai->driver->ops->shutdown)
|
||||
- codec_dai->driver->ops->shutdown(substream, codec_dai);
|
||||
- }
|
||||
+ for_each_rtd_codec_dai(rtd, i, codec_dai)
|
||||
+ snd_soc_dai_shutdown(codec_dai, substream);
|
||||
|
||||
if (rtd->dai_link->ops->shutdown)
|
||||
rtd->dai_link->ops->shutdown(substream);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,173 @@
|
||||
From 0de05051f486a48f7c1a98c9d78ef4d9e4d0fc21 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Fri, 24 Jan 2020 15:40:25 +0100
|
||||
Subject: [PATCH 039/146] WIP: ASoC: meson: convert axg fifo to schema
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
.../bindings/sound/amlogic,axg-fifo.txt | 34 ------
|
||||
.../bindings/sound/amlogic,axg-fifo.yaml | 111 ++++++++++++++++++
|
||||
2 files changed, 111 insertions(+), 34 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-fifo.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-fifo.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.txt
|
||||
deleted file mode 100644
|
||||
index fa4545ed81ca..000000000000
|
||||
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.txt
|
||||
+++ /dev/null
|
||||
@@ -1,34 +0,0 @@
|
||||
-* Amlogic Audio FIFO controllers
|
||||
-
|
||||
-Required properties:
|
||||
-- compatible: 'amlogic,axg-toddr' or
|
||||
- 'amlogic,axg-toddr' or
|
||||
- 'amlogic,g12a-frddr' or
|
||||
- 'amlogic,g12a-toddr' or
|
||||
- 'amlogic,sm1-frddr' or
|
||||
- 'amlogic,sm1-toddr'
|
||||
-- reg: physical base address of the controller and length of memory
|
||||
- mapped region.
|
||||
-- interrupts: interrupt specifier for the fifo.
|
||||
-- clocks: phandle to the fifo peripheral clock provided by the audio
|
||||
- clock controller.
|
||||
-- resets: list of reset phandle, one for each entry reset-names.
|
||||
-- reset-names: should contain the following:
|
||||
- * "arb" : memory ARB line (required)
|
||||
- * "rst" : dedicated device reset line (optional)
|
||||
-- #sound-dai-cells: must be 0.
|
||||
-- amlogic,fifo-depth: The size of the controller's fifo in bytes. This
|
||||
- is useful for determining certain configuration such
|
||||
- as the flush threshold of the fifo
|
||||
-
|
||||
-Example of FRDDR A on the A113 SoC:
|
||||
-
|
||||
-frddr_a: audio-controller@1c0 {
|
||||
- compatible = "amlogic,axg-frddr";
|
||||
- reg = <0x0 0x1c0 0x0 0x1c>;
|
||||
- #sound-dai-cells = <0>;
|
||||
- interrupts = <GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
|
||||
- clocks = <&clkc_audio AUD_CLKID_FRDDR_A>;
|
||||
- resets = <&arb AXG_ARB_FRDDR_A>;
|
||||
- fifo-depth = <512>;
|
||||
-};
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..d9fe4f624784
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-fifo.yaml
|
||||
@@ -0,0 +1,111 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,axg-fifo.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic AXG Audio FIFO controllers
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ $nodename:
|
||||
+ pattern: "^audio-controller@.*"
|
||||
+
|
||||
+ "#sound-dai-cells":
|
||||
+ const: 0
|
||||
+
|
||||
+ compatible:
|
||||
+ oneOf:
|
||||
+ - items:
|
||||
+ - const:
|
||||
+ amlogic,axg-toddr
|
||||
+ - items:
|
||||
+ - const:
|
||||
+ amlogic,axg-frddr
|
||||
+ - items:
|
||||
+ - enum:
|
||||
+ - amlogic,g12a-toddr
|
||||
+ - amlogic,sm1-toddr
|
||||
+ - const:
|
||||
+ amlogic,axg-toddr
|
||||
+ - items:
|
||||
+ - enum:
|
||||
+ - amlogic,g12a-frddr
|
||||
+ - amlogic,sm1-frddr
|
||||
+ - const:
|
||||
+ amlogic,axg-frddr
|
||||
+
|
||||
+ clocks:
|
||||
+ items:
|
||||
+ - description: Peripheral clock
|
||||
+
|
||||
+ interrupts:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ resets:
|
||||
+ minItems: 1
|
||||
+ items:
|
||||
+ - description: Memory ARB line
|
||||
+ - description: Dedicated device reset line
|
||||
+
|
||||
+ reset-names:
|
||||
+ minItems: 1
|
||||
+ items:
|
||||
+ - const: arb
|
||||
+ - const: rst
|
||||
+
|
||||
+ amlogic,fifo-depth:
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||
+ description: Size of the controller's fifo in bytes
|
||||
+
|
||||
+required:
|
||||
+ - "#sound-dai-cells"
|
||||
+ - compatible
|
||||
+ - interrupts
|
||||
+ - reg
|
||||
+ - clocks
|
||||
+ - resets
|
||||
+ - amlogic,fifo-depth
|
||||
+
|
||||
+if:
|
||||
+ properties:
|
||||
+ compatible:
|
||||
+ contains:
|
||||
+ enum:
|
||||
+ - amlogic,g12a-toddr
|
||||
+ - amlogic,sm1-toddr
|
||||
+ - amlogic,g12a-frddr
|
||||
+ - amlogic,sm1-frddr
|
||||
+then:
|
||||
+ properties:
|
||||
+ resets:
|
||||
+ minItems: 2
|
||||
+ reset-names:
|
||||
+ minItems: 2
|
||||
+ required:
|
||||
+ - reset-names
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||
+ #include <dt-bindings/interrupt-controller/irq.h>
|
||||
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+ #include <dt-bindings/reset/amlogic,meson-axg-audio-arb.h>
|
||||
+ #include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h>
|
||||
+
|
||||
+ frddr_a: audio-controller@1c0 {
|
||||
+ compatible = "amlogic,g12a-frddr", "amlogic,axg-frddr";
|
||||
+ reg = <0x0 0x1c0 0x0 0x1c>;
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ interrupts = <GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
|
||||
+ clocks = <&clkc_audio AUD_CLKID_FRDDR_A>;
|
||||
+ resets = <&arb AXG_ARB_FRDDR_A>, <&clkc_audio AUD_RESET_FRDDR_A>;
|
||||
+ reset-names = "arb", "rst";
|
||||
+ amlogic,fifo-depth = <512>;
|
||||
+ };
|
||||
+
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,99 +0,0 @@
|
||||
From b01d6fd0df6236709ab10b327393f6c1724584e1 Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:33:45 +0900
|
||||
Subject: [PATCH 040/187] FROMGIT: ASoC: soc-dai: add snd_soc_dai_prepare()
|
||||
|
||||
Current ALSA SoC is directly using dai->driver->ops->xxx,
|
||||
thus, it has deep nested bracket, and it makes code unreadable.
|
||||
This patch adds new snd_soc_dai_prepare() and use it.
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/87tvbehn46.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit 4beb8e109d30d339d44308a767dd6f5614492f3e
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/sound/soc-dai.h | 2 ++
|
||||
sound/soc/soc-dai.c | 11 +++++++++++
|
||||
sound/soc/soc-pcm.c | 27 +++++++++++----------------
|
||||
3 files changed, 24 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
|
||||
index 32545d457b3d..c7dff6a0b5b9 100644
|
||||
--- a/include/sound/soc-dai.h
|
||||
+++ b/include/sound/soc-dai.h
|
||||
@@ -154,6 +154,8 @@ int snd_soc_dai_startup(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream);
|
||||
void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream);
|
||||
+int snd_soc_dai_prepare(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream);
|
||||
|
||||
struct snd_soc_dai_ops {
|
||||
/*
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
index 67ff6cc1fe02..cb810888c563 100644
|
||||
--- a/sound/soc/soc-dai.c
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -307,3 +307,14 @@ void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
|
||||
if (dai->driver->ops->shutdown)
|
||||
dai->driver->ops->shutdown(substream, dai);
|
||||
}
|
||||
+
|
||||
+int snd_soc_dai_prepare(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ if (dai->driver->ops->prepare)
|
||||
+ ret = dai->driver->ops->prepare(substream, dai);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
|
||||
index ed5ae23c7104..d7611af90dce 100644
|
||||
--- a/sound/soc/soc-pcm.c
|
||||
+++ b/sound/soc/soc-pcm.c
|
||||
@@ -814,27 +814,22 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream)
|
||||
}
|
||||
|
||||
for_each_rtd_codec_dai(rtd, i, codec_dai) {
|
||||
- if (codec_dai->driver->ops->prepare) {
|
||||
- ret = codec_dai->driver->ops->prepare(substream,
|
||||
- codec_dai);
|
||||
- if (ret < 0) {
|
||||
- dev_err(codec_dai->dev,
|
||||
- "ASoC: codec DAI prepare error: %d\n",
|
||||
- ret);
|
||||
- goto out;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (cpu_dai->driver->ops->prepare) {
|
||||
- ret = cpu_dai->driver->ops->prepare(substream, cpu_dai);
|
||||
+ ret = snd_soc_dai_prepare(codec_dai, substream);
|
||||
if (ret < 0) {
|
||||
- dev_err(cpu_dai->dev,
|
||||
- "ASoC: cpu DAI prepare error: %d\n", ret);
|
||||
+ dev_err(codec_dai->dev,
|
||||
+ "ASoC: codec DAI prepare error: %d\n",
|
||||
+ ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
+ ret = snd_soc_dai_prepare(cpu_dai, substream);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(cpu_dai->dev,
|
||||
+ "ASoC: cpu DAI prepare error: %d\n", ret);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
/* cancel any delayed stream shutdown that is pending */
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
|
||||
rtd->pop_wait) {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,139 @@
|
||||
From 9542ee0e99f6c34fc0c455502653602343f45880 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Fri, 24 Jan 2020 15:52:03 +0100
|
||||
Subject: [PATCH 040/146] WIP: ASoC: meson: convert axg spdif input to schema
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
.../bindings/sound/amlogic,axg-spdifin.txt | 27 ------
|
||||
.../bindings/sound/amlogic,axg-spdifin.yaml | 84 +++++++++++++++++++
|
||||
2 files changed, 84 insertions(+), 27 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.txt
|
||||
deleted file mode 100644
|
||||
index df92a4ecf288..000000000000
|
||||
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.txt
|
||||
+++ /dev/null
|
||||
@@ -1,27 +0,0 @@
|
||||
-* Amlogic Audio SPDIF Input
|
||||
-
|
||||
-Required properties:
|
||||
-- compatible: 'amlogic,axg-spdifin' or
|
||||
- 'amlogic,g12a-spdifin' or
|
||||
- 'amlogic,sm1-spdifin'
|
||||
-- interrupts: interrupt specifier for the spdif input.
|
||||
-- clocks: list of clock phandle, one for each entry clock-names.
|
||||
-- clock-names: should contain the following:
|
||||
- * "pclk" : peripheral clock.
|
||||
- * "refclk" : spdif input reference clock
|
||||
-- #sound-dai-cells: must be 0.
|
||||
-
|
||||
-Optional property:
|
||||
-- resets: phandle to the dedicated reset line of the spdif input.
|
||||
-
|
||||
-Example on the A113 SoC:
|
||||
-
|
||||
-spdifin: audio-controller@400 {
|
||||
- compatible = "amlogic,axg-spdifin";
|
||||
- reg = <0x0 0x400 0x0 0x30>;
|
||||
- #sound-dai-cells = <0>;
|
||||
- interrupts = <GIC_SPI 87 IRQ_TYPE_EDGE_RISING>;
|
||||
- clocks = <&clkc_audio AUD_CLKID_SPDIFIN>,
|
||||
- <&clkc_audio AUD_CLKID_SPDIFIN_CLK>;
|
||||
- clock-names = "pclk", "refclk";
|
||||
-};
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..b9b0863c5723
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.yaml
|
||||
@@ -0,0 +1,84 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,axg-spdifin.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic Audio AXG SPDIF Input
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ $nodename:
|
||||
+ pattern: "^audio-controller@.*"
|
||||
+
|
||||
+ "#sound-dai-cells":
|
||||
+ const: 0
|
||||
+
|
||||
+ compatible:
|
||||
+ oneOf:
|
||||
+ - items:
|
||||
+ - const:
|
||||
+ amlogic,axg-spdifin
|
||||
+ - items:
|
||||
+ - enum:
|
||||
+ - amlogic,g12a-spdifin
|
||||
+ - amlogic,sm1-spdifin
|
||||
+ - const:
|
||||
+ amlogic,axg-spdifin
|
||||
+
|
||||
+ clocks:
|
||||
+ items:
|
||||
+ - description: Peripheral clock
|
||||
+ - description: SPDIF input reference clock
|
||||
+
|
||||
+ clock-names:
|
||||
+ items:
|
||||
+ - const: pclk
|
||||
+ - const: refclk
|
||||
+
|
||||
+ interrupts:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ resets:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+required:
|
||||
+ - "#sound-dai-cells"
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - interrupts
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+
|
||||
+if:
|
||||
+ properties:
|
||||
+ compatible:
|
||||
+ contains:
|
||||
+ enum:
|
||||
+ - amlogic,g12a-spdifin
|
||||
+ - amlogic,sm1-spdifin
|
||||
+then:
|
||||
+ required:
|
||||
+ - resets
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||
+ #include <dt-bindings/interrupt-controller/irq.h>
|
||||
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+
|
||||
+ spdifin: audio-controller@400 {
|
||||
+ compatible = "amlogic,axg-spdifin";
|
||||
+ reg = <0x0 0x400 0x0 0x30>;
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ interrupts = <GIC_SPI 87 IRQ_TYPE_EDGE_RISING>;
|
||||
+ clocks = <&clkc_audio AUD_CLKID_SPDIFIN>,
|
||||
+ <&clkc_audio AUD_CLKID_SPDIFIN_CLK>;
|
||||
+ clock-names = "pclk", "refclk";
|
||||
+ };
|
||||
+
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,92 +0,0 @@
|
||||
From b482fd77bd3cdd5fb8d3056f0c5363344c1703ec Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:33:51 +0900
|
||||
Subject: [PATCH 041/187] FROMGIT: ASoC: soc-dai: add snd_soc_dai_trigger()
|
||||
|
||||
Current ALSA SoC is directly using dai->driver->ops->xxx,
|
||||
thus, it has deep nested bracket, and it makes code unreadable.
|
||||
This patch adds new snd_soc_dai_trigger() and use it.
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/87sgqyhn40.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit 95aef35533844f35544851b0cdc1fc154b603307
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/sound/soc-dai.h | 2 ++
|
||||
sound/soc/soc-dai.c | 12 ++++++++++++
|
||||
sound/soc/soc-pcm.c | 17 ++++++-----------
|
||||
3 files changed, 20 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
|
||||
index c7dff6a0b5b9..72b8e76f1cc4 100644
|
||||
--- a/include/sound/soc-dai.h
|
||||
+++ b/include/sound/soc-dai.h
|
||||
@@ -156,6 +156,8 @@ void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream);
|
||||
int snd_soc_dai_prepare(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream);
|
||||
+int snd_soc_dai_trigger(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream, int cmd);
|
||||
|
||||
struct snd_soc_dai_ops {
|
||||
/*
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
index cb810888c563..18c447e169f6 100644
|
||||
--- a/sound/soc/soc-dai.c
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -318,3 +318,15 @@ int snd_soc_dai_prepare(struct snd_soc_dai *dai,
|
||||
|
||||
return ret;
|
||||
}
|
||||
+
|
||||
+int snd_soc_dai_trigger(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream,
|
||||
+ int cmd)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ if (dai->driver->ops->trigger)
|
||||
+ ret = dai->driver->ops->trigger(substream, cmd, dai);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
|
||||
index d7611af90dce..a628b08f966e 100644
|
||||
--- a/sound/soc/soc-pcm.c
|
||||
+++ b/sound/soc/soc-pcm.c
|
||||
@@ -1084,12 +1084,9 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||
int i, ret;
|
||||
|
||||
for_each_rtd_codec_dai(rtd, i, codec_dai) {
|
||||
- if (codec_dai->driver->ops->trigger) {
|
||||
- ret = codec_dai->driver->ops->trigger(substream,
|
||||
- cmd, codec_dai);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
- }
|
||||
+ ret = snd_soc_dai_trigger(codec_dai, substream, cmd);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
for_each_rtdcom(rtd, rtdcom) {
|
||||
@@ -1104,11 +1101,9 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (cpu_dai->driver->ops->trigger) {
|
||||
- ret = cpu_dai->driver->ops->trigger(substream, cmd, cpu_dai);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
- }
|
||||
+ snd_soc_dai_trigger(cpu_dai, substream, cmd);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
|
||||
if (rtd->dai_link->ops->trigger) {
|
||||
ret = rtd->dai_link->ops->trigger(substream, cmd);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,130 @@
|
||||
From 5692af2959d8c9571500c1f8da856ed6c75f8ffe Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Fri, 24 Jan 2020 15:58:18 +0100
|
||||
Subject: [PATCH 041/146] WIP: ASoC: meson: convert axg spdif output to schema
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
.../bindings/sound/amlogic,axg-spdifout.txt | 25 ------
|
||||
.../bindings/sound/amlogic,axg-spdifout.yaml | 77 +++++++++++++++++++
|
||||
2 files changed, 77 insertions(+), 25 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.txt
|
||||
deleted file mode 100644
|
||||
index 28381dd1f633..000000000000
|
||||
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.txt
|
||||
+++ /dev/null
|
||||
@@ -1,25 +0,0 @@
|
||||
-* Amlogic Audio SPDIF Output
|
||||
-
|
||||
-Required properties:
|
||||
-- compatible: 'amlogic,axg-spdifout' or
|
||||
- 'amlogic,g12a-spdifout' or
|
||||
- 'amlogic,sm1-spdifout'
|
||||
-- clocks: list of clock phandle, one for each entry clock-names.
|
||||
-- clock-names: should contain the following:
|
||||
- * "pclk" : peripheral clock.
|
||||
- * "mclk" : master clock
|
||||
-- #sound-dai-cells: must be 0.
|
||||
-
|
||||
-Optional property:
|
||||
-- resets: phandle to the dedicated reset line of the spdif output.
|
||||
-
|
||||
-Example on the A113 SoC:
|
||||
-
|
||||
-spdifout: audio-controller@480 {
|
||||
- compatible = "amlogic,axg-spdifout";
|
||||
- reg = <0x0 0x480 0x0 0x50>;
|
||||
- #sound-dai-cells = <0>;
|
||||
- clocks = <&clkc_audio AUD_CLKID_SPDIFOUT>,
|
||||
- <&clkc_audio AUD_CLKID_SPDIFOUT_CLK>;
|
||||
- clock-names = "pclk", "mclk";
|
||||
-};
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..9ac52916f88b
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.yaml
|
||||
@@ -0,0 +1,77 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,axg-spdifout.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic Audio AXG SPDIF Output
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ $nodename:
|
||||
+ pattern: "^audio-controller@.*"
|
||||
+
|
||||
+ "#sound-dai-cells":
|
||||
+ const: 0
|
||||
+
|
||||
+ compatible:
|
||||
+ oneOf:
|
||||
+ - items:
|
||||
+ - const:
|
||||
+ amlogic,axg-spdifout
|
||||
+ - items:
|
||||
+ - enum:
|
||||
+ - amlogic,g12a-spdifout
|
||||
+ - amlogic,sm1-spdifout
|
||||
+ - const:
|
||||
+ amlogic,axg-spdifout
|
||||
+
|
||||
+ clocks:
|
||||
+ items:
|
||||
+ - description: Peripheral clock
|
||||
+ - description: SPDIF output master clock
|
||||
+
|
||||
+ clock-names:
|
||||
+ items:
|
||||
+ - const: pclk
|
||||
+ - const: mclk
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ resets:
|
||||
+ items:
|
||||
+ - description: dedicated device reset line
|
||||
+
|
||||
+required:
|
||||
+ - "#sound-dai-cells"
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+
|
||||
+if:
|
||||
+ properties:
|
||||
+ compatible:
|
||||
+ contains:
|
||||
+ enum:
|
||||
+ - amlogic,g12a-spdifout
|
||||
+ - amlogic,sm1-spdifout
|
||||
+then:
|
||||
+ required:
|
||||
+ - resets
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/clock/axg-audio-clkc.h>
|
||||
+
|
||||
+ spdifout: audio-controller@480 {
|
||||
+ compatible = "amlogic,axg-spdifout";
|
||||
+ reg = <0x0 0x480 0x0 0x50>;
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ clocks = <&clkc_audio AUD_CLKID_SPDIFOUT>,
|
||||
+ <&clkc_audio AUD_CLKID_SPDIFOUT_CLK>;
|
||||
+ clock-names = "pclk", "mclk";
|
||||
+ };
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,88 +0,0 @@
|
||||
From c2e057a8973e801a7cf4cb3a5999376927e651fb Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:33:56 +0900
|
||||
Subject: [PATCH 042/187] FROMGIT: ASoC: soc-dai: add
|
||||
snd_soc_dai_bespoke_trigger()
|
||||
|
||||
Current ALSA SoC is directly using dai->driver->ops->xxx,
|
||||
thus, it has deep nested bracket, and it makes code unreadable.
|
||||
This patch adds new snd_soc_dai_bespoke_trigger() and use it.
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/87r26ihn3u.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit 5c0769af4caf8fbdad2e9c0051ab0081b8e22b0a
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/sound/soc-dai.h | 2 ++
|
||||
sound/soc/soc-dai.c | 12 ++++++++++++
|
||||
sound/soc/soc-pcm.c | 16 ++++++----------
|
||||
3 files changed, 20 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
|
||||
index 72b8e76f1cc4..6a5566d459ad 100644
|
||||
--- a/include/sound/soc-dai.h
|
||||
+++ b/include/sound/soc-dai.h
|
||||
@@ -158,6 +158,8 @@ int snd_soc_dai_prepare(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream);
|
||||
int snd_soc_dai_trigger(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream, int cmd);
|
||||
+int snd_soc_dai_bespoke_trigger(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream, int cmd);
|
||||
|
||||
struct snd_soc_dai_ops {
|
||||
/*
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
index 18c447e169f6..6f466cfcbeef 100644
|
||||
--- a/sound/soc/soc-dai.c
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -330,3 +330,15 @@ int snd_soc_dai_trigger(struct snd_soc_dai *dai,
|
||||
|
||||
return ret;
|
||||
}
|
||||
+
|
||||
+int snd_soc_dai_bespoke_trigger(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream,
|
||||
+ int cmd)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ if (dai->driver->ops->bespoke_trigger)
|
||||
+ ret = dai->driver->ops->bespoke_trigger(substream, cmd, dai);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
|
||||
index a628b08f966e..a10627f1ceff 100644
|
||||
--- a/sound/soc/soc-pcm.c
|
||||
+++ b/sound/soc/soc-pcm.c
|
||||
@@ -1123,19 +1123,15 @@ static int soc_pcm_bespoke_trigger(struct snd_pcm_substream *substream,
|
||||
int i, ret;
|
||||
|
||||
for_each_rtd_codec_dai(rtd, i, codec_dai) {
|
||||
- if (codec_dai->driver->ops->bespoke_trigger) {
|
||||
- ret = codec_dai->driver->ops->bespoke_trigger(substream,
|
||||
- cmd, codec_dai);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (cpu_dai->driver->ops->bespoke_trigger) {
|
||||
- ret = cpu_dai->driver->ops->bespoke_trigger(substream, cmd, cpu_dai);
|
||||
+ ret = snd_soc_dai_bespoke_trigger(codec_dai, substream, cmd);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
+
|
||||
+ snd_soc_dai_bespoke_trigger(cpu_dai, substream, cmd);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,140 @@
|
||||
From bd5ce2ad81a130c1e57c191efaa4c1b0d14c8351 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Fri, 24 Jan 2020 16:02:43 +0100
|
||||
Subject: [PATCH 042/146] WIP: ASoC: meson: convert g12a tohdmitx control to
|
||||
schema
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
.../bindings/sound/amlogic,g12a-tohdmitx.txt | 58 -------------------
|
||||
.../bindings/sound/amlogic,g12a-tohdmitx.yaml | 53 +++++++++++++++++
|
||||
2 files changed, 53 insertions(+), 58 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.txt b/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.txt
|
||||
deleted file mode 100644
|
||||
index 4e8cd7eb7cec..000000000000
|
||||
--- a/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.txt
|
||||
+++ /dev/null
|
||||
@@ -1,58 +0,0 @@
|
||||
-* Amlogic HDMI Tx control glue
|
||||
-
|
||||
-Required properties:
|
||||
-- compatible: "amlogic,g12a-tohdmitx" or
|
||||
- "amlogic,sm1-tohdmitx"
|
||||
-- reg: physical base address of the controller and length of memory
|
||||
- mapped region.
|
||||
-- #sound-dai-cells: should be 1.
|
||||
-- resets: phandle to the dedicated reset line of the hdmitx glue.
|
||||
-
|
||||
-Example on the S905X2 SoC:
|
||||
-
|
||||
-tohdmitx: audio-controller@744 {
|
||||
- compatible = "amlogic,g12a-tohdmitx";
|
||||
- reg = <0x0 0x744 0x0 0x4>;
|
||||
- #sound-dai-cells = <1>;
|
||||
- resets = <&clkc_audio AUD_RESET_TOHDMITX>;
|
||||
-};
|
||||
-
|
||||
-Example of an 'amlogic,axg-sound-card':
|
||||
-
|
||||
-sound {
|
||||
- compatible = "amlogic,axg-sound-card";
|
||||
-
|
||||
-[...]
|
||||
-
|
||||
- dai-link-x {
|
||||
- sound-dai = <&tdmif_a>;
|
||||
- dai-format = "i2s";
|
||||
- dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
-
|
||||
- codec-0 {
|
||||
- sound-dai = <&tohdmitx TOHDMITX_I2S_IN_A>;
|
||||
- };
|
||||
-
|
||||
- codec-1 {
|
||||
- sound-dai = <&external_dac>;
|
||||
- };
|
||||
- };
|
||||
-
|
||||
- dai-link-y {
|
||||
- sound-dai = <&tdmif_c>;
|
||||
- dai-format = "i2s";
|
||||
- dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
-
|
||||
- codec {
|
||||
- sound-dai = <&tohdmitx TOHDMITX_I2S_IN_C>;
|
||||
- };
|
||||
- };
|
||||
-
|
||||
- dai-link-z {
|
||||
- sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>;
|
||||
-
|
||||
- codec {
|
||||
- sound-dai = <&hdmi_tx>;
|
||||
- };
|
||||
- };
|
||||
-};
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.yaml b/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..fdd64d103f33
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.yaml
|
||||
@@ -0,0 +1,53 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,g12a-tohdmitx.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic G12a HDMI Tx Control Glue
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ $nodename:
|
||||
+ pattern: "^audio-controller@.*"
|
||||
+
|
||||
+ "#sound-dai-cells":
|
||||
+ const: 1
|
||||
+
|
||||
+ compatible:
|
||||
+ oneOf:
|
||||
+ - items:
|
||||
+ - const:
|
||||
+ amlogic,g12a-tohdmitx
|
||||
+ - items:
|
||||
+ - enum:
|
||||
+ - amlogic,sm1-tohdmitx
|
||||
+ - const:
|
||||
+ amlogic,g12a-tohdmitx
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ resets:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+required:
|
||||
+ - "#sound-dai-cells"
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - resets
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h>
|
||||
+
|
||||
+ tohdmitx: audio-controller@744 {
|
||||
+ compatible = "amlogic,g12a-tohdmitx";
|
||||
+ reg = <0x0 0x744 0x0 0x4>;
|
||||
+ #sound-dai-cells = <1>;
|
||||
+ resets = <&clkc_audio AUD_RESET_TOHDMITX>;
|
||||
+ };
|
||||
+
|
||||
+
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,78 +0,0 @@
|
||||
From 32507410f948dfd2e37689912ce57a4ffc396fa0 Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:34:09 +0900
|
||||
Subject: [PATCH 043/187] FROMGIT: ASoC: soc-dai: add snd_soc_dai_delay()
|
||||
|
||||
Current ALSA SoC is directly using dai->driver->ops->xxx,
|
||||
thus, it has deep nested bracket, and it makes code unreadable.
|
||||
This patch adds new snd_soc_dai_delay() and use it.
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/87o91mhn3i.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit 1dea80d4b2bd3b53c58f008ca2bcd73182583711
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/sound/soc-dai.h | 2 ++
|
||||
sound/soc/soc-dai.c | 11 +++++++++++
|
||||
sound/soc/soc-pcm.c | 9 +++------
|
||||
3 files changed, 16 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
|
||||
index 6a5566d459ad..7cfed3034511 100644
|
||||
--- a/include/sound/soc-dai.h
|
||||
+++ b/include/sound/soc-dai.h
|
||||
@@ -160,6 +160,8 @@ int snd_soc_dai_trigger(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream, int cmd);
|
||||
int snd_soc_dai_bespoke_trigger(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream, int cmd);
|
||||
+snd_pcm_sframes_t snd_soc_dai_delay(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream);
|
||||
|
||||
struct snd_soc_dai_ops {
|
||||
/*
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
index 6f466cfcbeef..5b5b979cd1f3 100644
|
||||
--- a/sound/soc/soc-dai.c
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -342,3 +342,14 @@ int snd_soc_dai_bespoke_trigger(struct snd_soc_dai *dai,
|
||||
|
||||
return ret;
|
||||
}
|
||||
+
|
||||
+snd_pcm_sframes_t snd_soc_dai_delay(struct snd_soc_dai *dai,
|
||||
+ struct snd_pcm_substream *substream)
|
||||
+{
|
||||
+ int delay = 0;
|
||||
+
|
||||
+ if (dai->driver->ops->delay)
|
||||
+ delay = dai->driver->ops->delay(substream, dai);
|
||||
+
|
||||
+ return delay;
|
||||
+}
|
||||
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
|
||||
index a10627f1ceff..f3137723301c 100644
|
||||
--- a/sound/soc/soc-pcm.c
|
||||
+++ b/sound/soc/soc-pcm.c
|
||||
@@ -1169,14 +1169,11 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
|
||||
/* base delay if assigned in pointer callback */
|
||||
delay = runtime->delay;
|
||||
|
||||
- if (cpu_dai->driver->ops->delay)
|
||||
- delay += cpu_dai->driver->ops->delay(substream, cpu_dai);
|
||||
+ delay += snd_soc_dai_delay(cpu_dai, substream);
|
||||
|
||||
for_each_rtd_codec_dai(rtd, i, codec_dai) {
|
||||
- if (codec_dai->driver->ops->delay)
|
||||
- codec_delay = max(codec_delay,
|
||||
- codec_dai->driver->ops->delay(substream,
|
||||
- codec_dai));
|
||||
+ codec_delay = max(codec_delay,
|
||||
+ snd_soc_dai_delay(codec_dai, substream));
|
||||
}
|
||||
delay += codec_delay;
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,334 @@
|
||||
From 5c25f36c7a292ca0ec9f5415ae938b111c878ae5 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Fri, 24 Jan 2020 18:23:36 +0100
|
||||
Subject: [PATCH 043/146] WIP: ASoC: meson: convert axg sound card control to
|
||||
schema
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
.../bindings/sound/amlogic,axg-sound-card.txt | 124 ------------
|
||||
.../sound/amlogic,axg-sound-card.yaml | 181 ++++++++++++++++++
|
||||
2 files changed, 181 insertions(+), 124 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.txt b/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.txt
|
||||
deleted file mode 100644
|
||||
index 80b411296480..000000000000
|
||||
--- a/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.txt
|
||||
+++ /dev/null
|
||||
@@ -1,124 +0,0 @@
|
||||
-Amlogic AXG sound card:
|
||||
-
|
||||
-Required properties:
|
||||
-
|
||||
-- compatible: "amlogic,axg-sound-card"
|
||||
-- model : User specified audio sound card name, one string
|
||||
-
|
||||
-Optional properties:
|
||||
-
|
||||
-- audio-aux-devs : List of phandles pointing to auxiliary devices
|
||||
-- audio-widgets : Please refer to widgets.txt.
|
||||
-- audio-routing : A list of the connections between audio components.
|
||||
-
|
||||
-Subnodes:
|
||||
-
|
||||
-- dai-link: Container for dai-link level properties and the CODEC
|
||||
- sub-nodes. There should be at least one (and probably more)
|
||||
- subnode of this type.
|
||||
-
|
||||
-Required dai-link properties:
|
||||
-
|
||||
-- sound-dai: phandle and port of the CPU DAI.
|
||||
-
|
||||
-Required TDM Backend dai-link properties:
|
||||
-- dai-format : CPU/CODEC common audio format
|
||||
-
|
||||
-Optional TDM Backend dai-link properties:
|
||||
-- dai-tdm-slot-rx-mask-{0,1,2,3}: Receive direction slot masks
|
||||
-- dai-tdm-slot-tx-mask-{0,1,2,3}: Transmit direction slot masks
|
||||
- When omitted, mask is assumed to have to no
|
||||
- slots. A valid must have at one slot, so at
|
||||
- least one these mask should be provided with
|
||||
- an enabled slot.
|
||||
-- dai-tdm-slot-num : Please refer to tdm-slot.txt.
|
||||
- If omitted, slot number is set to accommodate the largest
|
||||
- mask provided.
|
||||
-- dai-tdm-slot-width : Please refer to tdm-slot.txt. default to 32 if omitted.
|
||||
-- mclk-fs : Multiplication factor between stream rate and mclk
|
||||
-
|
||||
-Backend dai-link subnodes:
|
||||
-
|
||||
-- codec: dai-link representing backend links should have at least one subnode.
|
||||
- One subnode for each codec of the dai-link.
|
||||
- dai-link representing frontend links have no codec, therefore have no
|
||||
- subnodes
|
||||
-
|
||||
-Required codec subnodes properties:
|
||||
-
|
||||
-- sound-dai: phandle and port of the CODEC DAI.
|
||||
-
|
||||
-Optional codec subnodes properties:
|
||||
-
|
||||
-- dai-tdm-slot-tx-mask : Please refer to tdm-slot.txt.
|
||||
-- dai-tdm-slot-rx-mask : Please refer to tdm-slot.txt.
|
||||
-
|
||||
-Example:
|
||||
-
|
||||
-sound {
|
||||
- compatible = "amlogic,axg-sound-card";
|
||||
- model = "AXG-S420";
|
||||
- audio-aux-devs = <&tdmin_a>, <&tdmout_c>;
|
||||
- audio-widgets = "Line", "Lineout",
|
||||
- "Line", "Linein",
|
||||
- "Speaker", "Speaker1 Left",
|
||||
- "Speaker", "Speaker1 Right";
|
||||
- "Speaker", "Speaker2 Left",
|
||||
- "Speaker", "Speaker2 Right";
|
||||
- audio-routing = "TDMOUT_C IN 0", "FRDDR_A OUT 2",
|
||||
- "SPDIFOUT IN 0", "FRDDR_A OUT 3",
|
||||
- "TDM_C Playback", "TDMOUT_C OUT",
|
||||
- "TDMIN_A IN 2", "TDM_C Capture",
|
||||
- "TDMIN_A IN 5", "TDM_C Loopback",
|
||||
- "TODDR_A IN 0", "TDMIN_A OUT",
|
||||
- "Lineout", "Lineout AOUTL",
|
||||
- "Lineout", "Lineout AOUTR",
|
||||
- "Speaker1 Left", "SPK1 OUT_A",
|
||||
- "Speaker2 Left", "SPK2 OUT_A",
|
||||
- "Speaker1 Right", "SPK1 OUT_B",
|
||||
- "Speaker2 Right", "SPK2 OUT_B",
|
||||
- "Linein AINL", "Linein",
|
||||
- "Linein AINR", "Linein";
|
||||
-
|
||||
- dai-link@0 {
|
||||
- sound-dai = <&frddr_a>;
|
||||
- };
|
||||
-
|
||||
- dai-link@1 {
|
||||
- sound-dai = <&toddr_a>;
|
||||
- };
|
||||
-
|
||||
- dai-link@2 {
|
||||
- sound-dai = <&tdmif_c>;
|
||||
- dai-format = "i2s";
|
||||
- dai-tdm-slot-tx-mask-2 = <1 1>;
|
||||
- dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
- dai-tdm-slot-rx-mask-1 = <1 1>;
|
||||
- mclk-fs = <256>;
|
||||
-
|
||||
- codec@0 {
|
||||
- sound-dai = <&lineout>;
|
||||
- };
|
||||
-
|
||||
- codec@1 {
|
||||
- sound-dai = <&speaker_amp1>;
|
||||
- };
|
||||
-
|
||||
- codec@2 {
|
||||
- sound-dai = <&speaker_amp2>;
|
||||
- };
|
||||
-
|
||||
- codec@3 {
|
||||
- sound-dai = <&linein>;
|
||||
- };
|
||||
-
|
||||
- };
|
||||
-
|
||||
- dai-link@3 {
|
||||
- sound-dai = <&spdifout>;
|
||||
-
|
||||
- codec {
|
||||
- sound-dai = <&spdif_dit>;
|
||||
- };
|
||||
- };
|
||||
-};
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.yaml b/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..168d84b2dcb7
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.yaml
|
||||
@@ -0,0 +1,181 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,axg-sound-card.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic AXG sound card
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ items:
|
||||
+ - const: amlogic,axg-sound-card
|
||||
+
|
||||
+ audio-aux-devs:
|
||||
+ $ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
+ description: list of auxiliary devices
|
||||
+
|
||||
+ audio-routing:
|
||||
+ $ref: /schemas/types.yaml#/definitions/non-unique-string-array
|
||||
+ minItems: 2
|
||||
+ description: |-
|
||||
+ A list of the connections between audio components. Each entry is a
|
||||
+ pair of strings, the first being the connection's sink, the second
|
||||
+ being the connection's source.
|
||||
+
|
||||
+ audio-widgets:
|
||||
+ $ref: /schemas/types.yaml#/definitions/non-unique-string-array
|
||||
+ minItems: 2
|
||||
+ description: |-
|
||||
+ A list off component DAPM widget. Each entry is a pair of strings,
|
||||
+ the first being the widget type, the second being the widget name
|
||||
+
|
||||
+ model:
|
||||
+ $ref: /schemas/types.yaml#/definitions/string
|
||||
+ description: User specified audio sound card name
|
||||
+
|
||||
+patternProperties:
|
||||
+ "^dai-link-[0-9]+$":
|
||||
+ type: object
|
||||
+ description: |-
|
||||
+ dai-link child nodes:
|
||||
+ Container for dai-link level properties and the CODEC sub-nodes.
|
||||
+ There should be at least one (and probably more) subnode of this type
|
||||
+
|
||||
+ properties:
|
||||
+ dai-format:
|
||||
+ $ref: /schemas/types.yaml#/definitions/string
|
||||
+ enum: [ i2s, left-j, dsp_a ]
|
||||
+
|
||||
+ dai-tdm-slot-num:
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||
+ description: |
|
||||
+ Number of slots in use. If omitted, slot number is set to
|
||||
+ accommodate the largest mask provided.
|
||||
+ maximum: 32
|
||||
+
|
||||
+ dai-tdm-slot-width:
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||
+ description: Width in bits for each slot
|
||||
+ enum: [ 8, 16, 20, 24, 32 ]
|
||||
+ default: 32
|
||||
+
|
||||
+ mclk-fs:
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||
+ description: |-
|
||||
+ Multiplication factor between the frame rate and master clock
|
||||
+ rate
|
||||
+
|
||||
+ sound-dai:
|
||||
+ $ref: /schemas/types.yaml#/definitions/phandle
|
||||
+ description: phandle of the CPU DAI
|
||||
+
|
||||
+ patternProperties:
|
||||
+ "^dai-tdm-slot-(t|r)x-mask-[0-3]$":
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
+ description: |-
|
||||
+ Transmit and receive cpu slot masks of each TDM lane
|
||||
+ When omitted, mask is assumed to have to no slots. A valid must have
|
||||
+ at one slot, so at least one these mask should be provided with
|
||||
+ an enabled slot.
|
||||
+
|
||||
+ "^codec-[0-9]+$":
|
||||
+ type: object
|
||||
+ description: |-
|
||||
+ Codecs:
|
||||
+ dai-link representing backend links should have at least one subnode.
|
||||
+ One subnode for each codec of the dai-link. dai-link representing
|
||||
+ frontend links have no codec, therefore have no subnodes
|
||||
+
|
||||
+ properties:
|
||||
+ sound-dai:
|
||||
+ $ref: /schemas/types.yaml#/definitions/phandle
|
||||
+ description: phandle of the codec DAI
|
||||
+
|
||||
+ patternProperties:
|
||||
+ "^dai-tdm-slot-(t|r)x-mask$":
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
+ description: Transmit and receive codec slot masks
|
||||
+
|
||||
+ required:
|
||||
+ - sound-dai
|
||||
+
|
||||
+ required:
|
||||
+ - sound-dai
|
||||
+
|
||||
+required:
|
||||
+ - model
|
||||
+ - dai-link-0
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ sound {
|
||||
+ compatible = "amlogic,axg-sound-card";
|
||||
+ model = "AXG-S420";
|
||||
+ audio-aux-devs = <&tdmin_a>, <&tdmout_c>;
|
||||
+ audio-widgets = "Line", "Lineout",
|
||||
+ "Line", "Linein",
|
||||
+ "Speaker", "Speaker1 Left",
|
||||
+ "Speaker", "Speaker1 Right",
|
||||
+ "Speaker", "Speaker2 Left",
|
||||
+ "Speaker", "Speaker2 Right";
|
||||
+ audio-routing = "TDMOUT_C IN 0", "FRDDR_A OUT 2",
|
||||
+ "SPDIFOUT IN 0", "FRDDR_A OUT 3",
|
||||
+ "TDM_C Playback", "TDMOUT_C OUT",
|
||||
+ "TDMIN_A IN 2", "TDM_C Capture",
|
||||
+ "TDMIN_A IN 5", "TDM_C Loopback",
|
||||
+ "TODDR_A IN 0", "TDMIN_A OUT",
|
||||
+ "Lineout", "Lineout AOUTL",
|
||||
+ "Lineout", "Lineout AOUTR",
|
||||
+ "Speaker1 Left", "SPK1 OUT_A",
|
||||
+ "Speaker2 Left", "SPK2 OUT_A",
|
||||
+ "Speaker1 Right", "SPK1 OUT_B",
|
||||
+ "Speaker2 Right", "SPK2 OUT_B",
|
||||
+ "Linein AINL", "Linein",
|
||||
+ "Linein AINR", "Linein";
|
||||
+
|
||||
+ dai-link-0 {
|
||||
+ sound-dai = <&frddr_a>;
|
||||
+ };
|
||||
+
|
||||
+ dai-link-1 {
|
||||
+ sound-dai = <&toddr_a>;
|
||||
+ };
|
||||
+
|
||||
+ dai-link-2 {
|
||||
+ sound-dai = <&tdmif_c>;
|
||||
+ dai-format = "i2s";
|
||||
+ dai-tdm-slot-tx-mask-2 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
+ dai-tdm-slot-rx-mask-1 = <1 1>;
|
||||
+ mclk-fs = <256>;
|
||||
+
|
||||
+ codec-0 {
|
||||
+ sound-dai = <&lineout>;
|
||||
+ };
|
||||
+
|
||||
+ codec-1 {
|
||||
+ sound-dai = <&speaker_amp1>;
|
||||
+ };
|
||||
+
|
||||
+ codec-2 {
|
||||
+ sound-dai = <&speaker_amp2>;
|
||||
+ };
|
||||
+
|
||||
+ codec-3 {
|
||||
+ sound-dai = <&linein>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ dai-link@3 {
|
||||
+ sound-dai = <&spdifout>;
|
||||
+
|
||||
+ codec {
|
||||
+ sound-dai = <&spdif_dit>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,76 +0,0 @@
|
||||
From 76ea370311ff1be466a9a1d2f530d30cfe65fcac Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:34:29 +0900
|
||||
Subject: [PATCH 044/187] FROMGIT: ASoC: soc-dai: add snd_soc_dai_suspend()
|
||||
|
||||
Current ALSA SoC is directly using dai->driver->xxx,
|
||||
thus, it has deep nested bracket, and it makes code unreadable.
|
||||
This patch adds new snd_soc_dai_suspend() and use it.
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/87muh6hn2x.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit e0f2262292d0c8160cfd9a8c40425107fb65ab29
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/sound/soc-dai.h | 1 +
|
||||
sound/soc/soc-core.c | 8 ++++----
|
||||
sound/soc/soc-dai.c | 6 ++++++
|
||||
3 files changed, 11 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
|
||||
index 7cfed3034511..6c5604a7dbc2 100644
|
||||
--- a/include/sound/soc-dai.h
|
||||
+++ b/include/sound/soc-dai.h
|
||||
@@ -162,6 +162,7 @@ int snd_soc_dai_bespoke_trigger(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream, int cmd);
|
||||
snd_pcm_sframes_t snd_soc_dai_delay(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream);
|
||||
+void snd_soc_dai_suspend(struct snd_soc_dai *dai);
|
||||
|
||||
struct snd_soc_dai_ops {
|
||||
/*
|
||||
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
|
||||
index a8d2c4ec0ec9..1060836b63fb 100644
|
||||
--- a/sound/soc/soc-core.c
|
||||
+++ b/sound/soc/soc-core.c
|
||||
@@ -511,8 +511,8 @@ int snd_soc_suspend(struct device *dev)
|
||||
if (rtd->dai_link->ignore_suspend)
|
||||
continue;
|
||||
|
||||
- if (cpu_dai->driver->suspend && !cpu_dai->driver->bus_control)
|
||||
- cpu_dai->driver->suspend(cpu_dai);
|
||||
+ if (!cpu_dai->driver->bus_control)
|
||||
+ snd_soc_dai_suspend(cpu_dai);
|
||||
}
|
||||
|
||||
/* close any waiting streams */
|
||||
@@ -584,8 +584,8 @@ int snd_soc_suspend(struct device *dev)
|
||||
if (rtd->dai_link->ignore_suspend)
|
||||
continue;
|
||||
|
||||
- if (cpu_dai->driver->suspend && cpu_dai->driver->bus_control)
|
||||
- cpu_dai->driver->suspend(cpu_dai);
|
||||
+ if (cpu_dai->driver->bus_control)
|
||||
+ snd_soc_dai_suspend(cpu_dai);
|
||||
|
||||
/* deactivate pins to sleep state */
|
||||
pinctrl_pm_select_sleep_state(cpu_dai->dev);
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
index 5b5b979cd1f3..3373598e0682 100644
|
||||
--- a/sound/soc/soc-dai.c
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -353,3 +353,9 @@ snd_pcm_sframes_t snd_soc_dai_delay(struct snd_soc_dai *dai,
|
||||
|
||||
return delay;
|
||||
}
|
||||
+
|
||||
+void snd_soc_dai_suspend(struct snd_soc_dai *dai)
|
||||
+{
|
||||
+ if (dai->driver->suspend)
|
||||
+ dai->driver->suspend(dai);
|
||||
+}
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,37 @@
|
||||
From 204e9f3a44134cb8c2d35fe680438217917c0b45 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Mon, 13 Jan 2020 13:50:44 +0100
|
||||
Subject: [PATCH 044/146] FROMLIST: ASoC: meson: g12a: add tohdmitx reset
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
sound/soc/meson/g12a-tohdmitx.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/sound/soc/meson/g12a-tohdmitx.c b/sound/soc/meson/g12a-tohdmitx.c
|
||||
index f8853f2fba08..9b2b59536ced 100644
|
||||
--- a/sound/soc/meson/g12a-tohdmitx.c
|
||||
+++ b/sound/soc/meson/g12a-tohdmitx.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <sound/pcm_params.h>
|
||||
#include <linux/regmap.h>
|
||||
+#include <linux/reset.h>
|
||||
#include <sound/soc.h>
|
||||
#include <sound/soc-dai.h>
|
||||
|
||||
@@ -245,6 +246,11 @@ static int g12a_tohdmitx_probe(struct platform_device *pdev)
|
||||
struct device *dev = &pdev->dev;
|
||||
void __iomem *regs;
|
||||
struct regmap *map;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = device_reset(dev);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
regs = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(regs))
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,76 +0,0 @@
|
||||
From 0561a8c27e395a24a69eee8bbbf55f1d5fee3e8e Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:34:43 +0900
|
||||
Subject: [PATCH 045/187] FROMGIT: ASoC: soc-dai: add snd_soc_dai_resume()
|
||||
|
||||
Current ALSA SoC is directly using dai->driver->xxx,
|
||||
thus, it has deep nested bracket, and it makes code unreadable.
|
||||
This patch adds new snd_soc_dai_resume() and use it.
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/87lfwqhn2j.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit 24b09d051164680f0a1d1910efe21ce36ad5c1ca
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/sound/soc-dai.h | 1 +
|
||||
sound/soc/soc-core.c | 8 ++++----
|
||||
sound/soc/soc-dai.c | 6 ++++++
|
||||
3 files changed, 11 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
|
||||
index 6c5604a7dbc2..ed78e34a814e 100644
|
||||
--- a/include/sound/soc-dai.h
|
||||
+++ b/include/sound/soc-dai.h
|
||||
@@ -163,6 +163,7 @@ int snd_soc_dai_bespoke_trigger(struct snd_soc_dai *dai,
|
||||
snd_pcm_sframes_t snd_soc_dai_delay(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream);
|
||||
void snd_soc_dai_suspend(struct snd_soc_dai *dai);
|
||||
+void snd_soc_dai_resume(struct snd_soc_dai *dai);
|
||||
|
||||
struct snd_soc_dai_ops {
|
||||
/*
|
||||
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
|
||||
index 1060836b63fb..c08d4fff01a6 100644
|
||||
--- a/sound/soc/soc-core.c
|
||||
+++ b/sound/soc/soc-core.c
|
||||
@@ -631,8 +631,8 @@ static void soc_resume_deferred(struct work_struct *work)
|
||||
if (rtd->dai_link->ignore_suspend)
|
||||
continue;
|
||||
|
||||
- if (cpu_dai->driver->resume && cpu_dai->driver->bus_control)
|
||||
- cpu_dai->driver->resume(cpu_dai);
|
||||
+ if (cpu_dai->driver->bus_control)
|
||||
+ snd_soc_dai_resume(cpu_dai);
|
||||
}
|
||||
|
||||
for_each_card_components(card, component) {
|
||||
@@ -678,8 +678,8 @@ static void soc_resume_deferred(struct work_struct *work)
|
||||
if (rtd->dai_link->ignore_suspend)
|
||||
continue;
|
||||
|
||||
- if (cpu_dai->driver->resume && !cpu_dai->driver->bus_control)
|
||||
- cpu_dai->driver->resume(cpu_dai);
|
||||
+ if (!cpu_dai->driver->bus_control)
|
||||
+ snd_soc_dai_resume(cpu_dai);
|
||||
}
|
||||
|
||||
if (card->resume_post)
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
index 3373598e0682..ddb6f217c0ed 100644
|
||||
--- a/sound/soc/soc-dai.c
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -359,3 +359,9 @@ void snd_soc_dai_suspend(struct snd_soc_dai *dai)
|
||||
if (dai->driver->suspend)
|
||||
dai->driver->suspend(dai);
|
||||
}
|
||||
+
|
||||
+void snd_soc_dai_resume(struct snd_soc_dai *dai)
|
||||
+{
|
||||
+ if (dai->driver->resume)
|
||||
+ dai->driver->resume(dai);
|
||||
+}
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,92 @@
|
||||
From dbda919875b73a65217756584bbb6bc0b055b51d Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Brunet <jbrunet@baylibre.com>
|
||||
Date: Tue, 28 Jan 2020 13:37:39 +0100
|
||||
Subject: [PATCH 045/146] FROMLIST: ASoC: meson: add g12a-toacodec dt-binding
|
||||
documentation
|
||||
|
||||
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
|
||||
---
|
||||
.../bindings/sound/amlogic,g12a-toacodec.yaml | 53 +++++++++++++++++++
|
||||
.../dt-bindings/sound/meson-g12a-toacodec.h | 10 ++++
|
||||
2 files changed, 63 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml
|
||||
create mode 100644 include/dt-bindings/sound/meson-g12a-toacodec.h
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml b/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..cbd33ba99e58
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml
|
||||
@@ -0,0 +1,53 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/sound/amlogic,g12a-toacodec.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Amlogic G12a Internal DAC Control Glue
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jerome Brunet <jbrunet@baylibre.com>
|
||||
+
|
||||
+properties:
|
||||
+ $nodename:
|
||||
+ pattern: "^audio-controller@.*"
|
||||
+
|
||||
+ "#sound-dai-cells":
|
||||
+ const: 1
|
||||
+
|
||||
+ compatible:
|
||||
+ oneOf:
|
||||
+ - items:
|
||||
+ - const:
|
||||
+ amlogic,g12a-toacodec
|
||||
+ - items:
|
||||
+ - enum:
|
||||
+ - amlogic,sm1-toacodec
|
||||
+ - const:
|
||||
+ amlogic,g12a-toacodec
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ resets:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+required:
|
||||
+ - "#sound-dai-cells"
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - resets
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h>
|
||||
+
|
||||
+ toacodec: audio-controller@740 {
|
||||
+ compatible = "amlogic,g12a-toacodec";
|
||||
+ reg = <0x0 0x740 0x0 0x4>;
|
||||
+ #sound-dai-cells = <1>;
|
||||
+ resets = <&clkc_audio AUD_RESET_TOACODEC>;
|
||||
+ };
|
||||
+
|
||||
+
|
||||
diff --git a/include/dt-bindings/sound/meson-g12a-toacodec.h b/include/dt-bindings/sound/meson-g12a-toacodec.h
|
||||
new file mode 100644
|
||||
index 000000000000..69d7a75592a2
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/sound/meson-g12a-toacodec.h
|
||||
@@ -0,0 +1,10 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 */
|
||||
+#ifndef __DT_MESON_G12A_TOACODEC_H
|
||||
+#define __DT_MESON_G12A_TOACODEC_H
|
||||
+
|
||||
+#define TOACODEC_IN_A 0
|
||||
+#define TOACODEC_IN_B 1
|
||||
+#define TOACODEC_IN_C 2
|
||||
+#define TOACODEC_OUT 3
|
||||
+
|
||||
+#endif /* __DT_MESON_G12A_TOACODEC_H */
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,81 +0,0 @@
|
||||
From e71d0a2a808e1c2f86d1a977091b526c2e3e534d Mon Sep 17 00:00:00 2001
|
||||
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Date: Mon, 22 Jul 2019 10:34:56 +0900
|
||||
Subject: [PATCH 046/187] FROMGIT: ASoC: soc-dai: add snd_soc_dai_probe()
|
||||
|
||||
Current ALSA SoC is directly using dai->driver->xxx,
|
||||
thus, it has deep nested bracket, and it makes code unreadable.
|
||||
This patch adds new snd_soc_dai_probe() and use it.
|
||||
|
||||
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
Link: https://lore.kernel.org/r/87k1cahn26.wl-kuninori.morimoto.gx@renesas.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
(cherry picked from commit cfd9b5fbfe1e8763018aea2600aa0d6ff015ebfc
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.4)
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
include/sound/soc-dai.h | 1 +
|
||||
sound/soc/soc-core.c | 15 +++++++--------
|
||||
sound/soc/soc-dai.c | 7 +++++++
|
||||
3 files changed, 15 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
|
||||
index ed78e34a814e..da8d8b889089 100644
|
||||
--- a/include/sound/soc-dai.h
|
||||
+++ b/include/sound/soc-dai.h
|
||||
@@ -164,6 +164,7 @@ snd_pcm_sframes_t snd_soc_dai_delay(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream);
|
||||
void snd_soc_dai_suspend(struct snd_soc_dai *dai);
|
||||
void snd_soc_dai_resume(struct snd_soc_dai *dai);
|
||||
+int snd_soc_dai_probe(struct snd_soc_dai *dai);
|
||||
|
||||
struct snd_soc_dai_ops {
|
||||
/*
|
||||
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
|
||||
index c08d4fff01a6..d78f132174b1 100644
|
||||
--- a/sound/soc/soc-core.c
|
||||
+++ b/sound/soc/soc-core.c
|
||||
@@ -1434,18 +1434,17 @@ static int soc_probe_link_components(struct snd_soc_card *card,
|
||||
|
||||
static int soc_probe_dai(struct snd_soc_dai *dai, int order)
|
||||
{
|
||||
+ int ret;
|
||||
+
|
||||
if (dai->probed ||
|
||||
dai->driver->probe_order != order)
|
||||
return 0;
|
||||
|
||||
- if (dai->driver->probe) {
|
||||
- int ret = dai->driver->probe(dai);
|
||||
-
|
||||
- if (ret < 0) {
|
||||
- dev_err(dai->dev, "ASoC: failed to probe DAI %s: %d\n",
|
||||
- dai->name, ret);
|
||||
- return ret;
|
||||
- }
|
||||
+ ret = snd_soc_dai_probe(dai);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(dai->dev, "ASoC: failed to probe DAI %s: %d\n",
|
||||
+ dai->name, ret);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
dai->probed = 1;
|
||||
diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
|
||||
index ddb6f217c0ed..55c1fac99613 100644
|
||||
--- a/sound/soc/soc-dai.c
|
||||
+++ b/sound/soc/soc-dai.c
|
||||
@@ -365,3 +365,10 @@ void snd_soc_dai_resume(struct snd_soc_dai *dai)
|
||||
if (dai->driver->resume)
|
||||
dai->driver->resume(dai);
|
||||
}
|
||||
+
|
||||
+int snd_soc_dai_probe(struct snd_soc_dai *dai)
|
||||
+{
|
||||
+ if (dai->driver->probe)
|
||||
+ return dai->driver->probe(dai);
|
||||
+ return 0;
|
||||
+}
|
||||
--
|
||||
2.17.1
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user