|
@@ -26,6 +26,7 @@ MODULE_ALIAS("platform:pcspkr");
|
|
static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
|
|
static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
|
|
static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
|
|
static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
|
|
static int enable = SNDRV_DEFAULT_ENABLE1; /* Enable this card */
|
|
static int enable = SNDRV_DEFAULT_ENABLE1; /* Enable this card */
|
|
|
|
+static int nopcm; /* Disable PCM capability of the driver */
|
|
|
|
|
|
module_param(index, int, 0444);
|
|
module_param(index, int, 0444);
|
|
MODULE_PARM_DESC(index, "Index value for pcsp soundcard.");
|
|
MODULE_PARM_DESC(index, "Index value for pcsp soundcard.");
|
|
@@ -33,6 +34,8 @@ module_param(id, charp, 0444);
|
|
MODULE_PARM_DESC(id, "ID string for pcsp soundcard.");
|
|
MODULE_PARM_DESC(id, "ID string for pcsp soundcard.");
|
|
module_param(enable, bool, 0444);
|
|
module_param(enable, bool, 0444);
|
|
MODULE_PARM_DESC(enable, "Enable PC-Speaker sound.");
|
|
MODULE_PARM_DESC(enable, "Enable PC-Speaker sound.");
|
|
|
|
+module_param(nopcm, bool, 0444);
|
|
|
|
+MODULE_PARM_DESC(nopcm, "Disable PC-Speaker PCM sound. Only beeps remain.");
|
|
|
|
|
|
struct snd_pcsp pcsp_chip;
|
|
struct snd_pcsp pcsp_chip;
|
|
|
|
|
|
@@ -43,13 +46,16 @@ static int __devinit snd_pcsp_create(struct snd_card *card)
|
|
int err;
|
|
int err;
|
|
int div, min_div, order;
|
|
int div, min_div, order;
|
|
|
|
|
|
- hrtimer_get_res(CLOCK_MONOTONIC, &tp);
|
|
|
|
- if (tp.tv_sec || tp.tv_nsec > PCSP_MAX_PERIOD_NS) {
|
|
|
|
- printk(KERN_ERR "PCSP: Timer resolution is not sufficient "
|
|
|
|
- "(%linS)\n", tp.tv_nsec);
|
|
|
|
- printk(KERN_ERR "PCSP: Make sure you have HPET and ACPI "
|
|
|
|
- "enabled.\n");
|
|
|
|
- return -EIO;
|
|
|
|
|
|
+ if (!nopcm) {
|
|
|
|
+ hrtimer_get_res(CLOCK_MONOTONIC, &tp);
|
|
|
|
+ if (tp.tv_sec || tp.tv_nsec > PCSP_MAX_PERIOD_NS) {
|
|
|
|
+ printk(KERN_ERR "PCSP: Timer resolution is not sufficient "
|
|
|
|
+ "(%linS)\n", tp.tv_nsec);
|
|
|
|
+ printk(KERN_ERR "PCSP: Make sure you have HPET and ACPI "
|
|
|
|
+ "enabled.\n");
|
|
|
|
+ printk(KERN_ERR "PCSP: Turned into nopcm mode.\n");
|
|
|
|
+ nopcm = 1;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
if (loops_per_jiffy >= PCSP_MIN_LPJ && tp.tv_nsec <= PCSP_MIN_PERIOD_NS)
|
|
if (loops_per_jiffy >= PCSP_MIN_LPJ && tp.tv_nsec <= PCSP_MIN_PERIOD_NS)
|
|
@@ -107,12 +113,14 @@ static int __devinit snd_card_pcsp_probe(int devnum, struct device *dev)
|
|
snd_card_free(card);
|
|
snd_card_free(card);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
- err = snd_pcsp_new_pcm(&pcsp_chip);
|
|
|
|
- if (err < 0) {
|
|
|
|
- snd_card_free(card);
|
|
|
|
- return err;
|
|
|
|
|
|
+ if (!nopcm) {
|
|
|
|
+ err = snd_pcsp_new_pcm(&pcsp_chip);
|
|
|
|
+ if (err < 0) {
|
|
|
|
+ snd_card_free(card);
|
|
|
|
+ return err;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- err = snd_pcsp_new_mixer(&pcsp_chip);
|
|
|
|
|
|
+ err = snd_pcsp_new_mixer(&pcsp_chip, nopcm);
|
|
if (err < 0) {
|
|
if (err < 0) {
|
|
snd_card_free(card);
|
|
snd_card_free(card);
|
|
return err;
|
|
return err;
|