O mistério dos 0 Hz: a correção que devolveu a voz aos chips Rockchip no kernel 7.0

O mistério dos 0 Hz: a correção que devolveu a voz aos chips Rockchip no kernel 7.0

Uma série de trocas de e-mails na LKML (Linux Kernel Mailing List) entre janeiro de 2025 e fevereiro de 2026 detalha a restauração de uma funcionalidade crítica no driver de áudio I2S TDM da Rockchip, utilizado em chips como o RK3308 e em diversas placas de desenvolvimento (como a Radxa Rock Pi S).

O patch, enviado por Detlev Casanova (Collabora), visa corrigir problemas de taxa de amostragem em sistemas de áudio HDMI, mas acabou revelando um bug no caminho de captura de áudio.

O problema: o divisor fixo vs. HDMI

No subsistema de áudio do Linux (ASoC), o mclk (Master Clock) é geralmente calculado multiplicando a taxa de amostragem (ex: 48kHz) por um fator chamado mclk-fs. O padrão para a maioria dos sistemas é 256 (48.000 * 256 = 12,288 MHz).

No entanto, para o áudio via HDMI nos chips Rockchip, esse valor precisa ser 128.

Anteriormente, o kernel havia removido a função de retorno (callback) set_sysclk, acreditando que ela era redundante. Sem ela, o driver forçava o uso do padrão 256, o que quebrava a saída de áudio para dispositivos HDMI que esperavam um relógio diferente.

A solução e a regressão (O “plot twist”)

Detlev Casanova reintroduziu o set_sysclk para permitir que o driver da máquina (como uma placa-mãe ou sistema embarcado) informasse ao driver do chip a frequência correta baseada no Device Tree.

No entanto, em 10 de fevereiro de 2026, Luca Ceresoli (autor de melhorias anteriores no mesmo driver) reportou uma regressão crítica: a captura de áudio (gravação) no RK3308 parou de funcionar, retornando o erro -22 (Invalid Argument).

O diagnóstico de Luca

O problema ocorreu porque, enquanto o áudio HDMI (Playback) agora recebia a frequência correta, o caminho de Captura não estava chamando o set_sysclk. O resultado era que o driver tentava configurar o relógio para 0 Hz, causando a falha do sistema.

a2lFhLjW de tela de 2026 02 18 15 02 02
O mistério dos 0 Hz: a correção que devolveu a voz aos chips Rockchip no kernel 7.0 2

Curiosidades e bastidores da discussão

A discussão destaca a importância da colaboração e do teste em hardware real:

  • Esquecimento de CC: Luca Ceresoli gentilmente “puxou a orelha” de Detlev por não tê-lo incluído na cópia (Cc) do patch original, já que Luca era o autor da mudança que o patch de Detlev estava alterando. Isso teria evitado que o erro chegasse à árvore principal.
  • A ajuda do Robô: O “Kernel Test Robot” já havia alertado sobre problemas de compilação em versões anteriores do patch devido a dependências de ACPI, mostrando que a automação é vital para manter o kernel estável.
  • Correção “On-the-fly”: Mark Brown, o mantenedor de som do kernel, já estava preparado para reverter o patch (desfazer a mudança) para não prejudicar os usuários do RK3308. No entanto, Detlev enviou rapidamente uma correção adicional para usar um valor padrão (fallback) caso a frequência não seja definida via set_sysclk.

Status atual

Após a validação de Luca Ceresoli em 18 de fevereiro de 2026, confirmando que a nova lógica de fallback funciona, o patch definitivo foi aprovado por Mark Brown.

A mudança garante que:

  1. O áudio HDMI funcione com o multiplicador 128.
  2. A captura de áudio continue funcionando com o multiplicador padrão 256 caso nenhuma configuração especial seja fornecida.