| .. | .. | 
|---|
|  | 1 | +// SPDX-License-Identifier: GPL-2.0-only | 
|---|
| 1 | 2 | /* | 
|---|
| 2 | 3 | * Audio support for PS3 | 
|---|
| 3 | 4 | * Copyright (C) 2007 Sony Computer Entertainment Inc. | 
|---|
| 4 | 5 | * All rights reserved. | 
|---|
| 5 | 6 | * Copyright 2006, 2007 Sony Corporation | 
|---|
| 6 |  | - * | 
|---|
| 7 |  | - * This program is free software; you can redistribute it and/or modify | 
|---|
| 8 |  | - * it under the terms of the GNU General Public License | 
|---|
| 9 |  | - * as published by the Free Software Foundation; version 2 of the Licence. | 
|---|
| 10 |  | - * | 
|---|
| 11 |  | - * This program is distributed in the hope that it will be useful, | 
|---|
| 12 |  | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 13 |  | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
| 14 |  | - * GNU General Public License for more details. | 
|---|
| 15 |  | - * | 
|---|
| 16 |  | - * You should have received a copy of the GNU General Public License | 
|---|
| 17 |  | - * along with this program; if not, write to the Free Software | 
|---|
| 18 |  | - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA | 
|---|
| 19 | 7 | */ | 
|---|
| 20 | 8 |  | 
|---|
| 21 | 9 | #include <linux/dma-mapping.h> | 
|---|
| .. | .. | 
|---|
| 233 | 221 | int fill_stages, dma_ch, stage; | 
|---|
| 234 | 222 | enum snd_ps3_ch ch; | 
|---|
| 235 | 223 | uint32_t ch0_kick_event = 0; /* initialize to mute gcc */ | 
|---|
| 236 |  | -	void *start_vaddr; | 
|---|
| 237 | 224 | unsigned long irqsave; | 
|---|
| 238 | 225 | int silent = 0; | 
|---|
| 239 | 226 |  | 
|---|
| 240 | 227 | switch (filltype) { | 
|---|
| 241 | 228 | case SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL: | 
|---|
| 242 | 229 | silent = 1; | 
|---|
| 243 |  | -		/* intentionally fall thru */ | 
|---|
|  | 230 | +		fallthrough; | 
|---|
| 244 | 231 | case SND_PS3_DMA_FILLTYPE_FIRSTFILL: | 
|---|
| 245 | 232 | ch0_kick_event = PS3_AUDIO_KICK_EVENT_ALWAYS; | 
|---|
| 246 | 233 | break; | 
|---|
| 247 | 234 |  | 
|---|
| 248 | 235 | case SND_PS3_DMA_FILLTYPE_SILENT_RUNNING: | 
|---|
| 249 | 236 | silent = 1; | 
|---|
| 250 |  | -		/* intentionally fall thru */ | 
|---|
|  | 237 | +		fallthrough; | 
|---|
| 251 | 238 | case SND_PS3_DMA_FILLTYPE_RUNNING: | 
|---|
| 252 | 239 | ch0_kick_event = PS3_AUDIO_KICK_EVENT_SERIALOUT0_EMPTY; | 
|---|
| 253 | 240 | break; | 
|---|
| .. | .. | 
|---|
| 257 | 244 | fill_stages = 4; | 
|---|
| 258 | 245 | spin_lock_irqsave(&card->dma_lock, irqsave); | 
|---|
| 259 | 246 | for (ch = 0; ch < 2; ch++) { | 
|---|
| 260 |  | -		start_vaddr = card->dma_next_transfer_vaddr[0]; | 
|---|
| 261 | 247 | for (stage = 0; stage < fill_stages; stage++) { | 
|---|
| 262 | 248 | dma_ch = stage * 2 + ch; | 
|---|
| 263 | 249 | if (silent) | 
|---|
| .. | .. | 
|---|
| 526 | 512 | { | 
|---|
| 527 | 513 | struct snd_pcm_runtime *runtime = substream->runtime; | 
|---|
| 528 | 514 | struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream); | 
|---|
| 529 |  | -	int pcm_index; | 
|---|
| 530 | 515 |  | 
|---|
| 531 |  | -	pcm_index = substream->pcm->device; | 
|---|
| 532 | 516 | /* to retrieve substream/runtime in interrupt handler */ | 
|---|
| 533 | 517 | card->substream = substream; | 
|---|
| 534 | 518 |  | 
|---|
| .. | .. | 
|---|
| 549 | 533 | /* mute on */ | 
|---|
| 550 | 534 | snd_ps3_mute(1); | 
|---|
| 551 | 535 | return 0; | 
|---|
| 552 |  | -}; | 
|---|
| 553 |  | - | 
|---|
| 554 |  | -static int snd_ps3_pcm_hw_params(struct snd_pcm_substream *substream, | 
|---|
| 555 |  | -				 struct snd_pcm_hw_params *hw_params) | 
|---|
| 556 |  | -{ | 
|---|
| 557 |  | -	size_t size; | 
|---|
| 558 |  | - | 
|---|
| 559 |  | -	/* alloc transport buffer */ | 
|---|
| 560 |  | -	size = params_buffer_bytes(hw_params); | 
|---|
| 561 |  | -	snd_pcm_lib_malloc_pages(substream, size); | 
|---|
| 562 |  | -	return 0; | 
|---|
| 563 |  | -}; | 
|---|
| 564 |  | - | 
|---|
| 565 |  | -static int snd_ps3_pcm_hw_free(struct snd_pcm_substream *substream) | 
|---|
| 566 |  | -{ | 
|---|
| 567 |  | -	return snd_pcm_lib_free_pages(substream); | 
|---|
| 568 | 536 | }; | 
|---|
| 569 | 537 |  | 
|---|
| 570 | 538 | static int snd_ps3_delay_to_bytes(struct snd_pcm_substream *substream, | 
|---|
| .. | .. | 
|---|
| 644 | 612 | int cmd) | 
|---|
| 645 | 613 | { | 
|---|
| 646 | 614 | struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream); | 
|---|
| 647 |  | -	int ret = 0; | 
|---|
| 648 | 615 |  | 
|---|
| 649 | 616 | switch (cmd) { | 
|---|
| 650 | 617 | case SNDRV_PCM_TRIGGER_START: | 
|---|
| .. | .. | 
|---|
| 681 | 648 |  | 
|---|
| 682 | 649 | } | 
|---|
| 683 | 650 |  | 
|---|
| 684 |  | -	return ret; | 
|---|
|  | 651 | +	return 0; | 
|---|
| 685 | 652 | }; | 
|---|
| 686 | 653 |  | 
|---|
| 687 | 654 | /* | 
|---|
| .. | .. | 
|---|
| 748 | 715 | return 0; | 
|---|
| 749 | 716 | } | 
|---|
| 750 | 717 |  | 
|---|
| 751 |  | -static struct snd_kcontrol_new spdif_ctls[] = { | 
|---|
|  | 718 | +static const struct snd_kcontrol_new spdif_ctls[] = { | 
|---|
| 752 | 719 | { | 
|---|
| 753 | 720 | .access = SNDRV_CTL_ELEM_ACCESS_READ, | 
|---|
| 754 | 721 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, | 
|---|
| .. | .. | 
|---|
| 775 | 742 | static const struct snd_pcm_ops snd_ps3_pcm_spdif_ops = { | 
|---|
| 776 | 743 | .open = snd_ps3_pcm_open, | 
|---|
| 777 | 744 | .close = snd_ps3_pcm_close, | 
|---|
| 778 |  | -	.ioctl = snd_pcm_lib_ioctl, | 
|---|
| 779 |  | -	.hw_params = snd_ps3_pcm_hw_params, | 
|---|
| 780 |  | -	.hw_free = snd_ps3_pcm_hw_free, | 
|---|
| 781 | 745 | .prepare = snd_ps3_pcm_prepare, | 
|---|
| 782 | 746 | .trigger = snd_ps3_pcm_trigger, | 
|---|
| 783 | 747 | .pointer = snd_ps3_pcm_pointer, | 
|---|
| .. | .. | 
|---|
| 962 | 926 | PAGE_SHIFT, /* use system page size */ | 
|---|
| 963 | 927 | 0, /* dma type; not used */ | 
|---|
| 964 | 928 | NULL, | 
|---|
| 965 |  | -			    _ALIGN_UP(SND_PS3_DMA_REGION_SIZE, PAGE_SIZE)); | 
|---|
|  | 929 | +			    ALIGN(SND_PS3_DMA_REGION_SIZE, PAGE_SIZE)); | 
|---|
| 966 | 930 | dev->d_region->ioid = PS3_AUDIO_IOID; | 
|---|
| 967 | 931 |  | 
|---|
| 968 | 932 | ret = ps3_dma_region_create(dev->d_region); | 
|---|
| .. | .. | 
|---|
| 1024 | 988 |  | 
|---|
| 1025 | 989 | the_card.pcm->info_flags = SNDRV_PCM_INFO_NONINTERLEAVED; | 
|---|
| 1026 | 990 | /* pre-alloc PCM DMA buffer*/ | 
|---|
| 1027 |  | -	ret = snd_pcm_lib_preallocate_pages_for_all(the_card.pcm, | 
|---|
| 1028 |  | -					SNDRV_DMA_TYPE_DEV, | 
|---|
| 1029 |  | -					&dev->core, | 
|---|
| 1030 |  | -					SND_PS3_PCM_PREALLOC_SIZE, | 
|---|
| 1031 |  | -					SND_PS3_PCM_PREALLOC_SIZE); | 
|---|
| 1032 |  | -	if (ret < 0) { | 
|---|
| 1033 |  | -		pr_info("%s: prealloc failed\n", __func__); | 
|---|
| 1034 |  | -		goto clean_card; | 
|---|
| 1035 |  | -	} | 
|---|
|  | 991 | +	snd_pcm_set_managed_buffer_all(the_card.pcm, | 
|---|
|  | 992 | +				       SNDRV_DMA_TYPE_DEV, | 
|---|
|  | 993 | +				       &dev->core, | 
|---|
|  | 994 | +				       SND_PS3_PCM_PREALLOC_SIZE, | 
|---|
|  | 995 | +				       SND_PS3_PCM_PREALLOC_SIZE); | 
|---|
| 1036 | 996 |  | 
|---|
| 1037 | 997 | /* | 
|---|
| 1038 | 998 | * allocate null buffer | 
|---|