Skip to content

tlb: phytium: update phytium tlb controller driver support to 6.6.0.4#1775

Open
xiaqian1486 wants to merge 4 commits into
deepin-community:linux-6.6.yfrom
xiaqian1486:tlb-6.6.y
Open

tlb: phytium: update phytium tlb controller driver support to 6.6.0.4#1775
xiaqian1486 wants to merge 4 commits into
deepin-community:linux-6.6.yfrom
xiaqian1486:tlb-6.6.y

Conversation

@xiaqian1486
Copy link
Copy Markdown

@xiaqian1486 xiaqian1486 commented May 28, 2026

This patches updates the support for phytium tbl controller driver.

  1. Rename MAX_TLBI_OPS
  2. Allow range operation for MAX_TLBI_RANGE_PAGES
  3. add __flush_tlb_range_limit_excess()
  4. optimize flush tlb kernel range

Summary by Sourcery

Update Phytium ARM64 platform support with improved TLB range handling, new SoC identification and frequency-scaling drivers, and refinements to audio codec drivers.

New Features:

  • Add unified Phytium DMU devfreq driver to manage DDR memory controller frequency via ACPI on multiple hardware versions.
  • Add unified Phytium NOC devfreq driver to manage interconnect frequency with utilization-based scaling and suspend/resume support.
  • Introduce Phytium SoC identification infrastructure using SMCCC, system registers, and CPU part IDs, exposing a global SoC type for platform code.

Bug Fixes:

  • Correct TLB range flush limits for large mappings and align kernel-range flushing logic with the generic range helper to avoid excessive full TLB invalidations.
  • Fix Phytium codec v2 status handling by using named error codes and clearer messages, and ensure shared command memory is cleared before control operations to avoid stale requests.
  • Improve ES8388 codec probe to handle register write failures and adjust initial control register programming to a safe configuration.

Enhancements:

  • Rename ARM64 TLB operation macro to better reflect DVM usage and reuse a common helper in kernel-range flushing for consistency and maintainability.
  • Track Phytium codec v2 channel count in the driver state and reuse it for DAI configuration instead of repeatedly querying hardware.
  • Update ES8388 codec driver version metadata and refine its default initialization sequence.
  • Rename the Phytium FTC303 CPU part to FTC310 and update associated MIDR-based feature and mitigation tables to match the new identifier.

Build:

  • Wire up the new Phytium DMU and NOC devfreq drivers in Kconfig and the devfreq Makefile so they can be built when enabled.

Chores:

  • Extend ARM64 setup to initialize and export the detected Phytium SoC type for other subsystems.
  • Touch MAINTAINERS, platform defconfig, and codec Kconfig entries to include the new Phytium-related components.

@sourcery-ai
Copy link
Copy Markdown

sourcery-ai Bot commented May 28, 2026

Reviewer's Guide

Updates Phytium ARM64 support by refining TLB flush limits and kernel-range flushing, extending Phytium codec drivers, correcting Phytium CPU model IDs and SoC-type detection, and adding new devfreq drivers for Phytium DMU and NOC with ACPI-based frequency control for v1/v2 hardware variants.

Sequence diagram for Phytium DMU devfreq ACPI-based frequency change

sequenceDiagram
    participant DevfreqCore
    participant PhytiumDMU as phytium_dmufreq
    participant ACPI as ACPI_Firmware
    participant DMUHW as DMU_HW

    DevfreqCore->>PhytiumDMU: phytium_dmu_get_dev_status(stat)
    alt DMU_V1
        PhytiumDMU->>DMUHW: dmu_v1_read32(..., DMU_V1_AXI_MONITOR2_L)
        PhytiumDMU->>DMUHW: dmu_v1_read32(..., DMU_V1_AXI_MONITOR3_L)
    else DMU_V2
        PhytiumDMU->>DMUHW: dmu_v2_read32(..., DMU_V2_EVENT_L_CNT)
        PhytiumDMU->>DMUHW: dmu_v2_read32(..., DMU_V2_EVENT_H_CNT)
    end
    PhytiumDMU-->>DevfreqCore: stat.busy_time, stat.total_time

    DevfreqCore->>PhytiumDMU: phytium_dmu_target(freq, flags)
    PhytiumDMU->>PhytiumDMU: devfreq_recommended_opp()
    PhytiumDMU->>PhytiumDMU: phytium_dmu_set_freq(target_rate)
    PhytiumDMU->>ACPI: acpi_evaluate_integer("PSCF", args)
    ACPI-->>PhytiumDMU: status/ret
    PhytiumDMU-->>DevfreqCore: update priv.rate
Loading

File-Level Changes

Change Details Files
Refine arm64 TLB range flushing limits and optimize kernel range flush implementation
  • Rename MAX_TLBI_OPS to MAX_DVM_OPS to clarify usage for non-range DVM operations
  • Introduce __flush_tlb_range_limit_excess() helper to centralize limit checks for TLB range operations based on system_supports_tlb_range, MAX_DVM_OPS, and MAX_TLBI_RANGE_PAGES
  • Update __flush_tlb_range() to use the new helper and adjust limit semantics from ">=" to ">" for MAX_TLBI_RANGE_PAGES
  • Rework flush_tlb_kernel_range() to align with range-based flushing: normalize start/end to stride, compute pages, reuse __flush_tlb_range_limit_excess(), and replace manual VA-loop __tlbi(vaale1is, ...) with __flush_tlb_range_op()
arch/arm64/include/asm/tlbflush.h
Extend Phytium codec v2 driver to use explicit status enums, clear shared memory command structures, and cache channel count
  • Replace hard-coded status values in phyt_codec_show_status() with enum-based ERR_CODEC_* codes and adjust messages (including distinguishing HW vs SW errors)
  • Define phytcodec_status enum listing possible codec error codes
  • In probe/remove/PM and DAI callbacks, zero the shared command structure (phytcodec_cmd) at priv->sharemem_base before issuing commands to avoid stale data
  • In debug sysfs handler, clear shared memory before issuing register dump command
  • Cache channel count into priv->channels and drive playback/capture channels_max from that cached value instead of re-querying
sound/soc/codecs/phytium-codec-v2.c
sound/soc/codecs/phytium-codec-v2.h
Adjust ES8388 codec initialisation and versioning
  • Bump ES8388_V1_VERSION from 1.0.0 to 1.0.1
  • Make the initial write to ES8388_ADCPOWER checked (propagate error if it fails) and change ES8388_CONTROL1 default from 0x30 to 0x20 before programming DAC/ADC control registers
sound/soc/codecs/es8388.c
Introduce Phytium SoC-type detection infrastructure and export global SoC-type state
  • Add new asm/phytium_cputype.h providing Phytium SoC ID constants, enum phyt_soc_type, a global phyt_soc_type_t, and helpers to detect SoC type via SMCCC, system registers, and MIDR part IDs, plus per-SoC predicate helpers
  • Wire phyt_soc_type_init() into setup_arch() under CONFIG_ARCH_PHYTIUM and export the global phyt_soc_type_t symbol
  • Ensure inclusion of the new header from setup.c when CONFIG_ARCH_PHYTIUM is enabled
arch/arm64/include/asm/phytium_cputype.h
arch/arm64/kernel/setup.c
Rename Phytium CPU part FTC303 to FTC310 and propagate to mitigation tables
  • Change PHYTIUM_CPU_PART_FTC303 macro to PHYTIUM_CPU_PART_FTC310 while keeping the same part value
  • Update MIDR_PHYTIUM_FTC303 macro and all references in Spectre v2/v4 mitigation tables and unmap_kernel_at_el0 capability table to the new MIDR_PHYTIUM_FTC310 name
arch/arm64/include/asm/cputype.h
arch/arm64/kernel/proton-pack.c
arch/arm64/kernel/cpufeature.c
Add devfreq driver for Phytium DMU (DDR memory unit) supporting v1 and v2 hardware via ACPI
  • Implement phytium_dmufreq driver that exposes a devfreq device backed by ACPI PSCF/PGCL/STAT/CHAN/BAND methods, handling both multi-channel v1 and per-instance v2 DMU layouts
  • Provide bandwidth measurement logic: v1 uses per-channel PMU registers with a blocking notifier chain to coordinate with DDR PMU users; v2 uses counter snapshot registers and aggregates two event counters
  • Manage frequency tables via ACPI PGCL, build OPP table dynamically, and integrate with devfreq using either performance governor (v1) or simple_ondemand (v2) with polling-based load measurement
  • Add suspend/resume hooks that suspend devfreq, restart/stop monitoring as appropriate, and retain current rate
  • Expose ACPI match table for PHYT0063 (v1) and PHYT3011 (v2) and register as a platform driver
  • Hook the driver into devfreq via Kconfig and Makefile and enable it in the Deepin arm64 desktop defconfig
drivers/devfreq/phytium_dmu.c
drivers/devfreq/Kconfig
drivers/devfreq/Makefile
arch/arm64/configs/deepin_arm64_desktop_defconfig
MAINTAINERS
Add devfreq driver for Phytium NOC (interconnect) supporting v1/v2 hardware with hysteresis-aware scaling
  • Implement phytium_nocfreq driver that uses ACPI PSCF/PGCL/PGCF to control NOC clock frequency for v1 (multi-counter handshake-based) and v2 (busy-code status register) hardware
  • For v1, sample multiple mini-block counters, compute peak bandwidth, restart counters, and program devfreq simple-ondemand with busy_time proportional to handshake counts
  • For v2, use a 5-bit busy code from status register, clamp to maximum, and implement custom fast-ramp-up and hysteresis logic in target() to select among four operating points (min, mid1, mid2, max) based on busy_code thresholds
  • Handle suspend/resume by stopping/starting counters for v1 and restoring the pre-suspend frequency for both variants
  • Expose ACPI match table for PHYT0047 (v1) and PHYT3010 (v2), register as a platform driver, and hook it into devfreq via Kconfig and Makefile and defconfig
  • Ensure OPP table is built from ACPI PGCL, and devfreq profile is set up with polling-based status collection
drivers/devfreq/phytium_noc.c
drivers/devfreq/Kconfig
drivers/devfreq/Makefile
arch/arm64/configs/deepin_arm64_desktop_defconfig
MAINTAINERS
Update Kconfig and codec infrastructure wiring for new/updated Phytium audio drivers
  • Adjust sound SoC codecs Kconfig to reference updated Phytium codec implementation and ensure new options are selectable where appropriate
  • Update MAINTAINERS to include new Phytium devfreq and codec components for proper ownership and bug routing
sound/soc/codecs/Kconfig
MAINTAINERS

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@deepin-ci-robot
Copy link
Copy Markdown

Hi @xiaqian1486. Thanks for your PR.

I'm waiting for a deepin-community member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should join the org to skip this step.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

@deepin-ci-robot
Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign opsiff for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Copy link
Copy Markdown

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've left some high level feedback:

  • In phytium_dmu.c, the v1 path uses devm_ioremap() and then checks IS_ERR() on the returned pointer, but devm_ioremap() returns NULL on failure rather than an ERR_PTR, so the error handling there will never trigger correctly and should be switched to a NULL check.
  • In phytium_noc.c, phytium_nocfreq_probe() uses devm_ioremap_resource() for the v1 path but checks !priv->reg_noc_v1 instead of IS_ERR(), meaning error returns from devm_ioremap_resource() will be misdetected and PTR_ERR() on a non-ERR pointer is incorrect.
  • The repeated pattern of zeroing struct phytcodec_cmd via memset(priv->sharemem_base, 0, sizeof(struct phytcodec_cmd)); in multiple Phytium codec v2 callbacks could be factored into a small static helper to avoid duplication and keep the command setup logic consistent in one place.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In phytium_dmu.c, the v1 path uses devm_ioremap() and then checks IS_ERR() on the returned pointer, but devm_ioremap() returns NULL on failure rather than an ERR_PTR, so the error handling there will never trigger correctly and should be switched to a NULL check.
- In phytium_noc.c, phytium_nocfreq_probe() uses devm_ioremap_resource() for the v1 path but checks `!priv->reg_noc_v1` instead of IS_ERR(), meaning error returns from devm_ioremap_resource() will be misdetected and PTR_ERR() on a non-ERR pointer is incorrect.
- The repeated pattern of zeroing `struct phytcodec_cmd` via `memset(priv->sharemem_base, 0, sizeof(struct phytcodec_cmd));` in multiple Phytium codec v2 callbacks could be factored into a small static helper to avoid duplication and keep the command setup logic consistent in one place.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

oupton and others added 4 commits May 28, 2026 14:35
Perhaps unsurprisingly, I-cache invalidations suffer from performance
issues similar to TLB invalidations on certain systems. TLB and I-cache
maintenance all result in DVM on the mesh, which is where the real
bottleneck lies.

Rename the heuristic to point the finger at DVM, such that it may be
reused for limiting I-cache invalidations.

Reviewed-by: Gavin Shan <gshan@redhat.com>
Tested-by: Gavin Shan <gshan@redhat.com>
Acked-by: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20230920080133.944717-2-oliver.upton@linux.dev
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
(cherry picked from commit ec1c3b9)
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: Wang Yinfeng <wangyinfeng@phytium.com.cn>
Signed-off-by: Xia Qian <xian1486@phytium.com.cn>
MAX_TLBI_RANGE_PAGES pages is covered by SCALE#3 and NUM#31 and it's
supported now. Allow TLBI RANGE operation when the number of pages is
equal to MAX_TLBI_RANGE_PAGES in __flush_tlb_range_nosync().

Suggested-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Reviewed-by: Ryan Roberts <ryan.roberts@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Shaoqin Huang <shahuang@redhat.com>
Link: https://lore.kernel.org/r/20240405035852.1532010-4-gshan@redhat.com
Signed-off-by: Will Deacon <will@kernel.org>
(cherry picked from commit 73301e4)
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: Wang Yinfeng <wangyinfeng@phytium.com.cn>
Signed-off-by: Xia Qian <xiaqian1486@phytium.com.cn>
The __flush_tlb_range_limit_excess() helper will be used when
flush tlb kernel range soon.

Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Link: https://lore.kernel.org/r/20240923131351.713304-2-wangkefeng.wang@huawei.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
(cherry picked from commit 7ffc13e)
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: Wang Yinfeng <wangyinfeng@phytium.com.cn>
Signed-off-by: Xia Qian <xiaqian1486@phytium.com.cn>
Currently the kernel TLBs is flushed page by page if the target
VA range is less than MAX_DVM_OPS * PAGE_SIZE, otherwise we'll
brutally issue a TLBI ALL.

But we could optimize it when CPU supports TLB range operations,
convert to use __flush_tlb_range_op() like other tlb range flush
to improve performance.

Co-developed-by: Yicong Yang <yangyicong@hisilicon.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Link: https://lore.kernel.org/r/20240923131351.713304-3-wangkefeng.wang@huawei.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
(cherry picked from commit a923705)
[KF: no lpa2 support]
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: Wang Yinfeng <wangyinfeng@phytium.com.cn>
Signed-off-by: Xia Qian <xiaqian1486@phytium.com.cn>
@Avenger-285714
Copy link
Copy Markdown
Member

/LGTM

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates Phytium ARM64 platform support by refining arm64 TLB range flushing behavior, introducing Phytium ACPI-based devfreq drivers (DMU/NOC), adding SoC identification infrastructure, and adjusting a couple of ASoC codec drivers.

Changes:

  • Improve arm64 TLB range flushing limits/behavior and refactor kernel-range flushing to use the range helper.
  • Add unified Phytium NOC/DMU devfreq drivers (ACPI) and wire them into devfreq Kconfig/Makefile and the deepin arm64 defconfig.
  • Add Phytium SoC-type detection plumbing and update Phytium CPU part identifiers; refine Phytium codec-v2 and ES8388 codec handling.

Reviewed changes

Copilot reviewed 16 out of 16 changed files in this pull request and generated 16 comments.

Show a summary per file
File Description
sound/soc/codecs/phytium-codec-v2.h Adds named codec status codes.
sound/soc/codecs/phytium-codec-v2.c Uses named status codes, clears shared command memory before issuing commands, caches channel count.
sound/soc/codecs/Kconfig Restricts Phytium codec v2 to ARCH_PHYTIUM.
sound/soc/codecs/es8388.c Updates version string and adjusts probe init writes with partial error handling.
MAINTAINERS Adds new Phytium arm64 header to maintained paths.
drivers/devfreq/phytium_noc.c New Phytium NOC devfreq driver (ACPI, v1/v2).
drivers/devfreq/phytium_dmu.c New Phytium DMU devfreq driver (ACPI, v1/v2) with PMU notifier integration.
drivers/devfreq/Makefile Builds new Phytium devfreq drivers when enabled.
drivers/devfreq/Kconfig Adds Kconfig entries for the new Phytium devfreq drivers.
arch/arm64/kernel/setup.c Initializes and exports detected Phytium SoC type.
arch/arm64/kernel/proton-pack.c Updates Spectre mitigation MIDR tables for renamed Phytium CPU part.
arch/arm64/kernel/cpufeature.c Updates MIDR table for renamed Phytium CPU part.
arch/arm64/include/asm/tlbflush.h Renames MAX_* macro, adds flush limit helper, refactors kernel-range flush to use range op helper.
arch/arm64/include/asm/phytium_cputype.h New SoC identification header and helpers.
arch/arm64/include/asm/cputype.h Renames Phytium CPU part/MIDR macro FTC303 -> FTC310.
arch/arm64/configs/deepin_arm64_desktop_defconfig Enables new Phytium devfreq drivers as modules.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread drivers/devfreq/phytium_noc.c Outdated
@@ -0,0 +1,635 @@
// SPDX-License-Identifier: GPL-1.0
Comment thread drivers/devfreq/phytium_dmu.c Outdated
@@ -0,0 +1,654 @@
// SPDX-License-Identifier: GPL-1.0
Comment thread drivers/devfreq/phytium_noc.c Outdated
Comment on lines +502 to +507
if (info->type == PHYTIUM_NOC_V1) {
priv->reg_noc_v1 = devm_ioremap_resource(dev, mem);
if (!priv->reg_noc_v1)
return PTR_ERR(priv->reg_noc_v1);
dev->init_name = "nocfreq";
} else {
Comment thread drivers/devfreq/phytium_noc.c Outdated
Comment on lines +508 to +513
acpi_handle handle = ACPI_HANDLE(dev);
unsigned long long uid;

ret = acpi_evaluate_integer(handle, "_UID", NULL, &uid);
priv->uid = uid;
priv->reg_noc_v2 = devm_ioremap_resource(dev, mem);
Comment thread drivers/devfreq/phytium_noc.c Outdated
Comment on lines +440 to +445
ret = devfreq_resume_device(priv->devfreq);
if (ret < 0)
dev_err(dev, "failed to resume the devfreq devices\n");
if (!delayed_work_pending(&priv->devfreq->work) && priv->devfreq->profile->polling_ms)
priv->devfreq->stop_polling = true;

Comment on lines +408 to +423
static inline bool __flush_tlb_range_limit_excess(unsigned long start,
unsigned long end, unsigned long pages, unsigned long stride)
{
/*
* When the system does not support TLB range based flush
* operation, (MAX_DVM_OPS - 1) pages can be handled. But
* with TLB range based operation, MAX_TLBI_RANGE_PAGES
* pages can be handled.
*/
if ((!system_supports_tlb_range() &&
(end - start) >= (MAX_DVM_OPS * stride)) ||
pages > MAX_TLBI_RANGE_PAGES)
return true;

return false;
}
Comment thread sound/soc/codecs/phytium-codec-v2.h Outdated
Comment on lines +98 to +105
enum phytcodec_status {
ERR_CODEC_SUCCESS = 0,
ERR_CODEC_BUS_BUSY,
ERR_CODEC_DEV_BUSY,
ERR_CODEC_RW_ERROR,
ERR_CODEC_NODEV, //HW
ERR_CODEC_NO_INIT, //SW
};
Comment on lines 103 to 106
switch (status) {
case 0:
case ERR_CODEC_SUCCESS:
pr_err("success\n");
break;
Comment on lines 103 to 111
switch (status) {
case 0:
case ERR_CODEC_SUCCESS:
pr_err("success\n");
break;
case 2:
case ERR_CODEC_DEV_BUSY:
pr_err("device busy\n");
break;
case 3:
case ERR_CODEC_RW_ERROR:
pr_err("read/write error\n");
Comment thread sound/soc/codecs/es8388.c Outdated
Comment on lines 725 to 732
ret = snd_soc_component_write(component, ES8388_ADCPOWER, 0xf0);
if (ret)
return ret;

snd_soc_component_write(component, ES8388_CONTROL1, 0x20);
snd_soc_component_write(component, ES8388_DACCONTROL21, 0x80);
snd_soc_component_write(component, ES8388_ADCCONTROL10, 0xda);

@deepin-ci-robot
Copy link
Copy Markdown

New changes are detected. LGTM label has been removed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants