Merge tag 'drm-intel-fixes-2013-08-08' of git://people.freedesktop.org/~danvet/drm-intel into drm-fixes
Daniel writes: A few bugfixes for serious stuff and regressions. Highlight is the reinstated hack to keep the i915 backlight on when running on an optimus machine, this prevents black screens especially with some radeon muxed platforms. And the patch to quiet dmesg on Linus' old mac mini ;-) * tag 'drm-intel-fixes-2013-08-08' of git://people.freedesktop.org/~danvet/drm-intel: drm/i915: do not disable backlight on vgaswitcheroo switch off drm/i915: Don't call encoder's get_config unless encoder is active drm/i915: avoid brightness overflow when doing scale drm/i915: update last_vblank when disabling the power well drm/i915: fix gen4 digital port hotplug definitions
This commit is contained in:
commit
e42f581421
16 changed files with 138 additions and 55 deletions
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 11
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Linux for Workgroups
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -867,6 +867,7 @@ static int pch_dma_probe(struct pci_dev *pdev,
|
|||
|
||||
if (!(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
|
||||
dev_err(&pdev->dev, "Cannot find proper base address\n");
|
||||
err = -ENODEV;
|
||||
goto err_disable_pdev;
|
||||
}
|
||||
|
||||
|
|
|
@ -2505,6 +2505,10 @@ static dma_cookie_t pl330_tx_submit(struct dma_async_tx_descriptor *tx)
|
|||
/* Assign cookies to all nodes */
|
||||
while (!list_empty(&last->node)) {
|
||||
desc = list_entry(last->node.next, struct dma_pl330_desc, node);
|
||||
if (pch->cyclic) {
|
||||
desc->txd.callback = last->txd.callback;
|
||||
desc->txd.callback_param = last->txd.callback_param;
|
||||
}
|
||||
|
||||
dma_cookie_assign(&desc->txd);
|
||||
|
||||
|
@ -2688,45 +2692,82 @@ static struct dma_async_tx_descriptor *pl330_prep_dma_cyclic(
|
|||
size_t period_len, enum dma_transfer_direction direction,
|
||||
unsigned long flags, void *context)
|
||||
{
|
||||
struct dma_pl330_desc *desc;
|
||||
struct dma_pl330_desc *desc = NULL, *first = NULL;
|
||||
struct dma_pl330_chan *pch = to_pchan(chan);
|
||||
struct dma_pl330_dmac *pdmac = pch->dmac;
|
||||
unsigned int i;
|
||||
dma_addr_t dst;
|
||||
dma_addr_t src;
|
||||
|
||||
desc = pl330_get_desc(pch);
|
||||
if (!desc) {
|
||||
dev_err(pch->dmac->pif.dev, "%s:%d Unable to fetch desc\n",
|
||||
__func__, __LINE__);
|
||||
if (len % period_len != 0)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch (direction) {
|
||||
case DMA_MEM_TO_DEV:
|
||||
desc->rqcfg.src_inc = 1;
|
||||
desc->rqcfg.dst_inc = 0;
|
||||
desc->req.rqtype = MEMTODEV;
|
||||
src = dma_addr;
|
||||
dst = pch->fifo_addr;
|
||||
break;
|
||||
case DMA_DEV_TO_MEM:
|
||||
desc->rqcfg.src_inc = 0;
|
||||
desc->rqcfg.dst_inc = 1;
|
||||
desc->req.rqtype = DEVTOMEM;
|
||||
src = pch->fifo_addr;
|
||||
dst = dma_addr;
|
||||
break;
|
||||
default:
|
||||
if (!is_slave_direction(direction)) {
|
||||
dev_err(pch->dmac->pif.dev, "%s:%d Invalid dma direction\n",
|
||||
__func__, __LINE__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
desc->rqcfg.brst_size = pch->burst_sz;
|
||||
desc->rqcfg.brst_len = 1;
|
||||
for (i = 0; i < len / period_len; i++) {
|
||||
desc = pl330_get_desc(pch);
|
||||
if (!desc) {
|
||||
dev_err(pch->dmac->pif.dev, "%s:%d Unable to fetch desc\n",
|
||||
__func__, __LINE__);
|
||||
|
||||
if (!first)
|
||||
return NULL;
|
||||
|
||||
spin_lock_irqsave(&pdmac->pool_lock, flags);
|
||||
|
||||
while (!list_empty(&first->node)) {
|
||||
desc = list_entry(first->node.next,
|
||||
struct dma_pl330_desc, node);
|
||||
list_move_tail(&desc->node, &pdmac->desc_pool);
|
||||
}
|
||||
|
||||
list_move_tail(&first->node, &pdmac->desc_pool);
|
||||
|
||||
spin_unlock_irqrestore(&pdmac->pool_lock, flags);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch (direction) {
|
||||
case DMA_MEM_TO_DEV:
|
||||
desc->rqcfg.src_inc = 1;
|
||||
desc->rqcfg.dst_inc = 0;
|
||||
desc->req.rqtype = MEMTODEV;
|
||||
src = dma_addr;
|
||||
dst = pch->fifo_addr;
|
||||
break;
|
||||
case DMA_DEV_TO_MEM:
|
||||
desc->rqcfg.src_inc = 0;
|
||||
desc->rqcfg.dst_inc = 1;
|
||||
desc->req.rqtype = DEVTOMEM;
|
||||
src = pch->fifo_addr;
|
||||
dst = dma_addr;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
desc->rqcfg.brst_size = pch->burst_sz;
|
||||
desc->rqcfg.brst_len = 1;
|
||||
fill_px(&desc->px, dst, src, period_len);
|
||||
|
||||
if (!first)
|
||||
first = desc;
|
||||
else
|
||||
list_add_tail(&desc->node, &first->node);
|
||||
|
||||
dma_addr += period_len;
|
||||
}
|
||||
|
||||
if (!desc)
|
||||
return NULL;
|
||||
|
||||
pch->cyclic = true;
|
||||
|
||||
fill_px(&desc->px, dst, src, period_len);
|
||||
desc->txd.flags = flags;
|
||||
|
||||
return &desc->txd;
|
||||
}
|
||||
|
|
|
@ -1856,10 +1856,16 @@
|
|||
#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2)
|
||||
|
||||
#define PORT_HOTPLUG_STAT (dev_priv->info->display_mmio_offset + 0x61114)
|
||||
/* HDMI/DP bits are gen4+ */
|
||||
#define PORTB_HOTPLUG_LIVE_STATUS (1 << 29)
|
||||
/*
|
||||
* HDMI/DP bits are gen4+
|
||||
*
|
||||
* WARNING: Bspec for hpd status bits on gen4 seems to be completely confused.
|
||||
* Please check the detailed lore in the commit message for for experimental
|
||||
* evidence.
|
||||
*/
|
||||
#define PORTD_HOTPLUG_LIVE_STATUS (1 << 29)
|
||||
#define PORTC_HOTPLUG_LIVE_STATUS (1 << 28)
|
||||
#define PORTD_HOTPLUG_LIVE_STATUS (1 << 27)
|
||||
#define PORTB_HOTPLUG_LIVE_STATUS (1 << 27)
|
||||
#define PORTD_HOTPLUG_INT_STATUS (3 << 21)
|
||||
#define PORTC_HOTPLUG_INT_STATUS (3 << 19)
|
||||
#define PORTB_HOTPLUG_INT_STATUS (3 << 17)
|
||||
|
|
|
@ -8269,9 +8269,11 @@ check_crtc_state(struct drm_device *dev)
|
|||
|
||||
list_for_each_entry(encoder, &dev->mode_config.encoder_list,
|
||||
base.head) {
|
||||
enum pipe pipe;
|
||||
if (encoder->base.crtc != &crtc->base)
|
||||
continue;
|
||||
if (encoder->get_config)
|
||||
if (encoder->get_config &&
|
||||
encoder->get_hw_state(encoder, &pipe))
|
||||
encoder->get_config(encoder, &pipe_config);
|
||||
}
|
||||
|
||||
|
|
|
@ -497,8 +497,11 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level, u32 max)
|
|||
goto out;
|
||||
}
|
||||
|
||||
/* scale to hardware */
|
||||
level = level * freq / max;
|
||||
/* scale to hardware, but be careful to not overflow */
|
||||
if (freq < max)
|
||||
level = level * freq / max;
|
||||
else
|
||||
level = freq / max * level;
|
||||
|
||||
dev_priv->backlight.level = level;
|
||||
if (dev_priv->backlight.device)
|
||||
|
@ -515,6 +518,17 @@ void intel_panel_disable_backlight(struct drm_device *dev)
|
|||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* Do not disable backlight on the vgaswitcheroo path. When switching
|
||||
* away from i915, the other client may depend on i915 to handle the
|
||||
* backlight. This will leave the backlight on unnecessarily when
|
||||
* another client is not activated.
|
||||
*/
|
||||
if (dev->switch_power_state == DRM_SWITCH_POWER_CHANGING) {
|
||||
DRM_DEBUG_DRIVER("Skipping backlight disable on vga switch\n");
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&dev_priv->backlight.lock, flags);
|
||||
|
||||
dev_priv->backlight.enabled = false;
|
||||
|
|
|
@ -5063,8 +5063,26 @@ static void __intel_set_power_well(struct drm_device *dev, bool enable)
|
|||
}
|
||||
} else {
|
||||
if (enable_requested) {
|
||||
unsigned long irqflags;
|
||||
enum pipe p;
|
||||
|
||||
I915_WRITE(HSW_PWR_WELL_DRIVER, 0);
|
||||
POSTING_READ(HSW_PWR_WELL_DRIVER);
|
||||
DRM_DEBUG_KMS("Requesting to disable the power well\n");
|
||||
|
||||
/*
|
||||
* After this, the registers on the pipes that are part
|
||||
* of the power well will become zero, so we have to
|
||||
* adjust our counters according to that.
|
||||
*
|
||||
* FIXME: Should we do this in general in
|
||||
* drm_vblank_post_modeset?
|
||||
*/
|
||||
spin_lock_irqsave(&dev->vbl_lock, irqflags);
|
||||
for_each_pipe(p)
|
||||
if (p != PIPE_A)
|
||||
dev->last_vblank[p] = 0;
|
||||
spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1798,7 +1798,8 @@ static loff_t shmem_file_llseek(struct file *file, loff_t offset, int whence)
|
|||
}
|
||||
}
|
||||
|
||||
offset = vfs_setpos(file, offset, MAX_LFS_FILESIZE);
|
||||
if (offset >= 0)
|
||||
offset = vfs_setpos(file, offset, MAX_LFS_FILESIZE);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
return offset;
|
||||
}
|
||||
|
|
|
@ -743,7 +743,7 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
|
|||
mutex_lock(&stream->device->lock);
|
||||
switch (_IOC_NR(cmd)) {
|
||||
case _IOC_NR(SNDRV_COMPRESS_IOCTL_VERSION):
|
||||
put_user(SNDRV_COMPRESS_VERSION,
|
||||
retval = put_user(SNDRV_COMPRESS_VERSION,
|
||||
(int __user *)arg) ? -EFAULT : 0;
|
||||
break;
|
||||
case _IOC_NR(SNDRV_COMPRESS_GET_CAPS):
|
||||
|
|
|
@ -860,7 +860,7 @@ void snd_hda_pick_fixup(struct hda_codec *codec,
|
|||
}
|
||||
}
|
||||
if (id < 0 && quirk) {
|
||||
for (q = quirk; q->subvendor; q++) {
|
||||
for (q = quirk; q->subvendor || q->subdevice; q++) {
|
||||
unsigned int vendorid =
|
||||
q->subdevice | (q->subvendor << 16);
|
||||
unsigned int mask = 0xffff0000 | q->subdevice_mask;
|
||||
|
|
|
@ -2819,6 +2819,7 @@ static const struct hda_pintbl ecs202_pin_configs[] = {
|
|||
|
||||
/* codec SSIDs for Intel Mac sharing the same PCI SSID 8384:7680 */
|
||||
static const struct snd_pci_quirk stac922x_intel_mac_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x0000, 0x0100, "Mac Mini", STAC_INTEL_MAC_V3),
|
||||
SND_PCI_QUIRK(0x106b, 0x0800, "Mac", STAC_INTEL_MAC_V1),
|
||||
SND_PCI_QUIRK(0x106b, 0x0600, "Mac", STAC_INTEL_MAC_V2),
|
||||
SND_PCI_QUIRK(0x106b, 0x0700, "Mac", STAC_INTEL_MAC_V2),
|
||||
|
|
|
@ -341,7 +341,7 @@ static struct platform_driver au1xac97c_driver = {
|
|||
.remove = au1xac97c_drvremove,
|
||||
};
|
||||
|
||||
module_platform_driver(&au1xac97c_driver);
|
||||
module_platform_driver(au1xac97c_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Au1000/1500/1100 AC97C ASoC driver");
|
||||
|
|
|
@ -294,11 +294,12 @@ static int asoc_bfin_ac97_probe(struct platform_device *pdev)
|
|||
/* Request PB3 as reset pin */
|
||||
ret = devm_gpio_request_one(&pdev->dev,
|
||||
CONFIG_SND_BF5XX_RESET_GPIO_NUM,
|
||||
GPIOF_OUT_INIT_HIGH, "SND_AD198x RESET") {
|
||||
GPIOF_OUT_INIT_HIGH, "SND_AD198x RESET");
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"Failed to request GPIO_%d for reset: %d\n",
|
||||
CONFIG_SND_BF5XX_RESET_GPIO_NUM, ret);
|
||||
goto gpio_err;
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
#ifndef _BF5XX_AC97_H
|
||||
#define _BF5XX_AC97_H
|
||||
|
||||
extern struct snd_ac97_bus_ops bf5xx_ac97_ops;
|
||||
extern struct snd_ac97 *ac97;
|
||||
/* Frame format in memory, only support stereo currently */
|
||||
struct ac97_frame {
|
||||
|
|
|
@ -410,6 +410,16 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec)
|
|||
rec->command, rec->length);
|
||||
len = rec->length + 8;
|
||||
|
||||
xfer = kzalloc(sizeof(*xfer), GFP_KERNEL);
|
||||
if (!xfer) {
|
||||
dev_err(codec->dev, "Failed to allocate xfer\n");
|
||||
ret = -ENOMEM;
|
||||
goto abort;
|
||||
}
|
||||
|
||||
xfer->codec = codec;
|
||||
list_add_tail(&xfer->list, &xfer_list);
|
||||
|
||||
out = kzalloc(len, GFP_KERNEL);
|
||||
if (!out) {
|
||||
dev_err(codec->dev,
|
||||
|
@ -417,6 +427,7 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec)
|
|||
ret = -ENOMEM;
|
||||
goto abort1;
|
||||
}
|
||||
xfer->t.rx_buf = out;
|
||||
|
||||
img = kzalloc(len, GFP_KERNEL);
|
||||
if (!img) {
|
||||
|
@ -425,24 +436,13 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec)
|
|||
ret = -ENOMEM;
|
||||
goto abort1;
|
||||
}
|
||||
xfer->t.tx_buf = img;
|
||||
|
||||
byte_swap_64((u64 *)&rec->command, img, len);
|
||||
|
||||
xfer = kzalloc(sizeof(*xfer), GFP_KERNEL);
|
||||
if (!xfer) {
|
||||
dev_err(codec->dev, "Failed to allocate xfer\n");
|
||||
ret = -ENOMEM;
|
||||
goto abort1;
|
||||
}
|
||||
|
||||
xfer->codec = codec;
|
||||
list_add_tail(&xfer->list, &xfer_list);
|
||||
|
||||
spi_message_init(&xfer->m);
|
||||
xfer->m.complete = wm0010_boot_xfer_complete;
|
||||
xfer->m.context = xfer;
|
||||
xfer->t.tx_buf = img;
|
||||
xfer->t.rx_buf = out;
|
||||
xfer->t.len = len;
|
||||
xfer->t.bits_per_word = 8;
|
||||
|
||||
|
|
|
@ -2733,7 +2733,7 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
|||
}
|
||||
|
||||
mutex_unlock(&card->dapm_mutex);
|
||||
return 0;
|
||||
return change;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
|
||||
|
||||
|
@ -2861,7 +2861,6 @@ int snd_soc_dapm_put_enum_virt(struct snd_kcontrol *kcontrol,
|
|||
struct soc_enum *e =
|
||||
(struct soc_enum *)kcontrol->private_value;
|
||||
int change;
|
||||
int ret = 0;
|
||||
int wi;
|
||||
|
||||
if (ucontrol->value.enumerated.item[0] >= e->max)
|
||||
|
@ -2881,7 +2880,7 @@ int snd_soc_dapm_put_enum_virt(struct snd_kcontrol *kcontrol,
|
|||
}
|
||||
|
||||
mutex_unlock(&card->dapm_mutex);
|
||||
return ret;
|
||||
return change;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_virt);
|
||||
|
||||
|
|
Loading…
Reference in a new issue