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: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170427160231.13337-9-ville.syrjala@linux.intel.com Reviewed-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
20be551e6d
commit
a8562e4dec
@ -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,
|
|||||||
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;
|
|||||||
|
|
||||||
#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)
|
|||||||
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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user