Lines Matching refs:amd

345 /* Idle the AMD7930 chip.  The amd->lock is not held.  */
346 static __inline__ void amd7930_idle(struct snd_amd7930 *amd)
350 spin_lock_irqsave(&amd->lock, flags);
351 sbus_writeb(AMR_INIT, amd->regs + AMD7930_CR);
352 sbus_writeb(0, amd->regs + AMD7930_DR);
353 spin_unlock_irqrestore(&amd->lock, flags);
356 /* Enable chip interrupts. The amd->lock is not held. */
357 static __inline__ void amd7930_enable_ints(struct snd_amd7930 *amd)
361 spin_lock_irqsave(&amd->lock, flags);
362 sbus_writeb(AMR_INIT, amd->regs + AMD7930_CR);
363 sbus_writeb(AM_INIT_ACTIVE, amd->regs + AMD7930_DR);
364 spin_unlock_irqrestore(&amd->lock, flags);
367 /* Disable chip interrupts. The amd->lock is not held. */
368 static __inline__ void amd7930_disable_ints(struct snd_amd7930 *amd)
372 spin_lock_irqsave(&amd->lock, flags);
373 sbus_writeb(AMR_INIT, amd->regs + AMD7930_CR);
374 sbus_writeb(AM_INIT_ACTIVE | AM_INIT_DISABLE_INTS, amd->regs + AMD7930_DR);
375 spin_unlock_irqrestore(&amd->lock, flags);
379 * The amd->lock is held and local interrupts are disabled.
381 static void __amd7930_write_map(struct snd_amd7930 *amd)
383 struct amd7930_map *map = &amd->map;
385 sbus_writeb(AMR_MAP_GX, amd->regs + AMD7930_CR);
386 sbus_writeb(((map->gx >> 0) & 0xff), amd->regs + AMD7930_DR);
387 sbus_writeb(((map->gx >> 8) & 0xff), amd->regs + AMD7930_DR);
389 sbus_writeb(AMR_MAP_GR, amd->regs + AMD7930_CR);
390 sbus_writeb(((map->gr >> 0) & 0xff), amd->regs + AMD7930_DR);
391 sbus_writeb(((map->gr >> 8) & 0xff), amd->regs + AMD7930_DR);
393 sbus_writeb(AMR_MAP_STGR, amd->regs + AMD7930_CR);
394 sbus_writeb(((map->stgr >> 0) & 0xff), amd->regs + AMD7930_DR);
395 sbus_writeb(((map->stgr >> 8) & 0xff), amd->regs + AMD7930_DR);
397 sbus_writeb(AMR_MAP_GER, amd->regs + AMD7930_CR);
398 sbus_writeb(((map->ger >> 0) & 0xff), amd->regs + AMD7930_DR);
399 sbus_writeb(((map->ger >> 8) & 0xff), amd->regs + AMD7930_DR);
401 sbus_writeb(AMR_MAP_MMR1, amd->regs + AMD7930_CR);
402 sbus_writeb(map->mmr1, amd->regs + AMD7930_DR);
404 sbus_writeb(AMR_MAP_MMR2, amd->regs + AMD7930_CR);
405 sbus_writeb(map->mmr2, amd->regs + AMD7930_DR);
473 * The amd->lock is held and local interrupts are disabled.
475 static void __amd7930_update_map(struct snd_amd7930 *amd)
477 struct amd7930_map *map = &amd->map;
480 map->gx = gx_coeff[amd->rgain];
481 map->stgr = gx_coeff[amd->mgain];
482 level = (amd->pgain * (256 + ARRAY_SIZE(ger_coeff))) >> 8;
490 __amd7930_write_map(amd);
495 struct snd_amd7930 *amd = dev_id;
499 spin_lock(&amd->lock);
503 ir = sbus_readb(amd->regs + AMD7930_IR);
507 if (amd->flags & AMD7930_FLAG_PLAYBACK) {
508 if (amd->p_left > 0) {
509 byte = *(amd->p_cur++);
510 amd->p_left--;
511 sbus_writeb(byte, amd->regs + AMD7930_BBTB);
512 if (amd->p_left == 0)
515 sbus_writeb(0, amd->regs + AMD7930_BBTB);
516 } else if (amd->flags & AMD7930_FLAG_CAPTURE) {
517 byte = sbus_readb(amd->regs + AMD7930_BBRB);
518 if (amd->c_left > 0) {
519 *(amd->c_cur++) = byte;
520 amd->c_left--;
521 if (amd->c_left == 0)
526 spin_unlock(&amd->lock);
529 snd_pcm_period_elapsed(amd->playback_substream);
531 snd_pcm_period_elapsed(amd->capture_substream);
536 static int snd_amd7930_trigger(struct snd_amd7930 *amd, unsigned int flag, int cmd)
541 spin_lock_irqsave(&amd->lock, flags);
543 if (!(amd->flags & flag)) {
544 amd->flags |= flag;
547 sbus_writeb(AMR_MUX_MCR4, amd->regs + AMD7930_CR);
548 sbus_writeb(AM_MUX_MCR4_ENABLE_INTS, amd->regs + AMD7930_DR);
551 if (amd->flags & flag) {
552 amd->flags &= ~flag;
555 sbus_writeb(AMR_MUX_MCR4, amd->regs + AMD7930_CR);
556 sbus_writeb(0, amd->regs + AMD7930_DR);
561 spin_unlock_irqrestore(&amd->lock, flags);
569 struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
570 return snd_amd7930_trigger(amd, AMD7930_FLAG_PLAYBACK, cmd);
576 struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
577 return snd_amd7930_trigger(amd, AMD7930_FLAG_CAPTURE, cmd);
582 struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
588 spin_lock_irqsave(&amd->lock, flags);
590 amd->flags |= AMD7930_FLAG_PLAYBACK;
593 amd->p_orig = amd->p_cur = runtime->dma_area;
594 amd->p_left = size;
597 new_mmr1 = amd->map.mmr1;
602 if (new_mmr1 != amd->map.mmr1) {
603 amd->map.mmr1 = new_mmr1;
604 __amd7930_update_map(amd);
607 spin_unlock_irqrestore(&amd->lock, flags);
614 struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
620 spin_lock_irqsave(&amd->lock, flags);
622 amd->flags |= AMD7930_FLAG_CAPTURE;
625 amd->c_orig = amd->c_cur = runtime->dma_area;
626 amd->c_left = size;
629 new_mmr1 = amd->map.mmr1;
634 if (new_mmr1 != amd->map.mmr1) {
635 amd->map.mmr1 = new_mmr1;
636 __amd7930_update_map(amd);
639 spin_unlock_irqrestore(&amd->lock, flags);
646 struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
649 if (!(amd->flags & AMD7930_FLAG_PLAYBACK))
651 ptr = amd->p_cur - amd->p_orig;
657 struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
660 if (!(amd->flags & AMD7930_FLAG_CAPTURE))
663 ptr = amd->c_cur - amd->c_orig;
690 struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
693 amd->playback_substream = substream;
700 struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
703 amd->capture_substream = substream;
710 struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
712 amd->playback_substream = NULL;
718 struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
720 amd->capture_substream = NULL;
740 static int snd_amd7930_pcm(struct snd_amd7930 *amd)
745 if ((err = snd_pcm_new(amd->card,
755 pcm->private_data = amd;
757 strcpy(pcm->name, amd->card->shortname);
758 amd->pcm = pcm;
782 struct snd_amd7930 *amd = snd_kcontrol_chip(kctl);
788 swval = &amd->mgain;
791 swval = &amd->rgain;
795 swval = &amd->pgain;
806 struct snd_amd7930 *amd = snd_kcontrol_chip(kctl);
813 swval = &amd->mgain;
816 swval = &amd->rgain;
820 swval = &amd->pgain;
824 spin_lock_irqsave(&amd->lock, flags);
828 __amd7930_update_map(amd);
833 spin_unlock_irqrestore(&amd->lock, flags);
868 static int snd_amd7930_mixer(struct snd_amd7930 *amd)
873 if (snd_BUG_ON(!amd || !amd->card))
876 card = amd->card;
881 snd_ctl_new1(&amd7930_controls[idx], amd))) < 0)
888 static int snd_amd7930_free(struct snd_amd7930 *amd)
890 struct platform_device *op = amd->op;
892 amd7930_idle(amd);
894 if (amd->irq)
895 free_irq(amd->irq, amd);
897 if (amd->regs)
898 of_iounmap(&op->resource[0], amd->regs,
901 kfree(amd);
908 struct snd_amd7930 *amd = device->device_data;
910 return snd_amd7930_free(amd);
922 struct snd_amd7930 *amd;
927 amd = kzalloc(sizeof(*amd), GFP_KERNEL);
928 if (amd == NULL)
931 spin_lock_init(&amd->lock);
932 amd->card = card;
933 amd->op = op;
935 amd->regs = of_ioremap(&op->resource[0], 0,
937 if (!amd->regs) {
940 kfree(amd);
944 amd7930_idle(amd);
947 IRQF_SHARED, "amd7930", amd)) {
950 snd_amd7930_free(amd);
953 amd->irq = irq;
955 amd7930_enable_ints(amd);
957 spin_lock_irqsave(&amd->lock, flags);
959 amd->rgain = 128;
960 amd->pgain = 200;
961 amd->mgain = 0;
963 memset(&amd->map, 0, sizeof(amd->map));
964 amd->map.mmr1 = (AM_MAP_MMR1_GX | AM_MAP_MMR1_GER |
966 amd->map.mmr2 = (AM_MAP_MMR2_LS | AM_MAP_MMR2_AINB);
968 __amd7930_update_map(amd);
971 sbus_writeb(AMR_MUX_MCR1, amd->regs + AMD7930_CR);
973 amd->regs + AMD7930_DR);
975 spin_unlock_irqrestore(&amd->lock, flags);
978 amd, &snd_amd7930_dev_ops);
980 snd_amd7930_free(amd);
984 *ramd = amd;
993 struct snd_amd7930 *amd;
1019 irq, dev_num, &amd)) < 0)
1022 err = snd_amd7930_pcm(amd);
1026 err = snd_amd7930_mixer(amd);
1034 amd->next = amd7930_list;
1035 amd7930_list = amd;