Commit a8562e4d authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915: Clean up the LPE audio platform data

Split the LPE audio platform data into a port specific
chunk and device specific chunk. Eventually we'll have
a port specific chunk for each port, but for now we'll
stick to just one.

We'll also get rid of the intel_hdmi_lpe_audio_eld structure
which doesn't seem to have any real reason to exist.

v2: Organize per port instead of per pipe

Cc: Takashi Iwai <tiwai@suse.de>
Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170427160231.13337-9-ville.syrjala@linux.intel.comReviewed-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 20be551e
...@@ -111,7 +111,7 @@ lpe_audio_platdev_create(struct drm_i915_private *dev_priv) ...@@ -111,7 +111,7 @@ lpe_audio_platdev_create(struct drm_i915_private *dev_priv)
pinfo.size_data = sizeof(*pdata); pinfo.size_data = sizeof(*pdata);
pinfo.dma_mask = DMA_BIT_MASK(32); pinfo.dma_mask = DMA_BIT_MASK(32);
pdata->pipe = -1; pdata->port.pipe = -1;
spin_lock_init(&pdata->lpe_audio_slock); spin_lock_init(&pdata->lpe_audio_slock);
platdev = platform_device_register_full(&pinfo); platdev = platform_device_register_full(&pinfo);
...@@ -320,38 +320,36 @@ void intel_lpe_audio_notify(struct drm_i915_private *dev_priv, ...@@ -320,38 +320,36 @@ void intel_lpe_audio_notify(struct drm_i915_private *dev_priv,
const void *eld, int ls_clock, bool dp_output) const void *eld, int ls_clock, bool dp_output)
{ {
unsigned long irq_flags; unsigned long irq_flags;
struct intel_hdmi_lpe_audio_pdata *pdata = NULL; struct intel_hdmi_lpe_audio_pdata *pdata;
struct intel_hdmi_lpe_audio_port_pdata *ppdata;
u32 audio_enable; u32 audio_enable;
if (!HAS_LPE_AUDIO(dev_priv)) if (!HAS_LPE_AUDIO(dev_priv))
return; return;
pdata = dev_get_platdata( pdata = dev_get_platdata(&dev_priv->lpe_audio.platdev->dev);
&(dev_priv->lpe_audio.platdev->dev)); ppdata = &pdata->port;
spin_lock_irqsave(&pdata->lpe_audio_slock, irq_flags); spin_lock_irqsave(&pdata->lpe_audio_slock, irq_flags);
audio_enable = I915_READ(VLV_AUD_PORT_EN_DBG(port)); audio_enable = I915_READ(VLV_AUD_PORT_EN_DBG(port));
pdata->eld.port_id = port; ppdata->port = port;
if (eld != NULL) { if (eld != NULL) {
memcpy(pdata->eld.eld_data, eld, memcpy(ppdata->eld, eld, HDMI_MAX_ELD_BYTES);
HDMI_MAX_ELD_BYTES); ppdata->pipe = pipe;
pdata->pipe = pipe; ppdata->ls_clock = ls_clock;
pdata->ls_clock = ls_clock; ppdata->dp_output = dp_output;
pdata->dp_output = dp_output;
/* Unmute the amp for both DP and HDMI */ /* Unmute the amp for both DP and HDMI */
I915_WRITE(VLV_AUD_PORT_EN_DBG(port), I915_WRITE(VLV_AUD_PORT_EN_DBG(port),
audio_enable & ~VLV_AMP_MUTE); audio_enable & ~VLV_AMP_MUTE);
} else { } else {
memset(pdata->eld.eld_data, 0, memset(ppdata->eld, 0, HDMI_MAX_ELD_BYTES);
HDMI_MAX_ELD_BYTES); ppdata->pipe = -1;
pdata->pipe = -1; ppdata->ls_clock = 0;
pdata->ls_clock = 0; ppdata->dp_output = false;
pdata->dp_output = false;
/* Mute the amp for both DP and HDMI */ /* Mute the amp for both DP and HDMI */
I915_WRITE(VLV_AUD_PORT_EN_DBG(port), I915_WRITE(VLV_AUD_PORT_EN_DBG(port),
......
...@@ -31,16 +31,17 @@ struct platform_device; ...@@ -31,16 +31,17 @@ struct platform_device;
#define HDMI_MAX_ELD_BYTES 128 #define HDMI_MAX_ELD_BYTES 128
struct intel_hdmi_lpe_audio_eld { struct intel_hdmi_lpe_audio_port_pdata {
int port_id; u8 eld[HDMI_MAX_ELD_BYTES];
unsigned char eld_data[HDMI_MAX_ELD_BYTES]; int port;
};
struct intel_hdmi_lpe_audio_pdata {
int pipe; int pipe;
int ls_clock; int ls_clock;
bool dp_output; bool dp_output;
struct intel_hdmi_lpe_audio_eld eld; };
struct intel_hdmi_lpe_audio_pdata {
struct intel_hdmi_lpe_audio_port_pdata port;
void (*notify_audio_lpe)(struct platform_device *pdev); void (*notify_audio_lpe)(struct platform_device *pdev);
spinlock_t lpe_audio_slock; spinlock_t lpe_audio_slock;
}; };
......
...@@ -1556,21 +1556,20 @@ static void had_audio_wq(struct work_struct *work) ...@@ -1556,21 +1556,20 @@ static void had_audio_wq(struct work_struct *work)
struct snd_intelhad *ctx = struct snd_intelhad *ctx =
container_of(work, struct snd_intelhad, hdmi_audio_wq); container_of(work, struct snd_intelhad, hdmi_audio_wq);
struct intel_hdmi_lpe_audio_pdata *pdata = ctx->dev->platform_data; struct intel_hdmi_lpe_audio_pdata *pdata = ctx->dev->platform_data;
struct intel_hdmi_lpe_audio_port_pdata *ppdata = &pdata->port;
pm_runtime_get_sync(ctx->dev); pm_runtime_get_sync(ctx->dev);
mutex_lock(&ctx->mutex); mutex_lock(&ctx->mutex);
if (pdata->pipe < 0) { if (ppdata->pipe < 0) {
dev_dbg(ctx->dev, "%s: Event: HAD_NOTIFY_HOT_UNPLUG\n", dev_dbg(ctx->dev, "%s: Event: HAD_NOTIFY_HOT_UNPLUG\n",
__func__); __func__);
memset(ctx->eld, 0, sizeof(ctx->eld)); /* clear the old ELD */ memset(ctx->eld, 0, sizeof(ctx->eld)); /* clear the old ELD */
had_process_hot_unplug(ctx); had_process_hot_unplug(ctx);
} else { } else {
struct intel_hdmi_lpe_audio_eld *eld = &pdata->eld;
dev_dbg(ctx->dev, "%s: HAD_NOTIFY_ELD : port = %d, tmds = %d\n", dev_dbg(ctx->dev, "%s: HAD_NOTIFY_ELD : port = %d, tmds = %d\n",
__func__, eld->port_id, pdata->ls_clock); __func__, ppdata->port, ppdata->ls_clock);
switch (pdata->pipe) { switch (ppdata->pipe) {
case 0: case 0:
ctx->had_config_offset = AUDIO_HDMI_CONFIG_A; ctx->had_config_offset = AUDIO_HDMI_CONFIG_A;
break; break;
...@@ -1582,18 +1581,18 @@ static void had_audio_wq(struct work_struct *work) ...@@ -1582,18 +1581,18 @@ static void had_audio_wq(struct work_struct *work)
break; break;
default: default:
dev_dbg(ctx->dev, "Invalid pipe %d\n", dev_dbg(ctx->dev, "Invalid pipe %d\n",
pdata->pipe); ppdata->pipe);
break; break;
} }
memcpy(ctx->eld, eld->eld_data, sizeof(ctx->eld)); memcpy(ctx->eld, ppdata->eld, sizeof(ctx->eld));
ctx->dp_output = pdata->dp_output; ctx->dp_output = ppdata->dp_output;
if (ctx->dp_output) { if (ctx->dp_output) {
ctx->tmds_clock_speed = 0; ctx->tmds_clock_speed = 0;
ctx->link_rate = pdata->ls_clock; ctx->link_rate = ppdata->ls_clock;
} else { } else {
ctx->tmds_clock_speed = pdata->ls_clock; ctx->tmds_clock_speed = ppdata->ls_clock;
ctx->link_rate = 0; ctx->link_rate = 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment