ALSA: hda - implement link_power ops for i915 display power control

This patch implements the bus link_power ops to request/release i915 display
power well. It can be used by the display codec which shares this power well
with GPU on Intel platforms.

Signed-off-by: Mengdong Lin <mengdong.lin@intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Mengdong Lin 2015-04-29 17:43:29 +08:00 committed by Takashi Iwai
parent a5e7e07c26
commit 17eccb27fc
3 changed files with 22 additions and 0 deletions

View File

@ -775,9 +775,20 @@ static int azx_get_response(struct hdac_bus *bus, unsigned int addr,
return azx_rirb_get_response(bus, addr, res); return azx_rirb_get_response(bus, addr, res);
} }
static int azx_link_power(struct hdac_bus *bus, bool enable)
{
struct azx *chip = bus_to_azx(bus);
if (chip->ops->link_power)
return chip->ops->link_power(chip, enable);
else
return -EINVAL;
}
static const struct hdac_bus_ops bus_core_ops = { static const struct hdac_bus_ops bus_core_ops = {
.command = azx_send_cmd, .command = azx_send_cmd,
.get_response = azx_get_response, .get_response = azx_get_response,
.link_power = azx_link_power,
}; };
#ifdef CONFIG_SND_HDA_DSP_LOADER #ifdef CONFIG_SND_HDA_DSP_LOADER

View File

@ -89,6 +89,8 @@ struct hda_controller_ops {
struct vm_area_struct *area); struct vm_area_struct *area);
/* Check if current position is acceptable */ /* Check if current position is acceptable */
int (*position_check)(struct azx *chip, struct azx_dev *azx_dev); int (*position_check)(struct azx *chip, struct azx_dev *azx_dev);
/* enable/disable the link power */
int (*link_power)(struct azx *chip, bool enable);
}; };
struct azx_pcm { struct azx_pcm {

View File

@ -540,6 +540,14 @@ static int azx_position_check(struct azx *chip, struct azx_dev *azx_dev)
return 0; return 0;
} }
/* Enable/disable i915 display power for the link */
static int azx_intel_link_power(struct azx *chip, bool enable)
{
struct hda_intel *hda = container_of(chip, struct hda_intel, chip);
return hda_display_power(hda, enable);
}
/* /*
* Check whether the current DMA position is acceptable for updating * Check whether the current DMA position is acceptable for updating
* periods. Returns non-zero if it's OK. * periods. Returns non-zero if it's OK.
@ -1786,6 +1794,7 @@ static const struct hda_controller_ops pci_hda_ops = {
.substream_free_pages = substream_free_pages, .substream_free_pages = substream_free_pages,
.pcm_mmap_prepare = pcm_mmap_prepare, .pcm_mmap_prepare = pcm_mmap_prepare,
.position_check = azx_position_check, .position_check = azx_position_check,
.link_power = azx_intel_link_power,
}; };
static int azx_probe(struct pci_dev *pci, static int azx_probe(struct pci_dev *pci,