ALSA: snd-pcsp: add nopcm mode
[safe/jmp/linux-2.6] / sound / drivers / pcsp / pcsp.c
index b60cef2..f165c77 100644 (file)
@@ -26,6 +26,7 @@ MODULE_ALIAS("platform:pcspkr");
 static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
 static char *id = SNDRV_DEFAULT_STR1;  /* ID for 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_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_param(enable, bool, 0444);
 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;
 
@@ -43,13 +46,16 @@ static int __devinit snd_pcsp_create(struct snd_card *card)
        int err;
        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)
@@ -107,12 +113,14 @@ static int __devinit snd_card_pcsp_probe(int devnum, struct device *dev)
                snd_card_free(card);
                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) {
                snd_card_free(card);
                return err;