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

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.com


Reviewed-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 20be551e
Loading
Loading
Loading
Loading
+14 −16
Original line number Diff line number Diff line
@@ -111,7 +111,7 @@ lpe_audio_platdev_create(struct drm_i915_private *dev_priv)
	pinfo.size_data = sizeof(*pdata);
	pinfo.dma_mask = DMA_BIT_MASK(32);

	pdata->pipe = -1;
	pdata->port.pipe = -1;
	spin_lock_init(&pdata->lpe_audio_slock);

	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)
{
	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;

	if (!HAS_LPE_AUDIO(dev_priv))
		return;

	pdata = dev_get_platdata(
		&(dev_priv->lpe_audio.platdev->dev));
	pdata = dev_get_platdata(&dev_priv->lpe_audio.platdev->dev);
	ppdata = &pdata->port;

	spin_lock_irqsave(&pdata->lpe_audio_slock, irq_flags);

	audio_enable = I915_READ(VLV_AUD_PORT_EN_DBG(port));

	pdata->eld.port_id = port;
	ppdata->port = port;

	if (eld != NULL) {
		memcpy(pdata->eld.eld_data, eld,
			HDMI_MAX_ELD_BYTES);
		pdata->pipe = pipe;
		pdata->ls_clock = ls_clock;
		pdata->dp_output = dp_output;
		memcpy(ppdata->eld, eld, HDMI_MAX_ELD_BYTES);
		ppdata->pipe = pipe;
		ppdata->ls_clock = ls_clock;
		ppdata->dp_output = dp_output;

		/* Unmute the amp for both DP and HDMI */
		I915_WRITE(VLV_AUD_PORT_EN_DBG(port),
			   audio_enable & ~VLV_AMP_MUTE);

	} else {
		memset(pdata->eld.eld_data, 0,
			HDMI_MAX_ELD_BYTES);
		pdata->pipe = -1;
		pdata->ls_clock = 0;
		pdata->dp_output = false;
		memset(ppdata->eld, 0, HDMI_MAX_ELD_BYTES);
		ppdata->pipe = -1;
		ppdata->ls_clock = 0;
		ppdata->dp_output = false;

		/* Mute the amp for both DP and HDMI */
		I915_WRITE(VLV_AUD_PORT_EN_DBG(port),
+8 −7
Original line number Diff line number Diff line
@@ -31,16 +31,17 @@ struct platform_device;

#define HDMI_MAX_ELD_BYTES	128

struct intel_hdmi_lpe_audio_eld {
	int port_id;
	unsigned char eld_data[HDMI_MAX_ELD_BYTES];
};

struct intel_hdmi_lpe_audio_pdata {
struct intel_hdmi_lpe_audio_port_pdata {
	u8 eld[HDMI_MAX_ELD_BYTES];
	int port;
	int pipe;
	int ls_clock;
	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);
	spinlock_t lpe_audio_slock;
};
+9 −10
Original line number Diff line number Diff line
@@ -1556,21 +1556,20 @@ static void had_audio_wq(struct work_struct *work)
	struct snd_intelhad *ctx =
		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_port_pdata *ppdata = &pdata->port;

	pm_runtime_get_sync(ctx->dev);
	mutex_lock(&ctx->mutex);
	if (pdata->pipe < 0) {
	if (ppdata->pipe < 0) {
		dev_dbg(ctx->dev, "%s: Event: HAD_NOTIFY_HOT_UNPLUG\n",
			__func__);
		memset(ctx->eld, 0, sizeof(ctx->eld)); /* clear the old ELD */
		had_process_hot_unplug(ctx);
	} else {
		struct intel_hdmi_lpe_audio_eld *eld = &pdata->eld;

		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:
			ctx->had_config_offset = AUDIO_HDMI_CONFIG_A;
			break;
@@ -1582,18 +1581,18 @@ static void had_audio_wq(struct work_struct *work)
			break;
		default:
			dev_dbg(ctx->dev, "Invalid pipe %d\n",
				pdata->pipe);
				ppdata->pipe);
			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) {
			ctx->tmds_clock_speed = 0;
			ctx->link_rate = pdata->ls_clock;
			ctx->link_rate = ppdata->ls_clock;
		} else {
			ctx->tmds_clock_speed = pdata->ls_clock;
			ctx->tmds_clock_speed = ppdata->ls_clock;
			ctx->link_rate = 0;
		}