mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
drm/msm/hdmi: use new helper for ACR tables
Use new drm_hdmi_acr_get_n_cts() helper instead of hand-coding the tables. Instead of storing the rate 'index', store the audio sample rate in hdmi->audio.rate, removing the need for even more defines. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com> Patchwork: https://patchwork.freedesktop.org/patch/647507/ Link: https://lore.kernel.org/r/20250408-drm-hdmi-acr-v2-3-dee7298ab1af@oss.qualcomm.com
This commit is contained in:
parent
1735917ac4
commit
88321e3529
|
|
@ -4,6 +4,7 @@
|
|||
* Author: Rob Clark <robdclark@gmail.com>
|
||||
*/
|
||||
|
||||
#include <drm/display/drm_hdmi_helper.h>
|
||||
#include <drm/display/drm_hdmi_state_helper.h>
|
||||
|
||||
#include <linux/hdmi.h>
|
||||
|
|
@ -12,71 +13,9 @@
|
|||
|
||||
#include "hdmi.h"
|
||||
|
||||
/* Supported HDMI Audio sample rates */
|
||||
#define MSM_HDMI_SAMPLE_RATE_32KHZ 0
|
||||
#define MSM_HDMI_SAMPLE_RATE_44_1KHZ 1
|
||||
#define MSM_HDMI_SAMPLE_RATE_48KHZ 2
|
||||
#define MSM_HDMI_SAMPLE_RATE_88_2KHZ 3
|
||||
#define MSM_HDMI_SAMPLE_RATE_96KHZ 4
|
||||
#define MSM_HDMI_SAMPLE_RATE_176_4KHZ 5
|
||||
#define MSM_HDMI_SAMPLE_RATE_192KHZ 6
|
||||
#define MSM_HDMI_SAMPLE_RATE_MAX 7
|
||||
|
||||
|
||||
struct hdmi_msm_audio_acr {
|
||||
uint32_t n; /* N parameter for clock regeneration */
|
||||
uint32_t cts; /* CTS parameter for clock regeneration */
|
||||
};
|
||||
|
||||
struct hdmi_msm_audio_arcs {
|
||||
unsigned long int pixclock;
|
||||
struct hdmi_msm_audio_acr lut[MSM_HDMI_SAMPLE_RATE_MAX];
|
||||
};
|
||||
|
||||
#define HDMI_MSM_AUDIO_ARCS(pclk, ...) { (1000 * (pclk)), __VA_ARGS__ }
|
||||
|
||||
/* Audio constants lookup table for hdmi_msm_audio_acr_setup */
|
||||
/* Valid Pixel-Clock rates: 25.2MHz, 27MHz, 27.03MHz, 74.25MHz, 148.5MHz */
|
||||
static const struct hdmi_msm_audio_arcs acr_lut[] = {
|
||||
/* 25.200MHz */
|
||||
HDMI_MSM_AUDIO_ARCS(25200, {
|
||||
{4096, 25200}, {6272, 28000}, {6144, 25200}, {12544, 28000},
|
||||
{12288, 25200}, {25088, 28000}, {24576, 25200} }),
|
||||
/* 27.000MHz */
|
||||
HDMI_MSM_AUDIO_ARCS(27000, {
|
||||
{4096, 27000}, {6272, 30000}, {6144, 27000}, {12544, 30000},
|
||||
{12288, 27000}, {25088, 30000}, {24576, 27000} }),
|
||||
/* 27.027MHz */
|
||||
HDMI_MSM_AUDIO_ARCS(27030, {
|
||||
{4096, 27027}, {6272, 30030}, {6144, 27027}, {12544, 30030},
|
||||
{12288, 27027}, {25088, 30030}, {24576, 27027} }),
|
||||
/* 74.250MHz */
|
||||
HDMI_MSM_AUDIO_ARCS(74250, {
|
||||
{4096, 74250}, {6272, 82500}, {6144, 74250}, {12544, 82500},
|
||||
{12288, 74250}, {25088, 82500}, {24576, 74250} }),
|
||||
/* 148.500MHz */
|
||||
HDMI_MSM_AUDIO_ARCS(148500, {
|
||||
{4096, 148500}, {6272, 165000}, {6144, 148500}, {12544, 165000},
|
||||
{12288, 148500}, {25088, 165000}, {24576, 148500} }),
|
||||
};
|
||||
|
||||
static const struct hdmi_msm_audio_arcs *get_arcs(unsigned long int pixclock)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(acr_lut); i++) {
|
||||
const struct hdmi_msm_audio_arcs *arcs = &acr_lut[i];
|
||||
if (arcs->pixclock == pixclock)
|
||||
return arcs;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int msm_hdmi_audio_update(struct hdmi *hdmi)
|
||||
{
|
||||
struct hdmi_audio *audio = &hdmi->audio;
|
||||
const struct hdmi_msm_audio_arcs *arcs = NULL;
|
||||
bool enabled = audio->enabled;
|
||||
uint32_t acr_pkt_ctrl, vbi_pkt_ctrl, aud_pkt_ctrl;
|
||||
uint32_t audio_config;
|
||||
|
|
@ -94,15 +33,6 @@ int msm_hdmi_audio_update(struct hdmi *hdmi)
|
|||
enabled = false;
|
||||
}
|
||||
|
||||
if (enabled) {
|
||||
arcs = get_arcs(hdmi->pixclock);
|
||||
if (!arcs) {
|
||||
DBG("disabling audio: unsupported pixclock: %lu",
|
||||
hdmi->pixclock);
|
||||
enabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Read first before writing */
|
||||
acr_pkt_ctrl = hdmi_read(hdmi, REG_HDMI_ACR_PKT_CTRL);
|
||||
vbi_pkt_ctrl = hdmi_read(hdmi, REG_HDMI_VBI_PKT_CTRL);
|
||||
|
|
@ -116,15 +46,12 @@ int msm_hdmi_audio_update(struct hdmi *hdmi)
|
|||
uint32_t n, cts, multiplier;
|
||||
enum hdmi_acr_cts select;
|
||||
|
||||
n = arcs->lut[audio->rate].n;
|
||||
cts = arcs->lut[audio->rate].cts;
|
||||
drm_hdmi_acr_get_n_cts(hdmi->pixclock, audio->rate, &n, &cts);
|
||||
|
||||
if ((MSM_HDMI_SAMPLE_RATE_192KHZ == audio->rate) ||
|
||||
(MSM_HDMI_SAMPLE_RATE_176_4KHZ == audio->rate)) {
|
||||
if (audio->rate == 192000 || audio->rate == 176400) {
|
||||
multiplier = 4;
|
||||
n >>= 2; /* divide N by 4 and use multiplier */
|
||||
} else if ((MSM_HDMI_SAMPLE_RATE_96KHZ == audio->rate) ||
|
||||
(MSM_HDMI_SAMPLE_RATE_88_2KHZ == audio->rate)) {
|
||||
} else if (audio->rate == 96000 || audio->rate == 88200) {
|
||||
multiplier = 2;
|
||||
n >>= 1; /* divide N by 2 and use multiplier */
|
||||
} else {
|
||||
|
|
@ -137,13 +64,11 @@ int msm_hdmi_audio_update(struct hdmi *hdmi)
|
|||
acr_pkt_ctrl |= HDMI_ACR_PKT_CTRL_AUDIO_PRIORITY;
|
||||
acr_pkt_ctrl |= HDMI_ACR_PKT_CTRL_N_MULTIPLIER(multiplier);
|
||||
|
||||
if ((MSM_HDMI_SAMPLE_RATE_48KHZ == audio->rate) ||
|
||||
(MSM_HDMI_SAMPLE_RATE_96KHZ == audio->rate) ||
|
||||
(MSM_HDMI_SAMPLE_RATE_192KHZ == audio->rate))
|
||||
if (audio->rate == 48000 || audio->rate == 96000 ||
|
||||
audio->rate == 192000)
|
||||
select = ACR_48;
|
||||
else if ((MSM_HDMI_SAMPLE_RATE_44_1KHZ == audio->rate) ||
|
||||
(MSM_HDMI_SAMPLE_RATE_88_2KHZ == audio->rate) ||
|
||||
(MSM_HDMI_SAMPLE_RATE_176_4KHZ == audio->rate))
|
||||
else if (audio->rate == 44100 || audio->rate == 88200 ||
|
||||
audio->rate == 176400)
|
||||
select = ACR_44;
|
||||
else /* default to 32k */
|
||||
select = ACR_32;
|
||||
|
|
@ -204,7 +129,6 @@ int msm_hdmi_bridge_audio_prepare(struct drm_connector *connector,
|
|||
{
|
||||
struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge);
|
||||
struct hdmi *hdmi = hdmi_bridge->hdmi;
|
||||
unsigned int rate;
|
||||
int ret;
|
||||
|
||||
drm_dbg_driver(bridge->dev, "%u Hz, %d bit, %d channels\n",
|
||||
|
|
@ -214,25 +138,12 @@ int msm_hdmi_bridge_audio_prepare(struct drm_connector *connector,
|
|||
|
||||
switch (params->sample_rate) {
|
||||
case 32000:
|
||||
rate = MSM_HDMI_SAMPLE_RATE_32KHZ;
|
||||
break;
|
||||
case 44100:
|
||||
rate = MSM_HDMI_SAMPLE_RATE_44_1KHZ;
|
||||
break;
|
||||
case 48000:
|
||||
rate = MSM_HDMI_SAMPLE_RATE_48KHZ;
|
||||
break;
|
||||
case 88200:
|
||||
rate = MSM_HDMI_SAMPLE_RATE_88_2KHZ;
|
||||
break;
|
||||
case 96000:
|
||||
rate = MSM_HDMI_SAMPLE_RATE_96KHZ;
|
||||
break;
|
||||
case 176400:
|
||||
rate = MSM_HDMI_SAMPLE_RATE_176_4KHZ;
|
||||
break;
|
||||
case 192000:
|
||||
rate = MSM_HDMI_SAMPLE_RATE_192KHZ;
|
||||
break;
|
||||
default:
|
||||
drm_err(bridge->dev, "rate[%d] not supported!\n",
|
||||
|
|
@ -245,7 +156,7 @@ int msm_hdmi_bridge_audio_prepare(struct drm_connector *connector,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
hdmi->audio.rate = rate;
|
||||
hdmi->audio.rate = params->sample_rate;
|
||||
hdmi->audio.channels = params->cea.channels;
|
||||
hdmi->audio.enabled = true;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user