static int __init snd_card_pcsp_probe(int dev) { struct snd_card *card; int err; if (dev != 0) return -EINVAL; hrtimer_init(&pcsp_chip.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); pcsp_chip.timer.cb_mode = HRTIMER_CB_IRQSAFE; pcsp_chip.timer.function = pcsp_do_timer; card = snd_card_new(index, id, THIS_MODULE, 0); if (!card) return -ENOMEM; err = snd_pcsp_create(card); if (err < 0) { snd_card_free(card); return err; } err = snd_pcsp_new_pcm(&pcsp_chip); if (err < 0) { snd_card_free(card); return err; } err = snd_pcsp_new_mixer(&pcsp_chip); if (err < 0) { snd_card_free(card); return err; } strcpy(card->driver, "PC-Speaker"); strcpy(card->shortname, "pcsp"); sprintf(card->longname, "Internal PC-Speaker at port 0x%x", pcsp_chip.port); err = snd_card_register(card); if (err < 0) { snd_card_free(card); return err; } pcspkr_input_init(&pcsp_chip.input_dev); return 0; }
static int __devinit pcsp_probe(struct platform_device *dev) { int err; err = pcspkr_input_init(&pcsp_chip.input_dev, &dev->dev); if (err < 0) return err; err = alsa_card_pcsp_init(&dev->dev); if (err < 0) { pcspkr_input_remove(pcsp_chip.input_dev); return err; } platform_set_drvdata(dev, &pcsp_chip); return 0; }