提交 daf6c450 编写于 作者: S Steve French

Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6

...@@ -1219,11 +1219,11 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) ...@@ -1219,11 +1219,11 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
ret = i915_gem_object_bind_to_gtt(obj, 0, true); ret = i915_gem_object_bind_to_gtt(obj, 0, true);
if (ret) if (ret)
goto unlock; goto unlock;
}
ret = i915_gem_object_set_to_gtt_domain(obj, write); ret = i915_gem_object_set_to_gtt_domain(obj, write);
if (ret) if (ret)
goto unlock; goto unlock;
}
if (obj->tiling_mode == I915_TILING_NONE) if (obj->tiling_mode == I915_TILING_NONE)
ret = i915_gem_object_put_fence(obj); ret = i915_gem_object_put_fence(obj);
...@@ -2926,8 +2926,6 @@ i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj) ...@@ -2926,8 +2926,6 @@ i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj)
*/ */
wmb(); wmb();
i915_gem_release_mmap(obj);
old_write_domain = obj->base.write_domain; old_write_domain = obj->base.write_domain;
obj->base.write_domain = 0; obj->base.write_domain = 0;
......
...@@ -187,10 +187,6 @@ i915_gem_object_set_to_gpu_domain(struct drm_i915_gem_object *obj, ...@@ -187,10 +187,6 @@ i915_gem_object_set_to_gpu_domain(struct drm_i915_gem_object *obj,
if ((flush_domains | invalidate_domains) & I915_GEM_DOMAIN_CPU) if ((flush_domains | invalidate_domains) & I915_GEM_DOMAIN_CPU)
i915_gem_clflush_object(obj); i915_gem_clflush_object(obj);
/* blow away mappings if mapped through GTT */
if ((flush_domains | invalidate_domains) & I915_GEM_DOMAIN_GTT)
i915_gem_release_mmap(obj);
if (obj->base.pending_write_domain) if (obj->base.pending_write_domain)
cd->flips |= atomic_read(&obj->pending_flip); cd->flips |= atomic_read(&obj->pending_flip);
......
...@@ -1749,6 +1749,7 @@ void ironlake_irq_preinstall(struct drm_device *dev) ...@@ -1749,6 +1749,7 @@ void ironlake_irq_preinstall(struct drm_device *dev)
* happens. * happens.
*/ */
I915_WRITE(GEN6_BLITTER_HWSTAM, ~GEN6_BLITTER_USER_INTERRUPT); I915_WRITE(GEN6_BLITTER_HWSTAM, ~GEN6_BLITTER_USER_INTERRUPT);
I915_WRITE(GEN6_BSD_HWSTAM, ~GEN6_BSD_USER_INTERRUPT);
} }
/* XXX hotplug from PCH */ /* XXX hotplug from PCH */
......
...@@ -531,6 +531,7 @@ ...@@ -531,6 +531,7 @@
#define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE 0 #define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE 0
#define GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR (1 << 3) #define GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR (1 << 3)
#define GEN6_BSD_HWSTAM 0x12098
#define GEN6_BSD_IMR 0x120a8 #define GEN6_BSD_IMR 0x120a8
#define GEN6_BSD_USER_INTERRUPT (1 << 12) #define GEN6_BSD_USER_INTERRUPT (1 << 12)
......
...@@ -678,6 +678,7 @@ void i915_save_display(struct drm_device *dev) ...@@ -678,6 +678,7 @@ void i915_save_display(struct drm_device *dev)
} }
/* VGA state */ /* VGA state */
mutex_lock(&dev->struct_mutex);
dev_priv->saveVGA0 = I915_READ(VGA0); dev_priv->saveVGA0 = I915_READ(VGA0);
dev_priv->saveVGA1 = I915_READ(VGA1); dev_priv->saveVGA1 = I915_READ(VGA1);
dev_priv->saveVGA_PD = I915_READ(VGA_PD); dev_priv->saveVGA_PD = I915_READ(VGA_PD);
...@@ -687,6 +688,7 @@ void i915_save_display(struct drm_device *dev) ...@@ -687,6 +688,7 @@ void i915_save_display(struct drm_device *dev)
dev_priv->saveVGACNTRL = I915_READ(VGACNTRL); dev_priv->saveVGACNTRL = I915_READ(VGACNTRL);
i915_save_vga(dev); i915_save_vga(dev);
mutex_unlock(&dev->struct_mutex);
} }
void i915_restore_display(struct drm_device *dev) void i915_restore_display(struct drm_device *dev)
...@@ -780,6 +782,8 @@ void i915_restore_display(struct drm_device *dev) ...@@ -780,6 +782,8 @@ void i915_restore_display(struct drm_device *dev)
I915_WRITE(CPU_VGACNTRL, dev_priv->saveVGACNTRL); I915_WRITE(CPU_VGACNTRL, dev_priv->saveVGACNTRL);
else else
I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL);
mutex_lock(&dev->struct_mutex);
I915_WRITE(VGA0, dev_priv->saveVGA0); I915_WRITE(VGA0, dev_priv->saveVGA0);
I915_WRITE(VGA1, dev_priv->saveVGA1); I915_WRITE(VGA1, dev_priv->saveVGA1);
I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); I915_WRITE(VGA_PD, dev_priv->saveVGA_PD);
...@@ -787,6 +791,7 @@ void i915_restore_display(struct drm_device *dev) ...@@ -787,6 +791,7 @@ void i915_restore_display(struct drm_device *dev)
udelay(150); udelay(150);
i915_restore_vga(dev); i915_restore_vga(dev);
mutex_unlock(&dev->struct_mutex);
} }
int i915_save_state(struct drm_device *dev) int i915_save_state(struct drm_device *dev)
......
...@@ -4687,6 +4687,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, ...@@ -4687,6 +4687,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
I915_WRITE(DSPCNTR(plane), dspcntr); I915_WRITE(DSPCNTR(plane), dspcntr);
POSTING_READ(DSPCNTR(plane)); POSTING_READ(DSPCNTR(plane));
intel_enable_plane(dev_priv, plane, pipe);
ret = intel_pipe_set_base(crtc, x, y, old_fb); ret = intel_pipe_set_base(crtc, x, y, old_fb);
...@@ -5217,8 +5218,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, ...@@ -5217,8 +5218,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
I915_WRITE(DSPCNTR(plane), dspcntr); I915_WRITE(DSPCNTR(plane), dspcntr);
POSTING_READ(DSPCNTR(plane)); POSTING_READ(DSPCNTR(plane));
if (!HAS_PCH_SPLIT(dev))
intel_enable_plane(dev_priv, plane, pipe);
ret = intel_pipe_set_base(crtc, x, y, old_fb); ret = intel_pipe_set_base(crtc, x, y, old_fb);
......
...@@ -78,7 +78,6 @@ struct vt8500_rtc { ...@@ -78,7 +78,6 @@ struct vt8500_rtc {
void __iomem *regbase; void __iomem *regbase;
struct resource *res; struct resource *res;
int irq_alarm; int irq_alarm;
int irq_hz;
struct rtc_device *rtc; struct rtc_device *rtc;
spinlock_t lock; /* Protects this structure */ spinlock_t lock; /* Protects this structure */
}; };
...@@ -100,10 +99,6 @@ static irqreturn_t vt8500_rtc_irq(int irq, void *dev_id) ...@@ -100,10 +99,6 @@ static irqreturn_t vt8500_rtc_irq(int irq, void *dev_id)
if (isr & 1) if (isr & 1)
events |= RTC_AF | RTC_IRQF; events |= RTC_AF | RTC_IRQF;
/* Only second/minute interrupts are supported */
if (isr & 2)
events |= RTC_UF | RTC_IRQF;
rtc_update_irq(vt8500_rtc->rtc, 1, events); rtc_update_irq(vt8500_rtc->rtc, 1, events);
return IRQ_HANDLED; return IRQ_HANDLED;
...@@ -199,27 +194,12 @@ static int vt8500_alarm_irq_enable(struct device *dev, unsigned int enabled) ...@@ -199,27 +194,12 @@ static int vt8500_alarm_irq_enable(struct device *dev, unsigned int enabled)
return 0; return 0;
} }
static int vt8500_update_irq_enable(struct device *dev, unsigned int enabled)
{
struct vt8500_rtc *vt8500_rtc = dev_get_drvdata(dev);
unsigned long tmp = readl(vt8500_rtc->regbase + VT8500_RTC_CR);
if (enabled)
tmp |= VT8500_RTC_CR_SM_SEC | VT8500_RTC_CR_SM_ENABLE;
else
tmp &= ~VT8500_RTC_CR_SM_ENABLE;
writel(tmp, vt8500_rtc->regbase + VT8500_RTC_CR);
return 0;
}
static const struct rtc_class_ops vt8500_rtc_ops = { static const struct rtc_class_ops vt8500_rtc_ops = {
.read_time = vt8500_rtc_read_time, .read_time = vt8500_rtc_read_time,
.set_time = vt8500_rtc_set_time, .set_time = vt8500_rtc_set_time,
.read_alarm = vt8500_rtc_read_alarm, .read_alarm = vt8500_rtc_read_alarm,
.set_alarm = vt8500_rtc_set_alarm, .set_alarm = vt8500_rtc_set_alarm,
.alarm_irq_enable = vt8500_alarm_irq_enable, .alarm_irq_enable = vt8500_alarm_irq_enable,
.update_irq_enable = vt8500_update_irq_enable,
}; };
static int __devinit vt8500_rtc_probe(struct platform_device *pdev) static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
...@@ -248,13 +228,6 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev) ...@@ -248,13 +228,6 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
goto err_free; goto err_free;
} }
vt8500_rtc->irq_hz = platform_get_irq(pdev, 1);
if (vt8500_rtc->irq_hz < 0) {
dev_err(&pdev->dev, "No 1Hz IRQ resource defined\n");
ret = -ENXIO;
goto err_free;
}
vt8500_rtc->res = request_mem_region(vt8500_rtc->res->start, vt8500_rtc->res = request_mem_region(vt8500_rtc->res->start,
resource_size(vt8500_rtc->res), resource_size(vt8500_rtc->res),
"vt8500-rtc"); "vt8500-rtc");
...@@ -272,9 +245,8 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev) ...@@ -272,9 +245,8 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
goto err_release; goto err_release;
} }
/* Enable the second/minute interrupt generation and enable RTC */ /* Enable RTC and set it to 24-hour mode */
writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H,
| VT8500_RTC_CR_SM_ENABLE | VT8500_RTC_CR_SM_SEC,
vt8500_rtc->regbase + VT8500_RTC_CR); vt8500_rtc->regbase + VT8500_RTC_CR);
vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev, vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev,
...@@ -286,26 +258,16 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev) ...@@ -286,26 +258,16 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
goto err_unmap; goto err_unmap;
} }
ret = request_irq(vt8500_rtc->irq_hz, vt8500_rtc_irq, 0,
"rtc 1Hz", vt8500_rtc);
if (ret < 0) {
dev_err(&pdev->dev, "can't get irq %i, err %d\n",
vt8500_rtc->irq_hz, ret);
goto err_unreg;
}
ret = request_irq(vt8500_rtc->irq_alarm, vt8500_rtc_irq, 0, ret = request_irq(vt8500_rtc->irq_alarm, vt8500_rtc_irq, 0,
"rtc alarm", vt8500_rtc); "rtc alarm", vt8500_rtc);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "can't get irq %i, err %d\n", dev_err(&pdev->dev, "can't get irq %i, err %d\n",
vt8500_rtc->irq_alarm, ret); vt8500_rtc->irq_alarm, ret);
goto err_free_hz; goto err_unreg;
} }
return 0; return 0;
err_free_hz:
free_irq(vt8500_rtc->irq_hz, vt8500_rtc);
err_unreg: err_unreg:
rtc_device_unregister(vt8500_rtc->rtc); rtc_device_unregister(vt8500_rtc->rtc);
err_unmap: err_unmap:
...@@ -323,7 +285,6 @@ static int __devexit vt8500_rtc_remove(struct platform_device *pdev) ...@@ -323,7 +285,6 @@ static int __devexit vt8500_rtc_remove(struct platform_device *pdev)
struct vt8500_rtc *vt8500_rtc = platform_get_drvdata(pdev); struct vt8500_rtc *vt8500_rtc = platform_get_drvdata(pdev);
free_irq(vt8500_rtc->irq_alarm, vt8500_rtc); free_irq(vt8500_rtc->irq_alarm, vt8500_rtc);
free_irq(vt8500_rtc->irq_hz, vt8500_rtc);
rtc_device_unregister(vt8500_rtc->rtc); rtc_device_unregister(vt8500_rtc->rtc);
......
...@@ -248,8 +248,7 @@ typedef int (*hw_write_t)(void *,const char* ,int); ...@@ -248,8 +248,7 @@ typedef int (*hw_write_t)(void *,const char* ,int);
extern struct snd_ac97_bus_ops soc_ac97_ops; extern struct snd_ac97_bus_ops soc_ac97_ops;
enum snd_soc_control_type { enum snd_soc_control_type {
SND_SOC_CUSTOM = 1, SND_SOC_I2C = 1,
SND_SOC_I2C,
SND_SOC_SPI, SND_SOC_SPI,
}; };
......
...@@ -42,15 +42,75 @@ static struct alarm_base { ...@@ -42,15 +42,75 @@ static struct alarm_base {
clockid_t base_clockid; clockid_t base_clockid;
} alarm_bases[ALARM_NUMTYPE]; } alarm_bases[ALARM_NUMTYPE];
/* freezer delta & lock used to handle clock_nanosleep triggered wakeups */
static ktime_t freezer_delta;
static DEFINE_SPINLOCK(freezer_delta_lock);
#ifdef CONFIG_RTC_CLASS #ifdef CONFIG_RTC_CLASS
/* rtc timer and device for setting alarm wakeups at suspend */ /* rtc timer and device for setting alarm wakeups at suspend */
static struct rtc_timer rtctimer; static struct rtc_timer rtctimer;
static struct rtc_device *rtcdev; static struct rtc_device *rtcdev;
#endif static DEFINE_SPINLOCK(rtcdev_lock);
/* freezer delta & lock used to handle clock_nanosleep triggered wakeups */ /**
static ktime_t freezer_delta; * has_wakealarm - check rtc device has wakealarm ability
static DEFINE_SPINLOCK(freezer_delta_lock); * @dev: current device
* @name_ptr: name to be returned
*
* This helper function checks to see if the rtc device can wake
* from suspend.
*/
static int has_wakealarm(struct device *dev, void *name_ptr)
{
struct rtc_device *candidate = to_rtc_device(dev);
if (!candidate->ops->set_alarm)
return 0;
if (!device_may_wakeup(candidate->dev.parent))
return 0;
*(const char **)name_ptr = dev_name(dev);
return 1;
}
/**
* alarmtimer_get_rtcdev - Return selected rtcdevice
*
* This function returns the rtc device to use for wakealarms.
* If one has not already been chosen, it checks to see if a
* functional rtc device is available.
*/
static struct rtc_device *alarmtimer_get_rtcdev(void)
{
struct device *dev;
char *str;
unsigned long flags;
struct rtc_device *ret;
spin_lock_irqsave(&rtcdev_lock, flags);
if (!rtcdev) {
/* Find an rtc device and init the rtc_timer */
dev = class_find_device(rtc_class, NULL, &str, has_wakealarm);
/* If we have a device then str is valid. See has_wakealarm() */
if (dev) {
rtcdev = rtc_class_open(str);
/*
* Drop the reference we got in class_find_device,
* rtc_open takes its own.
*/
put_device(dev);
rtc_timer_init(&rtctimer, NULL, NULL);
}
}
ret = rtcdev;
spin_unlock_irqrestore(&rtcdev_lock, flags);
return ret;
}
#else
#define alarmtimer_get_rtcdev() (0)
#define rtcdev (0)
#endif
/** /**
...@@ -166,6 +226,7 @@ static int alarmtimer_suspend(struct device *dev) ...@@ -166,6 +226,7 @@ static int alarmtimer_suspend(struct device *dev)
struct rtc_time tm; struct rtc_time tm;
ktime_t min, now; ktime_t min, now;
unsigned long flags; unsigned long flags;
struct rtc_device *rtc;
int i; int i;
spin_lock_irqsave(&freezer_delta_lock, flags); spin_lock_irqsave(&freezer_delta_lock, flags);
...@@ -173,8 +234,9 @@ static int alarmtimer_suspend(struct device *dev) ...@@ -173,8 +234,9 @@ static int alarmtimer_suspend(struct device *dev)
freezer_delta = ktime_set(0, 0); freezer_delta = ktime_set(0, 0);
spin_unlock_irqrestore(&freezer_delta_lock, flags); spin_unlock_irqrestore(&freezer_delta_lock, flags);
rtc = rtcdev;
/* If we have no rtcdev, just return */ /* If we have no rtcdev, just return */
if (!rtcdev) if (!rtc)
return 0; return 0;
/* Find the soonest timer to expire*/ /* Find the soonest timer to expire*/
...@@ -199,12 +261,12 @@ static int alarmtimer_suspend(struct device *dev) ...@@ -199,12 +261,12 @@ static int alarmtimer_suspend(struct device *dev)
WARN_ON(min.tv64 < NSEC_PER_SEC); WARN_ON(min.tv64 < NSEC_PER_SEC);
/* Setup an rtc timer to fire that far in the future */ /* Setup an rtc timer to fire that far in the future */
rtc_timer_cancel(rtcdev, &rtctimer); rtc_timer_cancel(rtc, &rtctimer);
rtc_read_time(rtcdev, &tm); rtc_read_time(rtc, &tm);
now = rtc_tm_to_ktime(tm); now = rtc_tm_to_ktime(tm);
now = ktime_add(now, min); now = ktime_add(now, min);
rtc_timer_start(rtcdev, &rtctimer, now, ktime_set(0, 0)); rtc_timer_start(rtc, &rtctimer, now, ktime_set(0, 0));
return 0; return 0;
} }
...@@ -322,6 +384,9 @@ static int alarm_clock_getres(const clockid_t which_clock, struct timespec *tp) ...@@ -322,6 +384,9 @@ static int alarm_clock_getres(const clockid_t which_clock, struct timespec *tp)
{ {
clockid_t baseid = alarm_bases[clock2alarm(which_clock)].base_clockid; clockid_t baseid = alarm_bases[clock2alarm(which_clock)].base_clockid;
if (!alarmtimer_get_rtcdev())
return -ENOTSUPP;
return hrtimer_get_res(baseid, tp); return hrtimer_get_res(baseid, tp);
} }
...@@ -336,6 +401,9 @@ static int alarm_clock_get(clockid_t which_clock, struct timespec *tp) ...@@ -336,6 +401,9 @@ static int alarm_clock_get(clockid_t which_clock, struct timespec *tp)
{ {
struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)]; struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)];
if (!alarmtimer_get_rtcdev())
return -ENOTSUPP;
*tp = ktime_to_timespec(base->gettime()); *tp = ktime_to_timespec(base->gettime());
return 0; return 0;
} }
...@@ -351,6 +419,9 @@ static int alarm_timer_create(struct k_itimer *new_timer) ...@@ -351,6 +419,9 @@ static int alarm_timer_create(struct k_itimer *new_timer)
enum alarmtimer_type type; enum alarmtimer_type type;
struct alarm_base *base; struct alarm_base *base;
if (!alarmtimer_get_rtcdev())
return -ENOTSUPP;
if (!capable(CAP_WAKE_ALARM)) if (!capable(CAP_WAKE_ALARM))
return -EPERM; return -EPERM;
...@@ -385,6 +456,9 @@ static void alarm_timer_get(struct k_itimer *timr, ...@@ -385,6 +456,9 @@ static void alarm_timer_get(struct k_itimer *timr,
*/ */
static int alarm_timer_del(struct k_itimer *timr) static int alarm_timer_del(struct k_itimer *timr)
{ {
if (!rtcdev)
return -ENOTSUPP;
alarm_cancel(&timr->it.alarmtimer); alarm_cancel(&timr->it.alarmtimer);
return 0; return 0;
} }
...@@ -402,6 +476,9 @@ static int alarm_timer_set(struct k_itimer *timr, int flags, ...@@ -402,6 +476,9 @@ static int alarm_timer_set(struct k_itimer *timr, int flags,
struct itimerspec *new_setting, struct itimerspec *new_setting,
struct itimerspec *old_setting) struct itimerspec *old_setting)
{ {
if (!rtcdev)
return -ENOTSUPP;
/* Save old values */ /* Save old values */
old_setting->it_interval = old_setting->it_interval =
ktime_to_timespec(timr->it.alarmtimer.period); ktime_to_timespec(timr->it.alarmtimer.period);
...@@ -541,6 +618,9 @@ static int alarm_timer_nsleep(const clockid_t which_clock, int flags, ...@@ -541,6 +618,9 @@ static int alarm_timer_nsleep(const clockid_t which_clock, int flags,
int ret = 0; int ret = 0;
struct restart_block *restart; struct restart_block *restart;
if (!alarmtimer_get_rtcdev())
return -ENOTSUPP;
if (!capable(CAP_WAKE_ALARM)) if (!capable(CAP_WAKE_ALARM))
return -EPERM; return -EPERM;
...@@ -638,65 +718,3 @@ static int __init alarmtimer_init(void) ...@@ -638,65 +718,3 @@ static int __init alarmtimer_init(void)
} }
device_initcall(alarmtimer_init); device_initcall(alarmtimer_init);
#ifdef CONFIG_RTC_CLASS
/**
* has_wakealarm - check rtc device has wakealarm ability
* @dev: current device
* @name_ptr: name to be returned
*
* This helper function checks to see if the rtc device can wake
* from suspend.
*/
static int __init has_wakealarm(struct device *dev, void *name_ptr)
{
struct rtc_device *candidate = to_rtc_device(dev);
if (!candidate->ops->set_alarm)
return 0;
if (!device_may_wakeup(candidate->dev.parent))
return 0;
*(const char **)name_ptr = dev_name(dev);
return 1;
}
/**
* alarmtimer_init_late - Late initializing of alarmtimer code
*
* This function locates a rtc device to use for wakealarms.
* Run as late_initcall to make sure rtc devices have been
* registered.
*/
static int __init alarmtimer_init_late(void)
{
struct device *dev;
char *str;
/* Find an rtc device and init the rtc_timer */
dev = class_find_device(rtc_class, NULL, &str, has_wakealarm);
/* If we have a device then str is valid. See has_wakealarm() */
if (dev) {
rtcdev = rtc_class_open(str);
/*
* Drop the reference we got in class_find_device,
* rtc_open takes its own.
*/
put_device(dev);
}
if (!rtcdev) {
printk(KERN_WARNING "No RTC device found, ALARM timers will"
" not wake from suspend");
}
rtc_timer_init(&rtctimer, NULL, NULL);
return 0;
}
#else
static int __init alarmtimer_init_late(void)
{
printk(KERN_WARNING "Kernel not built with RTC support, ALARM timers"
" will not wake from suspend");
return 0;
}
#endif
late_initcall(alarmtimer_init_late);
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
#include "hpioctl.h" #include "hpioctl.h"
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/version.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/slab.h> #include <linux/slab.h>
......
...@@ -4883,7 +4883,6 @@ static const struct snd_pci_quirk alc880_cfg_tbl[] = { ...@@ -4883,7 +4883,6 @@ static const struct snd_pci_quirk alc880_cfg_tbl[] = {
SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG), SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST), SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG), SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V), SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG), SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG), SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
...@@ -12600,6 +12599,7 @@ static const struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = { ...@@ -12600,6 +12599,7 @@ static const struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
*/ */
enum { enum {
PINFIX_FSC_H270, PINFIX_FSC_H270,
PINFIX_HP_Z200,
}; };
static const struct alc_fixup alc262_fixups[] = { static const struct alc_fixup alc262_fixups[] = {
...@@ -12612,9 +12612,17 @@ static const struct alc_fixup alc262_fixups[] = { ...@@ -12612,9 +12612,17 @@ static const struct alc_fixup alc262_fixups[] = {
{ } { }
} }
}, },
[PINFIX_HP_Z200] = {
.type = ALC_FIXUP_PINS,
.v.pins = (const struct alc_pincfg[]) {
{ 0x16, 0x99130120 }, /* internal speaker */
{ }
}
},
}; };
static const struct snd_pci_quirk alc262_fixup_tbl[] = { static const struct snd_pci_quirk alc262_fixup_tbl[] = {
SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", PINFIX_HP_Z200),
SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", PINFIX_FSC_H270), SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", PINFIX_FSC_H270),
{} {}
}; };
...@@ -12731,6 +12739,8 @@ static const struct snd_pci_quirk alc262_cfg_tbl[] = { ...@@ -12731,6 +12739,8 @@ static const struct snd_pci_quirk alc262_cfg_tbl[] = {
ALC262_HP_BPC), ALC262_HP_BPC),
SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1500, "HP z series", SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1500, "HP z series",
ALC262_HP_BPC), ALC262_HP_BPC),
SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200",
ALC262_AUTO),
SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series", SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
ALC262_HP_BPC), ALC262_HP_BPC),
SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL), SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
...@@ -13872,7 +13882,6 @@ static const struct snd_pci_quirk alc268_cfg_tbl[] = { ...@@ -13872,7 +13882,6 @@ static const struct snd_pci_quirk alc268_cfg_tbl[] = {
SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO), SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
{} {}
}; };
......
...@@ -745,12 +745,23 @@ static int via_independent_hp_put(struct snd_kcontrol *kcontrol, ...@@ -745,12 +745,23 @@ static int via_independent_hp_put(struct snd_kcontrol *kcontrol,
struct via_spec *spec = codec->spec; struct via_spec *spec = codec->spec;
hda_nid_t nid = kcontrol->private_value; hda_nid_t nid = kcontrol->private_value;
unsigned int pinsel = ucontrol->value.enumerated.item[0]; unsigned int pinsel = ucontrol->value.enumerated.item[0];
unsigned int parm0, parm1;
/* Get Independent Mode index of headphone pin widget */ /* Get Independent Mode index of headphone pin widget */
spec->hp_independent_mode = spec->hp_independent_mode_index == pinsel spec->hp_independent_mode = spec->hp_independent_mode_index == pinsel
? 1 : 0; ? 1 : 0;
if (spec->codec_type == VT1718S) if (spec->codec_type == VT1718S) {
snd_hda_codec_write(codec, nid, 0, snd_hda_codec_write(codec, nid, 0,
AC_VERB_SET_CONNECT_SEL, pinsel ? 2 : 0); AC_VERB_SET_CONNECT_SEL, pinsel ? 2 : 0);
/* Set correct mute switch for MW3 */
parm0 = spec->hp_independent_mode ?
AMP_IN_UNMUTE(0) : AMP_IN_MUTE(0);
parm1 = spec->hp_independent_mode ?
AMP_IN_MUTE(1) : AMP_IN_UNMUTE(1);
snd_hda_codec_write(codec, 0x1b, 0,
AC_VERB_SET_AMP_GAIN_MUTE, parm0);
snd_hda_codec_write(codec, 0x1b, 0,
AC_VERB_SET_AMP_GAIN_MUTE, parm1);
}
else else
snd_hda_codec_write(codec, nid, 0, snd_hda_codec_write(codec, nid, 0,
AC_VERB_SET_CONNECT_SEL, pinsel); AC_VERB_SET_CONNECT_SEL, pinsel);
...@@ -4283,9 +4294,6 @@ static const struct hda_verb vt1718S_volume_init_verbs[] = { ...@@ -4283,9 +4294,6 @@ static const struct hda_verb vt1718S_volume_init_verbs[] = {
{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)}, {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
/* Setup default input of Front HP to MW9 */
{0x28, AC_VERB_SET_CONNECT_SEL, 0x1},
/* PW9 PW10 Output enable */ /* PW9 PW10 Output enable */
{0x2d, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_OUT_EN}, {0x2d, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_OUT_EN},
{0x2e, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_OUT_EN}, {0x2e, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_OUT_EN},
...@@ -4294,10 +4302,10 @@ static const struct hda_verb vt1718S_volume_init_verbs[] = { ...@@ -4294,10 +4302,10 @@ static const struct hda_verb vt1718S_volume_init_verbs[] = {
/* Enable Boost Volume backdoor */ /* Enable Boost Volume backdoor */
{0x1, 0xf88, 0x8}, {0x1, 0xf88, 0x8},
/* MW0/1/2/3/4: un-mute index 0 (AOWx), mute index 1 (MW9) */ /* MW0/1/2/3/4: un-mute index 0 (AOWx), mute index 1 (MW9) */
{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
...@@ -4307,8 +4315,6 @@ static const struct hda_verb vt1718S_volume_init_verbs[] = { ...@@ -4307,8 +4315,6 @@ static const struct hda_verb vt1718S_volume_init_verbs[] = {
/* set MUX1 = 2 (AOW4), MUX2 = 1 (AOW3) */ /* set MUX1 = 2 (AOW4), MUX2 = 1 (AOW3) */
{0x34, AC_VERB_SET_CONNECT_SEL, 0x2}, {0x34, AC_VERB_SET_CONNECT_SEL, 0x2},
{0x35, AC_VERB_SET_CONNECT_SEL, 0x1}, {0x35, AC_VERB_SET_CONNECT_SEL, 0x1},
/* Unmute MW4's index 0 */
{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
{ } { }
}; };
...@@ -4456,6 +4462,19 @@ static int vt1718S_auto_create_multi_out_ctls(struct via_spec *spec, ...@@ -4456,6 +4462,19 @@ static int vt1718S_auto_create_multi_out_ctls(struct via_spec *spec,
if (err < 0) if (err < 0)
return err; return err;
} else if (i == AUTO_SEQ_FRONT) { } else if (i == AUTO_SEQ_FRONT) {
/* add control to mixer index 0 */
err = via_add_control(spec, VIA_CTL_WIDGET_VOL,
"Master Front Playback Volume",
HDA_COMPOSE_AMP_VAL(0x21, 3, 5,
HDA_INPUT));
if (err < 0)
return err;
err = via_add_control(spec, VIA_CTL_WIDGET_MUTE,
"Master Front Playback Switch",
HDA_COMPOSE_AMP_VAL(0x21, 3, 5,
HDA_INPUT));
if (err < 0)
return err;
/* Front */ /* Front */
sprintf(name, "%s Playback Volume", chname[i]); sprintf(name, "%s Playback Volume", chname[i]);
err = via_add_control( err = via_add_control(
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/version.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -11,9 +11,6 @@ menuconfig SND_IMX_SOC ...@@ -11,9 +11,6 @@ menuconfig SND_IMX_SOC
if SND_IMX_SOC if SND_IMX_SOC
config SND_MXC_SOC_SSI
tristate
config SND_MXC_SOC_FIQ config SND_MXC_SOC_FIQ
tristate tristate
...@@ -24,7 +21,6 @@ config SND_MXC_SOC_WM1133_EV1 ...@@ -24,7 +21,6 @@ config SND_MXC_SOC_WM1133_EV1
tristate "Audio on the the i.MX31ADS with WM1133-EV1 fitted" tristate "Audio on the the i.MX31ADS with WM1133-EV1 fitted"
depends on MACH_MX31ADS_WM1133_EV1 && EXPERIMENTAL depends on MACH_MX31ADS_WM1133_EV1 && EXPERIMENTAL
select SND_SOC_WM8350 select SND_SOC_WM8350
select SND_MXC_SOC_SSI
select SND_MXC_SOC_FIQ select SND_MXC_SOC_FIQ
help help
Enable support for audio on the i.MX31ADS with the WM1133-EV1 Enable support for audio on the i.MX31ADS with the WM1133-EV1
...@@ -34,7 +30,6 @@ config SND_SOC_MX27VIS_AIC32X4 ...@@ -34,7 +30,6 @@ config SND_SOC_MX27VIS_AIC32X4
tristate "SoC audio support for Visstrim M10 boards" tristate "SoC audio support for Visstrim M10 boards"
depends on MACH_IMX27_VISSTRIM_M10 depends on MACH_IMX27_VISSTRIM_M10
select SND_SOC_TVL320AIC32X4 select SND_SOC_TVL320AIC32X4
select SND_MXC_SOC_SSI
select SND_MXC_SOC_MX2 select SND_MXC_SOC_MX2
help help
Say Y if you want to add support for SoC audio on Visstrim SM10 Say Y if you want to add support for SoC audio on Visstrim SM10
...@@ -44,7 +39,6 @@ config SND_SOC_PHYCORE_AC97 ...@@ -44,7 +39,6 @@ config SND_SOC_PHYCORE_AC97
tristate "SoC Audio support for Phytec phyCORE (and phyCARD) boards" tristate "SoC Audio support for Phytec phyCORE (and phyCARD) boards"
depends on MACH_PCM043 || MACH_PCA100 depends on MACH_PCM043 || MACH_PCA100
select SND_SOC_WM9712 select SND_SOC_WM9712
select SND_MXC_SOC_SSI
select SND_MXC_SOC_FIQ select SND_MXC_SOC_FIQ
help help
Say Y if you want to add support for SoC audio on Phytec phyCORE Say Y if you want to add support for SoC audio on Phytec phyCORE
...@@ -57,7 +51,6 @@ config SND_SOC_EUKREA_TLV320 ...@@ -57,7 +51,6 @@ config SND_SOC_EUKREA_TLV320
|| MACH_EUKREA_MBIMXSD35_BASEBOARD \ || MACH_EUKREA_MBIMXSD35_BASEBOARD \
|| MACH_EUKREA_MBIMXSD51_BASEBOARD || MACH_EUKREA_MBIMXSD51_BASEBOARD
select SND_SOC_TLV320AIC23 select SND_SOC_TLV320AIC23
select SND_MXC_SOC_SSI
select SND_MXC_SOC_FIQ select SND_MXC_SOC_FIQ
help help
Enable I2S based access to the TLV320AIC23B codec attached Enable I2S based access to the TLV320AIC23B codec attached
......
...@@ -337,3 +337,5 @@ static void __exit snd_imx_pcm_exit(void) ...@@ -337,3 +337,5 @@ static void __exit snd_imx_pcm_exit(void)
platform_driver_unregister(&imx_pcm_driver); platform_driver_unregister(&imx_pcm_driver);
} }
module_exit(snd_imx_pcm_exit); module_exit(snd_imx_pcm_exit);
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:imx-pcm-audio");
...@@ -774,4 +774,4 @@ module_exit(imx_ssi_exit); ...@@ -774,4 +774,4 @@ module_exit(imx_ssi_exit);
MODULE_AUTHOR("Sascha Hauer, <s.hauer@pengutronix.de>"); MODULE_AUTHOR("Sascha Hauer, <s.hauer@pengutronix.de>");
MODULE_DESCRIPTION("i.MX I2S/ac97 SoC Interface"); MODULE_DESCRIPTION("i.MX I2S/ac97 SoC Interface");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:imx-ssi");
...@@ -95,14 +95,14 @@ static int pxa2xx_soc_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, ...@@ -95,14 +95,14 @@ static int pxa2xx_soc_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
if (!card->dev->coherent_dma_mask) if (!card->dev->coherent_dma_mask)
card->dev->coherent_dma_mask = DMA_BIT_MASK(32); card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
if (dai->driver->playback.channels_min) { if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_PLAYBACK); SNDRV_PCM_STREAM_PLAYBACK);
if (ret) if (ret)
goto out; goto out;
} }
if (dai->driver->capture.channels_min) { if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE); SNDRV_PCM_STREAM_CAPTURE);
if (ret) if (ret)
......
...@@ -409,9 +409,6 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, ...@@ -409,9 +409,6 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
codec->bulk_write_raw = snd_soc_hw_bulk_write_raw; codec->bulk_write_raw = snd_soc_hw_bulk_write_raw;
switch (control) { switch (control) {
case SND_SOC_CUSTOM:
break;
case SND_SOC_I2C: case SND_SOC_I2C:
#if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE)) #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
codec->hw_write = (hw_write_t)i2c_master_send; codec->hw_write = (hw_write_t)i2c_master_send;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册