static int msm_dai_q6_dai_mi2s_probe(struct snd_soc_dai *dai) { struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = dev_get_drvdata(dai->dev); struct snd_kcontrol *kcontrol = NULL; int rc = 0; if (mi2s_dai_data->rx_dai.port_config.mi2s.line) { kcontrol = snd_ctl_new1(&mi2s_config_controls[0], &mi2s_dai_data->rx_dai); rc = snd_ctl_add(dai->card->snd_card, kcontrol); if (IS_ERR_VALUE(rc)) { dev_err(dai->dev, "%s: err add RX fmt ctl\n", __func__); goto rtn; } } if (mi2s_dai_data->tx_dai.port_config.mi2s.line) { rc = snd_ctl_add(dai->card->snd_card, snd_ctl_new1(&mi2s_config_controls[2], &mi2s_dai_data->tx_dai)); if (IS_ERR_VALUE(rc)) { if (kcontrol) snd_ctl_remove(dai->card->snd_card, kcontrol); dev_err(dai->dev, "%s: err add TX fmt ctl\n", __func__); } } rtn: return rc; }
/* Initialize beep stuff */ int snd_pmac_attach_beep(struct snd_pmac *chip) { struct pmac_beep *beep; struct input_dev *input_dev; struct snd_kcontrol *beep_ctl; void *dmabuf; int err = -ENOMEM; beep = kzalloc(sizeof(*beep), GFP_KERNEL); if (! beep) return -ENOMEM; dmabuf = dma_alloc_coherent(&chip->pdev->dev, BEEP_BUFLEN * 4, &beep->addr, GFP_KERNEL); input_dev = input_allocate_device(); if (! dmabuf || ! input_dev) goto fail1; /* FIXME: set more better values */ input_dev->name = "PowerMac Beep"; input_dev->phys = "powermac/beep"; input_dev->id.bustype = BUS_ADB; input_dev->id.vendor = 0x001f; input_dev->id.product = 0x0001; input_dev->id.version = 0x0100; input_dev->evbit[0] = BIT_MASK(EV_SND); input_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); input_dev->event = snd_pmac_beep_event; input_dev->dev.parent = &chip->pdev->dev; input_set_drvdata(input_dev, chip); beep->dev = input_dev; beep->buf = dmabuf; beep->volume = BEEP_VOLUME; beep->running = 0; beep_ctl = snd_ctl_new1(&snd_pmac_beep_mixer, chip); err = snd_ctl_add(chip->card, beep_ctl); if (err < 0) goto fail1; chip->beep = beep; err = input_register_device(beep->dev); if (err) goto fail2; return 0; fail2: snd_ctl_remove(chip->card, beep_ctl); fail1: input_free_device(input_dev); if (dmabuf) dma_free_coherent(&chip->pdev->dev, BEEP_BUFLEN * 4, dmabuf, beep->addr); kfree(beep); return err; }