1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
static int tlc5615_snd_new_pcm(struct tlc5615_snd* chip);
static int tlc5615_snd_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo);
static int tlc5615_snd_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
static int tlc5615_snd_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
static struct snd_kcontrol_new tlc5615_control = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Master Playback Volume", .index = 0, .info = tlc5615_snd_volume_info, .get = tlc5615_snd_volume_get, .put = tlc5615_snd_volume_put, .private_value = 0xffff, };
static int snd_tlc5615_probe(struct spi_device *spi){ static int dev; struct snd_card *card; struct tlc5615_snd *chip; int err;
if(dev > SNDRV_CARDS) return -ENODEV; if(!enable[dev]) { dev ++; return -ENOENT; }
spi->max_speed_hz = 20000000; spi->mode = SPI_MODE_0; spi->bits_per_word = 8; err = spi_setup(spi); if(err < 0) { pr_err("spi_setup failed: %d\n", err); return err; }
err = snd_card_new(&spi->dev, index[dev], id[dev], THIS_MODULE, sizeof(struct tlc5615_snd), &card); if(err < 0) { pr_err("snd_card_new failed, %d\n", err); return err; }
chip = card->private_data; chip->card = card; chip->spi = spi; strcpy(card->driver, "tlc5615"); strcpy(card->shortname, "tlc5615 fake sound"); strcpy(card->longname, "ti,tlc5615 10bit dac pcm device"); strcpy(card->mixername, "tlc5615 mixer"); INIT_WORK(&chip->work, tlc5615_transfer);
err = tlc5615_snd_new_pcm(chip); if(err < 0){ pr_info("snd new pcm failed, %d\n", err); }
err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &tlc5615_ops); if(err < 0){ pr_info("snd device new failed%d\n", err); return err; }
err = snd_ctl_add(card, snd_ctl_new1(&tlc5615_control, chip)); if(err < 0){ struct snd_kcontrol *kctl; kctl = snd_ctl_find_numid(card, 0); pr_info("ctl add failed.\n"); if(kctl) snd_ctl_remove(card, kctl); }
err = snd_card_register(card); if(err < 0){ pr_info("snd card register failed, %d\n", err); goto failed; }
spi_set_drvdata(spi, card); dev ++; return 0; failed: snd_card_free(card); return err; }
|