cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pmac.c (36883B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * PMac DBDMA lowlevel functions
      4 *
      5 * Copyright (c) by Takashi Iwai <tiwai@suse.de>
      6 * code based on dmasound.c.
      7 */
      8
      9
     10#include <linux/io.h>
     11#include <asm/irq.h>
     12#include <linux/init.h>
     13#include <linux/delay.h>
     14#include <linux/slab.h>
     15#include <linux/interrupt.h>
     16#include <linux/pci.h>
     17#include <linux/dma-mapping.h>
     18#include <linux/of_address.h>
     19#include <linux/of_irq.h>
     20#include <sound/core.h>
     21#include "pmac.h"
     22#include <sound/pcm_params.h>
     23#include <asm/pmac_feature.h>
     24
     25
     26/* fixed frequency table for awacs, screamer, burgundy, DACA (44100 max) */
     27static const int awacs_freqs[8] = {
     28	44100, 29400, 22050, 17640, 14700, 11025, 8820, 7350
     29};
     30/* fixed frequency table for tumbler */
     31static const int tumbler_freqs[1] = {
     32	44100
     33};
     34
     35
     36/*
     37 * we will allocate a single 'emergency' dbdma cmd block to use if the
     38 * tx status comes up "DEAD".  This happens on some PowerComputing Pmac
     39 * clones, either owing to a bug in dbdma or some interaction between
     40 * IDE and sound.  However, this measure would deal with DEAD status if
     41 * it appeared elsewhere.
     42 */
     43static struct pmac_dbdma emergency_dbdma;
     44static int emergency_in_use;
     45
     46
     47/*
     48 * allocate DBDMA command arrays
     49 */
     50static int snd_pmac_dbdma_alloc(struct snd_pmac *chip, struct pmac_dbdma *rec, int size)
     51{
     52	unsigned int rsize = sizeof(struct dbdma_cmd) * (size + 1);
     53
     54	rec->space = dma_alloc_coherent(&chip->pdev->dev, rsize,
     55					&rec->dma_base, GFP_KERNEL);
     56	if (rec->space == NULL)
     57		return -ENOMEM;
     58	rec->size = size;
     59	memset(rec->space, 0, rsize);
     60	rec->cmds = (void __iomem *)DBDMA_ALIGN(rec->space);
     61	rec->addr = rec->dma_base + (unsigned long)((char *)rec->cmds - (char *)rec->space);
     62
     63	return 0;
     64}
     65
     66static void snd_pmac_dbdma_free(struct snd_pmac *chip, struct pmac_dbdma *rec)
     67{
     68	if (rec->space) {
     69		unsigned int rsize = sizeof(struct dbdma_cmd) * (rec->size + 1);
     70
     71		dma_free_coherent(&chip->pdev->dev, rsize, rec->space, rec->dma_base);
     72	}
     73}
     74
     75
     76/*
     77 * pcm stuff
     78 */
     79
     80/*
     81 * look up frequency table
     82 */
     83
     84unsigned int snd_pmac_rate_index(struct snd_pmac *chip, struct pmac_stream *rec, unsigned int rate)
     85{
     86	int i, ok, found;
     87
     88	ok = rec->cur_freqs;
     89	if (rate > chip->freq_table[0])
     90		return 0;
     91	found = 0;
     92	for (i = 0; i < chip->num_freqs; i++, ok >>= 1) {
     93		if (! (ok & 1)) continue;
     94		found = i;
     95		if (rate >= chip->freq_table[i])
     96			break;
     97	}
     98	return found;
     99}
    100
    101/*
    102 * check whether another stream is active
    103 */
    104static inline int another_stream(int stream)
    105{
    106	return (stream == SNDRV_PCM_STREAM_PLAYBACK) ?
    107		SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
    108}
    109
    110/*
    111 * get a stream of the opposite direction
    112 */
    113static struct pmac_stream *snd_pmac_get_stream(struct snd_pmac *chip, int stream)
    114{
    115	switch (stream) {
    116	case SNDRV_PCM_STREAM_PLAYBACK:
    117		return &chip->playback;
    118	case SNDRV_PCM_STREAM_CAPTURE:
    119		return &chip->capture;
    120	default:
    121		snd_BUG();
    122		return NULL;
    123	}
    124}
    125
    126/*
    127 * wait while run status is on
    128 */
    129static inline void
    130snd_pmac_wait_ack(struct pmac_stream *rec)
    131{
    132	int timeout = 50000;
    133	while ((in_le32(&rec->dma->status) & RUN) && timeout-- > 0)
    134		udelay(1);
    135}
    136
    137/*
    138 * set the format and rate to the chip.
    139 * call the lowlevel function if defined (e.g. for AWACS).
    140 */
    141static void snd_pmac_pcm_set_format(struct snd_pmac *chip)
    142{
    143	/* set up frequency and format */
    144	out_le32(&chip->awacs->control, chip->control_mask | (chip->rate_index << 8));
    145	out_le32(&chip->awacs->byteswap, chip->format == SNDRV_PCM_FORMAT_S16_LE ? 1 : 0);
    146	if (chip->set_format)
    147		chip->set_format(chip);
    148}
    149
    150/*
    151 * stop the DMA transfer
    152 */
    153static inline void snd_pmac_dma_stop(struct pmac_stream *rec)
    154{
    155	out_le32(&rec->dma->control, (RUN|WAKE|FLUSH|PAUSE) << 16);
    156	snd_pmac_wait_ack(rec);
    157}
    158
    159/*
    160 * set the command pointer address
    161 */
    162static inline void snd_pmac_dma_set_command(struct pmac_stream *rec, struct pmac_dbdma *cmd)
    163{
    164	out_le32(&rec->dma->cmdptr, cmd->addr);
    165}
    166
    167/*
    168 * start the DMA
    169 */
    170static inline void snd_pmac_dma_run(struct pmac_stream *rec, int status)
    171{
    172	out_le32(&rec->dma->control, status | (status << 16));
    173}
    174
    175
    176/*
    177 * prepare playback/capture stream
    178 */
    179static int snd_pmac_pcm_prepare(struct snd_pmac *chip, struct pmac_stream *rec, struct snd_pcm_substream *subs)
    180{
    181	int i;
    182	volatile struct dbdma_cmd __iomem *cp;
    183	struct snd_pcm_runtime *runtime = subs->runtime;
    184	int rate_index;
    185	long offset;
    186	struct pmac_stream *astr;
    187
    188	rec->dma_size = snd_pcm_lib_buffer_bytes(subs);
    189	rec->period_size = snd_pcm_lib_period_bytes(subs);
    190	rec->nperiods = rec->dma_size / rec->period_size;
    191	rec->cur_period = 0;
    192	rate_index = snd_pmac_rate_index(chip, rec, runtime->rate);
    193
    194	/* set up constraints */
    195	astr = snd_pmac_get_stream(chip, another_stream(rec->stream));
    196	if (! astr)
    197		return -EINVAL;
    198	astr->cur_freqs = 1 << rate_index;
    199	astr->cur_formats = 1 << runtime->format;
    200	chip->rate_index = rate_index;
    201	chip->format = runtime->format;
    202
    203	/* We really want to execute a DMA stop command, after the AWACS
    204	 * is initialized.
    205	 * For reasons I don't understand, it stops the hissing noise
    206	 * common to many PowerBook G3 systems and random noise otherwise
    207	 * captured on iBook2's about every third time. -ReneR
    208	 */
    209	spin_lock_irq(&chip->reg_lock);
    210	snd_pmac_dma_stop(rec);
    211	chip->extra_dma.cmds->command = cpu_to_le16(DBDMA_STOP);
    212	snd_pmac_dma_set_command(rec, &chip->extra_dma);
    213	snd_pmac_dma_run(rec, RUN);
    214	spin_unlock_irq(&chip->reg_lock);
    215	mdelay(5);
    216	spin_lock_irq(&chip->reg_lock);
    217	/* continuous DMA memory type doesn't provide the physical address,
    218	 * so we need to resolve the address here...
    219	 */
    220	offset = runtime->dma_addr;
    221	for (i = 0, cp = rec->cmd.cmds; i < rec->nperiods; i++, cp++) {
    222		cp->phy_addr = cpu_to_le32(offset);
    223		cp->req_count = cpu_to_le16(rec->period_size);
    224		/*cp->res_count = cpu_to_le16(0);*/
    225		cp->xfer_status = cpu_to_le16(0);
    226		offset += rec->period_size;
    227	}
    228	/* make loop */
    229	cp->command = cpu_to_le16(DBDMA_NOP | BR_ALWAYS);
    230	cp->cmd_dep = cpu_to_le32(rec->cmd.addr);
    231
    232	snd_pmac_dma_stop(rec);
    233	snd_pmac_dma_set_command(rec, &rec->cmd);
    234	spin_unlock_irq(&chip->reg_lock);
    235
    236	return 0;
    237}
    238
    239
    240/*
    241 * PCM trigger/stop
    242 */
    243static int snd_pmac_pcm_trigger(struct snd_pmac *chip, struct pmac_stream *rec,
    244				struct snd_pcm_substream *subs, int cmd)
    245{
    246	volatile struct dbdma_cmd __iomem *cp;
    247	int i, command;
    248
    249	switch (cmd) {
    250	case SNDRV_PCM_TRIGGER_START:
    251	case SNDRV_PCM_TRIGGER_RESUME:
    252		if (rec->running)
    253			return -EBUSY;
    254		command = (subs->stream == SNDRV_PCM_STREAM_PLAYBACK ?
    255			   OUTPUT_MORE : INPUT_MORE) + INTR_ALWAYS;
    256		spin_lock(&chip->reg_lock);
    257		snd_pmac_beep_stop(chip);
    258		snd_pmac_pcm_set_format(chip);
    259		for (i = 0, cp = rec->cmd.cmds; i < rec->nperiods; i++, cp++)
    260			out_le16(&cp->command, command);
    261		snd_pmac_dma_set_command(rec, &rec->cmd);
    262		(void)in_le32(&rec->dma->status);
    263		snd_pmac_dma_run(rec, RUN|WAKE);
    264		rec->running = 1;
    265		spin_unlock(&chip->reg_lock);
    266		break;
    267
    268	case SNDRV_PCM_TRIGGER_STOP:
    269	case SNDRV_PCM_TRIGGER_SUSPEND:
    270		spin_lock(&chip->reg_lock);
    271		rec->running = 0;
    272		/*printk(KERN_DEBUG "stopped!!\n");*/
    273		snd_pmac_dma_stop(rec);
    274		for (i = 0, cp = rec->cmd.cmds; i < rec->nperiods; i++, cp++)
    275			out_le16(&cp->command, DBDMA_STOP);
    276		spin_unlock(&chip->reg_lock);
    277		break;
    278
    279	default:
    280		return -EINVAL;
    281	}
    282
    283	return 0;
    284}
    285
    286/*
    287 * return the current pointer
    288 */
    289inline
    290static snd_pcm_uframes_t snd_pmac_pcm_pointer(struct snd_pmac *chip,
    291					      struct pmac_stream *rec,
    292					      struct snd_pcm_substream *subs)
    293{
    294	int count = 0;
    295
    296#if 1 /* hmm.. how can we get the current dma pointer?? */
    297	int stat;
    298	volatile struct dbdma_cmd __iomem *cp = &rec->cmd.cmds[rec->cur_period];
    299	stat = le16_to_cpu(cp->xfer_status);
    300	if (stat & (ACTIVE|DEAD)) {
    301		count = in_le16(&cp->res_count);
    302		if (count)
    303			count = rec->period_size - count;
    304	}
    305#endif
    306	count += rec->cur_period * rec->period_size;
    307	/*printk(KERN_DEBUG "pointer=%d\n", count);*/
    308	return bytes_to_frames(subs->runtime, count);
    309}
    310
    311/*
    312 * playback
    313 */
    314
    315static int snd_pmac_playback_prepare(struct snd_pcm_substream *subs)
    316{
    317	struct snd_pmac *chip = snd_pcm_substream_chip(subs);
    318	return snd_pmac_pcm_prepare(chip, &chip->playback, subs);
    319}
    320
    321static int snd_pmac_playback_trigger(struct snd_pcm_substream *subs,
    322				     int cmd)
    323{
    324	struct snd_pmac *chip = snd_pcm_substream_chip(subs);
    325	return snd_pmac_pcm_trigger(chip, &chip->playback, subs, cmd);
    326}
    327
    328static snd_pcm_uframes_t snd_pmac_playback_pointer(struct snd_pcm_substream *subs)
    329{
    330	struct snd_pmac *chip = snd_pcm_substream_chip(subs);
    331	return snd_pmac_pcm_pointer(chip, &chip->playback, subs);
    332}
    333
    334
    335/*
    336 * capture
    337 */
    338
    339static int snd_pmac_capture_prepare(struct snd_pcm_substream *subs)
    340{
    341	struct snd_pmac *chip = snd_pcm_substream_chip(subs);
    342	return snd_pmac_pcm_prepare(chip, &chip->capture, subs);
    343}
    344
    345static int snd_pmac_capture_trigger(struct snd_pcm_substream *subs,
    346				    int cmd)
    347{
    348	struct snd_pmac *chip = snd_pcm_substream_chip(subs);
    349	return snd_pmac_pcm_trigger(chip, &chip->capture, subs, cmd);
    350}
    351
    352static snd_pcm_uframes_t snd_pmac_capture_pointer(struct snd_pcm_substream *subs)
    353{
    354	struct snd_pmac *chip = snd_pcm_substream_chip(subs);
    355	return snd_pmac_pcm_pointer(chip, &chip->capture, subs);
    356}
    357
    358
    359/*
    360 * Handle DEAD DMA transfers:
    361 * if the TX status comes up "DEAD" - reported on some Power Computing machines
    362 * we need to re-start the dbdma - but from a different physical start address
    363 * and with a different transfer length.  It would get very messy to do this
    364 * with the normal dbdma_cmd blocks - we would have to re-write the buffer start
    365 * addresses each time.  So, we will keep a single dbdma_cmd block which can be
    366 * fiddled with.
    367 * When DEAD status is first reported the content of the faulted dbdma block is
    368 * copied into the emergency buffer and we note that the buffer is in use.
    369 * we then bump the start physical address by the amount that was successfully
    370 * output before it died.
    371 * On any subsequent DEAD result we just do the bump-ups (we know that we are
    372 * already using the emergency dbdma_cmd).
    373 * CHECK: this just tries to "do it".  It is possible that we should abandon
    374 * xfers when the number of residual bytes gets below a certain value - I can
    375 * see that this might cause a loop-forever if a too small transfer causes
    376 * DEAD status.  However this is a TODO for now - we'll see what gets reported.
    377 * When we get a successful transfer result with the emergency buffer we just
    378 * pretend that it completed using the original dmdma_cmd and carry on.  The
    379 * 'next_cmd' field will already point back to the original loop of blocks.
    380 */
    381static inline void snd_pmac_pcm_dead_xfer(struct pmac_stream *rec,
    382					  volatile struct dbdma_cmd __iomem *cp)
    383{
    384	unsigned short req, res ;
    385	unsigned int phy ;
    386
    387	/* printk(KERN_WARNING "snd-powermac: DMA died - patching it up!\n"); */
    388
    389	/* to clear DEAD status we must first clear RUN
    390	   set it to quiescent to be on the safe side */
    391	(void)in_le32(&rec->dma->status);
    392	out_le32(&rec->dma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
    393
    394	if (!emergency_in_use) { /* new problem */
    395		memcpy((void *)emergency_dbdma.cmds, (void *)cp,
    396		       sizeof(struct dbdma_cmd));
    397		emergency_in_use = 1;
    398		cp->xfer_status = cpu_to_le16(0);
    399		cp->req_count = cpu_to_le16(rec->period_size);
    400		cp = emergency_dbdma.cmds;
    401	}
    402
    403	/* now bump the values to reflect the amount
    404	   we haven't yet shifted */
    405	req = le16_to_cpu(cp->req_count);
    406	res = le16_to_cpu(cp->res_count);
    407	phy = le32_to_cpu(cp->phy_addr);
    408	phy += (req - res);
    409	cp->req_count = cpu_to_le16(res);
    410	cp->res_count = cpu_to_le16(0);
    411	cp->xfer_status = cpu_to_le16(0);
    412	cp->phy_addr = cpu_to_le32(phy);
    413
    414	cp->cmd_dep = cpu_to_le32(rec->cmd.addr
    415		+ sizeof(struct dbdma_cmd)*((rec->cur_period+1)%rec->nperiods));
    416
    417	cp->command = cpu_to_le16(OUTPUT_MORE | BR_ALWAYS | INTR_ALWAYS);
    418
    419	/* point at our patched up command block */
    420	out_le32(&rec->dma->cmdptr, emergency_dbdma.addr);
    421
    422	/* we must re-start the controller */
    423	(void)in_le32(&rec->dma->status);
    424	/* should complete clearing the DEAD status */
    425	out_le32(&rec->dma->control, ((RUN|WAKE) << 16) + (RUN|WAKE));
    426}
    427
    428/*
    429 * update playback/capture pointer from interrupts
    430 */
    431static void snd_pmac_pcm_update(struct snd_pmac *chip, struct pmac_stream *rec)
    432{
    433	volatile struct dbdma_cmd __iomem *cp;
    434	int c;
    435	int stat;
    436
    437	spin_lock(&chip->reg_lock);
    438	if (rec->running) {
    439		for (c = 0; c < rec->nperiods; c++) { /* at most all fragments */
    440
    441			if (emergency_in_use)   /* already using DEAD xfer? */
    442				cp = emergency_dbdma.cmds;
    443			else
    444				cp = &rec->cmd.cmds[rec->cur_period];
    445
    446			stat = le16_to_cpu(cp->xfer_status);
    447
    448			if (stat & DEAD) {
    449				snd_pmac_pcm_dead_xfer(rec, cp);
    450				break; /* this block is still going */
    451			}
    452
    453			if (emergency_in_use)
    454				emergency_in_use = 0 ; /* done that */
    455
    456			if (! (stat & ACTIVE))
    457				break;
    458
    459			/*printk(KERN_DEBUG "update frag %d\n", rec->cur_period);*/
    460			cp->xfer_status = cpu_to_le16(0);
    461			cp->req_count = cpu_to_le16(rec->period_size);
    462			/*cp->res_count = cpu_to_le16(0);*/
    463			rec->cur_period++;
    464			if (rec->cur_period >= rec->nperiods) {
    465				rec->cur_period = 0;
    466			}
    467
    468			spin_unlock(&chip->reg_lock);
    469			snd_pcm_period_elapsed(rec->substream);
    470			spin_lock(&chip->reg_lock);
    471		}
    472	}
    473	spin_unlock(&chip->reg_lock);
    474}
    475
    476
    477/*
    478 * hw info
    479 */
    480
    481static const struct snd_pcm_hardware snd_pmac_playback =
    482{
    483	.info =			(SNDRV_PCM_INFO_INTERLEAVED |
    484				 SNDRV_PCM_INFO_MMAP |
    485				 SNDRV_PCM_INFO_MMAP_VALID |
    486				 SNDRV_PCM_INFO_RESUME),
    487	.formats =		SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_S16_LE,
    488	.rates =		SNDRV_PCM_RATE_8000_44100,
    489	.rate_min =		7350,
    490	.rate_max =		44100,
    491	.channels_min =		2,
    492	.channels_max =		2,
    493	.buffer_bytes_max =	131072,
    494	.period_bytes_min =	256,
    495	.period_bytes_max =	16384,
    496	.periods_min =		3,
    497	.periods_max =		PMAC_MAX_FRAGS,
    498};
    499
    500static const struct snd_pcm_hardware snd_pmac_capture =
    501{
    502	.info =			(SNDRV_PCM_INFO_INTERLEAVED |
    503				 SNDRV_PCM_INFO_MMAP |
    504				 SNDRV_PCM_INFO_MMAP_VALID |
    505				 SNDRV_PCM_INFO_RESUME),
    506	.formats =		SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_S16_LE,
    507	.rates =		SNDRV_PCM_RATE_8000_44100,
    508	.rate_min =		7350,
    509	.rate_max =		44100,
    510	.channels_min =		2,
    511	.channels_max =		2,
    512	.buffer_bytes_max =	131072,
    513	.period_bytes_min =	256,
    514	.period_bytes_max =	16384,
    515	.periods_min =		3,
    516	.periods_max =		PMAC_MAX_FRAGS,
    517};
    518
    519
    520#if 0 // NYI
    521static int snd_pmac_hw_rule_rate(struct snd_pcm_hw_params *params,
    522				 struct snd_pcm_hw_rule *rule)
    523{
    524	struct snd_pmac *chip = rule->private;
    525	struct pmac_stream *rec = snd_pmac_get_stream(chip, rule->deps[0]);
    526	int i, freq_table[8], num_freqs;
    527
    528	if (! rec)
    529		return -EINVAL;
    530	num_freqs = 0;
    531	for (i = chip->num_freqs - 1; i >= 0; i--) {
    532		if (rec->cur_freqs & (1 << i))
    533			freq_table[num_freqs++] = chip->freq_table[i];
    534	}
    535
    536	return snd_interval_list(hw_param_interval(params, rule->var),
    537				 num_freqs, freq_table, 0);
    538}
    539
    540static int snd_pmac_hw_rule_format(struct snd_pcm_hw_params *params,
    541				   struct snd_pcm_hw_rule *rule)
    542{
    543	struct snd_pmac *chip = rule->private;
    544	struct pmac_stream *rec = snd_pmac_get_stream(chip, rule->deps[0]);
    545
    546	if (! rec)
    547		return -EINVAL;
    548	return snd_mask_refine_set(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
    549				   rec->cur_formats);
    550}
    551#endif // NYI
    552
    553static int snd_pmac_pcm_open(struct snd_pmac *chip, struct pmac_stream *rec,
    554			     struct snd_pcm_substream *subs)
    555{
    556	struct snd_pcm_runtime *runtime = subs->runtime;
    557	int i;
    558
    559	/* look up frequency table and fill bit mask */
    560	runtime->hw.rates = 0;
    561	for (i = 0; i < chip->num_freqs; i++)
    562		if (chip->freqs_ok & (1 << i))
    563			runtime->hw.rates |=
    564				snd_pcm_rate_to_rate_bit(chip->freq_table[i]);
    565
    566	/* check for minimum and maximum rates */
    567	for (i = 0; i < chip->num_freqs; i++) {
    568		if (chip->freqs_ok & (1 << i)) {
    569			runtime->hw.rate_max = chip->freq_table[i];
    570			break;
    571		}
    572	}
    573	for (i = chip->num_freqs - 1; i >= 0; i--) {
    574		if (chip->freqs_ok & (1 << i)) {
    575			runtime->hw.rate_min = chip->freq_table[i];
    576			break;
    577		}
    578	}
    579	runtime->hw.formats = chip->formats_ok;
    580	if (chip->can_capture) {
    581		if (! chip->can_duplex)
    582			runtime->hw.info |= SNDRV_PCM_INFO_HALF_DUPLEX;
    583		runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX;
    584	}
    585	runtime->private_data = rec;
    586	rec->substream = subs;
    587
    588#if 0 /* FIXME: still under development.. */
    589	snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
    590			    snd_pmac_hw_rule_rate, chip, rec->stream, -1);
    591	snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT,
    592			    snd_pmac_hw_rule_format, chip, rec->stream, -1);
    593#endif
    594
    595	runtime->hw.periods_max = rec->cmd.size - 1;
    596
    597	/* constraints to fix choppy sound */
    598	snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
    599	return 0;
    600}
    601
    602static int snd_pmac_pcm_close(struct snd_pmac *chip, struct pmac_stream *rec,
    603			      struct snd_pcm_substream *subs)
    604{
    605	struct pmac_stream *astr;
    606
    607	snd_pmac_dma_stop(rec);
    608
    609	astr = snd_pmac_get_stream(chip, another_stream(rec->stream));
    610	if (! astr)
    611		return -EINVAL;
    612
    613	/* reset constraints */
    614	astr->cur_freqs = chip->freqs_ok;
    615	astr->cur_formats = chip->formats_ok;
    616
    617	return 0;
    618}
    619
    620static int snd_pmac_playback_open(struct snd_pcm_substream *subs)
    621{
    622	struct snd_pmac *chip = snd_pcm_substream_chip(subs);
    623
    624	subs->runtime->hw = snd_pmac_playback;
    625	return snd_pmac_pcm_open(chip, &chip->playback, subs);
    626}
    627
    628static int snd_pmac_capture_open(struct snd_pcm_substream *subs)
    629{
    630	struct snd_pmac *chip = snd_pcm_substream_chip(subs);
    631
    632	subs->runtime->hw = snd_pmac_capture;
    633	return snd_pmac_pcm_open(chip, &chip->capture, subs);
    634}
    635
    636static int snd_pmac_playback_close(struct snd_pcm_substream *subs)
    637{
    638	struct snd_pmac *chip = snd_pcm_substream_chip(subs);
    639
    640	return snd_pmac_pcm_close(chip, &chip->playback, subs);
    641}
    642
    643static int snd_pmac_capture_close(struct snd_pcm_substream *subs)
    644{
    645	struct snd_pmac *chip = snd_pcm_substream_chip(subs);
    646
    647	return snd_pmac_pcm_close(chip, &chip->capture, subs);
    648}
    649
    650/*
    651 */
    652
    653static const struct snd_pcm_ops snd_pmac_playback_ops = {
    654	.open =		snd_pmac_playback_open,
    655	.close =	snd_pmac_playback_close,
    656	.prepare =	snd_pmac_playback_prepare,
    657	.trigger =	snd_pmac_playback_trigger,
    658	.pointer =	snd_pmac_playback_pointer,
    659};
    660
    661static const struct snd_pcm_ops snd_pmac_capture_ops = {
    662	.open =		snd_pmac_capture_open,
    663	.close =	snd_pmac_capture_close,
    664	.prepare =	snd_pmac_capture_prepare,
    665	.trigger =	snd_pmac_capture_trigger,
    666	.pointer =	snd_pmac_capture_pointer,
    667};
    668
    669int snd_pmac_pcm_new(struct snd_pmac *chip)
    670{
    671	struct snd_pcm *pcm;
    672	int err;
    673	int num_captures = 1;
    674
    675	if (! chip->can_capture)
    676		num_captures = 0;
    677	err = snd_pcm_new(chip->card, chip->card->driver, 0, 1, num_captures, &pcm);
    678	if (err < 0)
    679		return err;
    680
    681	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_pmac_playback_ops);
    682	if (chip->can_capture)
    683		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_pmac_capture_ops);
    684
    685	pcm->private_data = chip;
    686	pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
    687	strcpy(pcm->name, chip->card->shortname);
    688	chip->pcm = pcm;
    689
    690	chip->formats_ok = SNDRV_PCM_FMTBIT_S16_BE;
    691	if (chip->can_byte_swap)
    692		chip->formats_ok |= SNDRV_PCM_FMTBIT_S16_LE;
    693
    694	chip->playback.cur_formats = chip->formats_ok;
    695	chip->capture.cur_formats = chip->formats_ok;
    696	chip->playback.cur_freqs = chip->freqs_ok;
    697	chip->capture.cur_freqs = chip->freqs_ok;
    698
    699	/* preallocate 64k buffer */
    700	snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
    701				       &chip->pdev->dev,
    702				       64 * 1024, 64 * 1024);
    703
    704	return 0;
    705}
    706
    707
    708static void snd_pmac_dbdma_reset(struct snd_pmac *chip)
    709{
    710	out_le32(&chip->playback.dma->control, (RUN|PAUSE|FLUSH|WAKE|DEAD) << 16);
    711	snd_pmac_wait_ack(&chip->playback);
    712	out_le32(&chip->capture.dma->control, (RUN|PAUSE|FLUSH|WAKE|DEAD) << 16);
    713	snd_pmac_wait_ack(&chip->capture);
    714}
    715
    716
    717/*
    718 * handling beep
    719 */
    720void snd_pmac_beep_dma_start(struct snd_pmac *chip, int bytes, unsigned long addr, int speed)
    721{
    722	struct pmac_stream *rec = &chip->playback;
    723
    724	snd_pmac_dma_stop(rec);
    725	chip->extra_dma.cmds->req_count = cpu_to_le16(bytes);
    726	chip->extra_dma.cmds->xfer_status = cpu_to_le16(0);
    727	chip->extra_dma.cmds->cmd_dep = cpu_to_le32(chip->extra_dma.addr);
    728	chip->extra_dma.cmds->phy_addr = cpu_to_le32(addr);
    729	chip->extra_dma.cmds->command = cpu_to_le16(OUTPUT_MORE | BR_ALWAYS);
    730	out_le32(&chip->awacs->control,
    731		 (in_le32(&chip->awacs->control) & ~0x1f00)
    732		 | (speed << 8));
    733	out_le32(&chip->awacs->byteswap, 0);
    734	snd_pmac_dma_set_command(rec, &chip->extra_dma);
    735	snd_pmac_dma_run(rec, RUN);
    736}
    737
    738void snd_pmac_beep_dma_stop(struct snd_pmac *chip)
    739{
    740	snd_pmac_dma_stop(&chip->playback);
    741	chip->extra_dma.cmds->command = cpu_to_le16(DBDMA_STOP);
    742	snd_pmac_pcm_set_format(chip); /* reset format */
    743}
    744
    745
    746/*
    747 * interrupt handlers
    748 */
    749static irqreturn_t
    750snd_pmac_tx_intr(int irq, void *devid)
    751{
    752	struct snd_pmac *chip = devid;
    753	snd_pmac_pcm_update(chip, &chip->playback);
    754	return IRQ_HANDLED;
    755}
    756
    757
    758static irqreturn_t
    759snd_pmac_rx_intr(int irq, void *devid)
    760{
    761	struct snd_pmac *chip = devid;
    762	snd_pmac_pcm_update(chip, &chip->capture);
    763	return IRQ_HANDLED;
    764}
    765
    766
    767static irqreturn_t
    768snd_pmac_ctrl_intr(int irq, void *devid)
    769{
    770	struct snd_pmac *chip = devid;
    771	int ctrl = in_le32(&chip->awacs->control);
    772
    773	/*printk(KERN_DEBUG "pmac: control interrupt.. 0x%x\n", ctrl);*/
    774	if (ctrl & MASK_PORTCHG) {
    775		/* do something when headphone is plugged/unplugged? */
    776		if (chip->update_automute)
    777			chip->update_automute(chip, 1);
    778	}
    779	if (ctrl & MASK_CNTLERR) {
    780		int err = (in_le32(&chip->awacs->codec_stat) & MASK_ERRCODE) >> 16;
    781		if (err && chip->model <= PMAC_SCREAMER)
    782			snd_printk(KERN_DEBUG "error %x\n", err);
    783	}
    784	/* Writing 1s to the CNTLERR and PORTCHG bits clears them... */
    785	out_le32(&chip->awacs->control, ctrl);
    786	return IRQ_HANDLED;
    787}
    788
    789
    790/*
    791 * a wrapper to feature call for compatibility
    792 */
    793static void snd_pmac_sound_feature(struct snd_pmac *chip, int enable)
    794{
    795	if (ppc_md.feature_call)
    796		ppc_md.feature_call(PMAC_FTR_SOUND_CHIP_ENABLE, chip->node, 0, enable);
    797}
    798
    799/*
    800 * release resources
    801 */
    802
    803static int snd_pmac_free(struct snd_pmac *chip)
    804{
    805	/* stop sounds */
    806	if (chip->initialized) {
    807		snd_pmac_dbdma_reset(chip);
    808		/* disable interrupts from awacs interface */
    809		out_le32(&chip->awacs->control, in_le32(&chip->awacs->control) & 0xfff);
    810	}
    811
    812	if (chip->node)
    813		snd_pmac_sound_feature(chip, 0);
    814
    815	/* clean up mixer if any */
    816	if (chip->mixer_free)
    817		chip->mixer_free(chip);
    818
    819	snd_pmac_detach_beep(chip);
    820
    821	/* release resources */
    822	if (chip->irq >= 0)
    823		free_irq(chip->irq, (void*)chip);
    824	if (chip->tx_irq >= 0)
    825		free_irq(chip->tx_irq, (void*)chip);
    826	if (chip->rx_irq >= 0)
    827		free_irq(chip->rx_irq, (void*)chip);
    828	snd_pmac_dbdma_free(chip, &chip->playback.cmd);
    829	snd_pmac_dbdma_free(chip, &chip->capture.cmd);
    830	snd_pmac_dbdma_free(chip, &chip->extra_dma);
    831	snd_pmac_dbdma_free(chip, &emergency_dbdma);
    832	iounmap(chip->macio_base);
    833	iounmap(chip->latch_base);
    834	iounmap(chip->awacs);
    835	iounmap(chip->playback.dma);
    836	iounmap(chip->capture.dma);
    837
    838	if (chip->node) {
    839		int i;
    840		for (i = 0; i < 3; i++) {
    841			if (chip->requested & (1 << i))
    842				release_mem_region(chip->rsrc[i].start,
    843						   resource_size(&chip->rsrc[i]));
    844		}
    845	}
    846
    847	pci_dev_put(chip->pdev);
    848	of_node_put(chip->node);
    849	kfree(chip);
    850	return 0;
    851}
    852
    853
    854/*
    855 * free the device
    856 */
    857static int snd_pmac_dev_free(struct snd_device *device)
    858{
    859	struct snd_pmac *chip = device->device_data;
    860	return snd_pmac_free(chip);
    861}
    862
    863
    864/*
    865 * check the machine support byteswap (little-endian)
    866 */
    867
    868static void detect_byte_swap(struct snd_pmac *chip)
    869{
    870	struct device_node *mio;
    871
    872	/* if seems that Keylargo can't byte-swap  */
    873	for (mio = chip->node->parent; mio; mio = mio->parent) {
    874		if (of_node_name_eq(mio, "mac-io")) {
    875			if (of_device_is_compatible(mio, "Keylargo"))
    876				chip->can_byte_swap = 0;
    877			break;
    878		}
    879	}
    880
    881	/* it seems the Pismo & iBook can't byte-swap in hardware. */
    882	if (of_machine_is_compatible("PowerBook3,1") ||
    883	    of_machine_is_compatible("PowerBook2,1"))
    884		chip->can_byte_swap = 0 ;
    885
    886	if (of_machine_is_compatible("PowerBook2,1"))
    887		chip->can_duplex = 0;
    888}
    889
    890
    891/*
    892 * detect a sound chip
    893 */
    894static int snd_pmac_detect(struct snd_pmac *chip)
    895{
    896	struct device_node *sound;
    897	struct device_node *dn;
    898	const unsigned int *prop;
    899	unsigned int l;
    900	struct macio_chip* macio;
    901
    902	if (!machine_is(powermac))
    903		return -ENODEV;
    904
    905	chip->subframe = 0;
    906	chip->revision = 0;
    907	chip->freqs_ok = 0xff; /* all ok */
    908	chip->model = PMAC_AWACS;
    909	chip->can_byte_swap = 1;
    910	chip->can_duplex = 1;
    911	chip->can_capture = 1;
    912	chip->num_freqs = ARRAY_SIZE(awacs_freqs);
    913	chip->freq_table = awacs_freqs;
    914	chip->pdev = NULL;
    915
    916	chip->control_mask = MASK_IEPC | MASK_IEE | 0x11; /* default */
    917
    918	/* check machine type */
    919	if (of_machine_is_compatible("AAPL,3400/2400")
    920	    || of_machine_is_compatible("AAPL,3500"))
    921		chip->is_pbook_3400 = 1;
    922	else if (of_machine_is_compatible("PowerBook1,1")
    923		 || of_machine_is_compatible("AAPL,PowerBook1998"))
    924		chip->is_pbook_G3 = 1;
    925	chip->node = of_find_node_by_name(NULL, "awacs");
    926	sound = of_node_get(chip->node);
    927
    928	/*
    929	 * powermac G3 models have a node called "davbus"
    930	 * with a child called "sound".
    931	 */
    932	if (!chip->node)
    933		chip->node = of_find_node_by_name(NULL, "davbus");
    934	/*
    935	 * if we didn't find a davbus device, try 'i2s-a' since
    936	 * this seems to be what iBooks have
    937	 */
    938	if (! chip->node) {
    939		chip->node = of_find_node_by_name(NULL, "i2s-a");
    940		if (chip->node && chip->node->parent &&
    941		    chip->node->parent->parent) {
    942			if (of_device_is_compatible(chip->node->parent->parent,
    943						 "K2-Keylargo"))
    944				chip->is_k2 = 1;
    945		}
    946	}
    947	if (! chip->node)
    948		return -ENODEV;
    949
    950	if (!sound) {
    951		for_each_node_by_name(sound, "sound")
    952			if (sound->parent == chip->node)
    953				break;
    954	}
    955	if (! sound) {
    956		of_node_put(chip->node);
    957		chip->node = NULL;
    958		return -ENODEV;
    959	}
    960	prop = of_get_property(sound, "sub-frame", NULL);
    961	if (prop && *prop < 16)
    962		chip->subframe = *prop;
    963	prop = of_get_property(sound, "layout-id", NULL);
    964	if (prop) {
    965		/* partly deprecate snd-powermac, for those machines
    966		 * that have a layout-id property for now */
    967		printk(KERN_INFO "snd-powermac no longer handles any "
    968				 "machines with a layout-id property "
    969				 "in the device-tree, use snd-aoa.\n");
    970		of_node_put(sound);
    971		of_node_put(chip->node);
    972		chip->node = NULL;
    973		return -ENODEV;
    974	}
    975	/* This should be verified on older screamers */
    976	if (of_device_is_compatible(sound, "screamer")) {
    977		chip->model = PMAC_SCREAMER;
    978		// chip->can_byte_swap = 0; /* FIXME: check this */
    979	}
    980	if (of_device_is_compatible(sound, "burgundy")) {
    981		chip->model = PMAC_BURGUNDY;
    982		chip->control_mask = MASK_IEPC | 0x11; /* disable IEE */
    983	}
    984	if (of_device_is_compatible(sound, "daca")) {
    985		chip->model = PMAC_DACA;
    986		chip->can_capture = 0;  /* no capture */
    987		chip->can_duplex = 0;
    988		// chip->can_byte_swap = 0; /* FIXME: check this */
    989		chip->control_mask = MASK_IEPC | 0x11; /* disable IEE */
    990	}
    991	if (of_device_is_compatible(sound, "tumbler")) {
    992		chip->model = PMAC_TUMBLER;
    993		chip->can_capture = of_machine_is_compatible("PowerMac4,2")
    994				|| of_machine_is_compatible("PowerBook3,2")
    995				|| of_machine_is_compatible("PowerBook3,3")
    996				|| of_machine_is_compatible("PowerBook4,1")
    997				|| of_machine_is_compatible("PowerBook4,2")
    998				|| of_machine_is_compatible("PowerBook4,3");
    999		chip->can_duplex = 0;
   1000		// chip->can_byte_swap = 0; /* FIXME: check this */
   1001		chip->num_freqs = ARRAY_SIZE(tumbler_freqs);
   1002		chip->freq_table = tumbler_freqs;
   1003		chip->control_mask = MASK_IEPC | 0x11; /* disable IEE */
   1004	}
   1005	if (of_device_is_compatible(sound, "snapper")) {
   1006		chip->model = PMAC_SNAPPER;
   1007		// chip->can_byte_swap = 0; /* FIXME: check this */
   1008		chip->num_freqs = ARRAY_SIZE(tumbler_freqs);
   1009		chip->freq_table = tumbler_freqs;
   1010		chip->control_mask = MASK_IEPC | 0x11; /* disable IEE */
   1011	}
   1012	prop = of_get_property(sound, "device-id", NULL);
   1013	if (prop)
   1014		chip->device_id = *prop;
   1015	dn = of_find_node_by_name(NULL, "perch");
   1016	chip->has_iic = (dn != NULL);
   1017	of_node_put(dn);
   1018
   1019	/* We need the PCI device for DMA allocations, let's use a crude method
   1020	 * for now ...
   1021	 */
   1022	macio = macio_find(chip->node, macio_unknown);
   1023	if (macio == NULL)
   1024		printk(KERN_WARNING "snd-powermac: can't locate macio !\n");
   1025	else {
   1026		struct pci_dev *pdev = NULL;
   1027
   1028		for_each_pci_dev(pdev) {
   1029			struct device_node *np = pci_device_to_OF_node(pdev);
   1030			if (np && np == macio->of_node) {
   1031				chip->pdev = pdev;
   1032				break;
   1033			}
   1034		}
   1035	}
   1036	if (chip->pdev == NULL)
   1037		printk(KERN_WARNING "snd-powermac: can't locate macio PCI"
   1038		       " device !\n");
   1039
   1040	detect_byte_swap(chip);
   1041
   1042	/* look for a property saying what sample rates
   1043	   are available */
   1044	prop = of_get_property(sound, "sample-rates", &l);
   1045	if (! prop)
   1046		prop = of_get_property(sound, "output-frame-rates", &l);
   1047	if (prop) {
   1048		int i;
   1049		chip->freqs_ok = 0;
   1050		for (l /= sizeof(int); l > 0; --l) {
   1051			unsigned int r = *prop++;
   1052			/* Apple 'Fixed' format */
   1053			if (r >= 0x10000)
   1054				r >>= 16;
   1055			for (i = 0; i < chip->num_freqs; ++i) {
   1056				if (r == chip->freq_table[i]) {
   1057					chip->freqs_ok |= (1 << i);
   1058					break;
   1059				}
   1060			}
   1061		}
   1062	} else {
   1063		/* assume only 44.1khz */
   1064		chip->freqs_ok = 1;
   1065	}
   1066
   1067	of_node_put(sound);
   1068	return 0;
   1069}
   1070
   1071#ifdef PMAC_SUPPORT_AUTOMUTE
   1072/*
   1073 * auto-mute
   1074 */
   1075static int pmac_auto_mute_get(struct snd_kcontrol *kcontrol,
   1076			      struct snd_ctl_elem_value *ucontrol)
   1077{
   1078	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
   1079	ucontrol->value.integer.value[0] = chip->auto_mute;
   1080	return 0;
   1081}
   1082
   1083static int pmac_auto_mute_put(struct snd_kcontrol *kcontrol,
   1084			      struct snd_ctl_elem_value *ucontrol)
   1085{
   1086	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
   1087	if (ucontrol->value.integer.value[0] != chip->auto_mute) {
   1088		chip->auto_mute = !!ucontrol->value.integer.value[0];
   1089		if (chip->update_automute)
   1090			chip->update_automute(chip, 1);
   1091		return 1;
   1092	}
   1093	return 0;
   1094}
   1095
   1096static int pmac_hp_detect_get(struct snd_kcontrol *kcontrol,
   1097			      struct snd_ctl_elem_value *ucontrol)
   1098{
   1099	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
   1100	if (chip->detect_headphone)
   1101		ucontrol->value.integer.value[0] = chip->detect_headphone(chip);
   1102	else
   1103		ucontrol->value.integer.value[0] = 0;
   1104	return 0;
   1105}
   1106
   1107static const struct snd_kcontrol_new auto_mute_controls[] = {
   1108	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
   1109	  .name = "Auto Mute Switch",
   1110	  .info = snd_pmac_boolean_mono_info,
   1111	  .get = pmac_auto_mute_get,
   1112	  .put = pmac_auto_mute_put,
   1113	},
   1114	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
   1115	  .name = "Headphone Detection",
   1116	  .access = SNDRV_CTL_ELEM_ACCESS_READ,
   1117	  .info = snd_pmac_boolean_mono_info,
   1118	  .get = pmac_hp_detect_get,
   1119	},
   1120};
   1121
   1122int snd_pmac_add_automute(struct snd_pmac *chip)
   1123{
   1124	int err;
   1125	chip->auto_mute = 1;
   1126	err = snd_ctl_add(chip->card, snd_ctl_new1(&auto_mute_controls[0], chip));
   1127	if (err < 0) {
   1128		printk(KERN_ERR "snd-powermac: Failed to add automute control\n");
   1129		return err;
   1130	}
   1131	chip->hp_detect_ctl = snd_ctl_new1(&auto_mute_controls[1], chip);
   1132	return snd_ctl_add(chip->card, chip->hp_detect_ctl);
   1133}
   1134#endif /* PMAC_SUPPORT_AUTOMUTE */
   1135
   1136/*
   1137 * create and detect a pmac chip record
   1138 */
   1139int snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return)
   1140{
   1141	struct snd_pmac *chip;
   1142	struct device_node *np;
   1143	int i, err;
   1144	unsigned int irq;
   1145	unsigned long ctrl_addr, txdma_addr, rxdma_addr;
   1146	static const struct snd_device_ops ops = {
   1147		.dev_free =	snd_pmac_dev_free,
   1148	};
   1149
   1150	*chip_return = NULL;
   1151
   1152	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
   1153	if (chip == NULL)
   1154		return -ENOMEM;
   1155	chip->card = card;
   1156
   1157	spin_lock_init(&chip->reg_lock);
   1158	chip->irq = chip->tx_irq = chip->rx_irq = -1;
   1159
   1160	chip->playback.stream = SNDRV_PCM_STREAM_PLAYBACK;
   1161	chip->capture.stream = SNDRV_PCM_STREAM_CAPTURE;
   1162
   1163	err = snd_pmac_detect(chip);
   1164	if (err < 0)
   1165		goto __error;
   1166
   1167	if (snd_pmac_dbdma_alloc(chip, &chip->playback.cmd, PMAC_MAX_FRAGS + 1) < 0 ||
   1168	    snd_pmac_dbdma_alloc(chip, &chip->capture.cmd, PMAC_MAX_FRAGS + 1) < 0 ||
   1169	    snd_pmac_dbdma_alloc(chip, &chip->extra_dma, 2) < 0 ||
   1170	    snd_pmac_dbdma_alloc(chip, &emergency_dbdma, 2) < 0) {
   1171		err = -ENOMEM;
   1172		goto __error;
   1173	}
   1174
   1175	np = chip->node;
   1176	chip->requested = 0;
   1177	if (chip->is_k2) {
   1178		static const char * const rnames[] = {
   1179			"Sound Control", "Sound DMA" };
   1180		for (i = 0; i < 2; i ++) {
   1181			if (of_address_to_resource(np->parent, i,
   1182						   &chip->rsrc[i])) {
   1183				printk(KERN_ERR "snd: can't translate rsrc "
   1184				       " %d (%s)\n", i, rnames[i]);
   1185				err = -ENODEV;
   1186				goto __error;
   1187			}
   1188			if (request_mem_region(chip->rsrc[i].start,
   1189					       resource_size(&chip->rsrc[i]),
   1190					       rnames[i]) == NULL) {
   1191				printk(KERN_ERR "snd: can't request rsrc "
   1192				       " %d (%s: %pR)\n",
   1193				       i, rnames[i], &chip->rsrc[i]);
   1194				err = -ENODEV;
   1195				goto __error;
   1196			}
   1197			chip->requested |= (1 << i);
   1198		}
   1199		ctrl_addr = chip->rsrc[0].start;
   1200		txdma_addr = chip->rsrc[1].start;
   1201		rxdma_addr = txdma_addr + 0x100;
   1202	} else {
   1203		static const char * const rnames[] = {
   1204			"Sound Control", "Sound Tx DMA", "Sound Rx DMA" };
   1205		for (i = 0; i < 3; i ++) {
   1206			if (of_address_to_resource(np, i,
   1207						   &chip->rsrc[i])) {
   1208				printk(KERN_ERR "snd: can't translate rsrc "
   1209				       " %d (%s)\n", i, rnames[i]);
   1210				err = -ENODEV;
   1211				goto __error;
   1212			}
   1213			if (request_mem_region(chip->rsrc[i].start,
   1214					       resource_size(&chip->rsrc[i]),
   1215					       rnames[i]) == NULL) {
   1216				printk(KERN_ERR "snd: can't request rsrc "
   1217				       " %d (%s: %pR)\n",
   1218				       i, rnames[i], &chip->rsrc[i]);
   1219				err = -ENODEV;
   1220				goto __error;
   1221			}
   1222			chip->requested |= (1 << i);
   1223		}
   1224		ctrl_addr = chip->rsrc[0].start;
   1225		txdma_addr = chip->rsrc[1].start;
   1226		rxdma_addr = chip->rsrc[2].start;
   1227	}
   1228
   1229	chip->awacs = ioremap(ctrl_addr, 0x1000);
   1230	chip->playback.dma = ioremap(txdma_addr, 0x100);
   1231	chip->capture.dma = ioremap(rxdma_addr, 0x100);
   1232	if (chip->model <= PMAC_BURGUNDY) {
   1233		irq = irq_of_parse_and_map(np, 0);
   1234		if (request_irq(irq, snd_pmac_ctrl_intr, 0,
   1235				"PMac", (void*)chip)) {
   1236			snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n",
   1237				   irq);
   1238			err = -EBUSY;
   1239			goto __error;
   1240		}
   1241		chip->irq = irq;
   1242	}
   1243	irq = irq_of_parse_and_map(np, 1);
   1244	if (request_irq(irq, snd_pmac_tx_intr, 0, "PMac Output", (void*)chip)){
   1245		snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", irq);
   1246		err = -EBUSY;
   1247		goto __error;
   1248	}
   1249	chip->tx_irq = irq;
   1250	irq = irq_of_parse_and_map(np, 2);
   1251	if (request_irq(irq, snd_pmac_rx_intr, 0, "PMac Input", (void*)chip)) {
   1252		snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", irq);
   1253		err = -EBUSY;
   1254		goto __error;
   1255	}
   1256	chip->rx_irq = irq;
   1257
   1258	snd_pmac_sound_feature(chip, 1);
   1259
   1260	/* reset & enable interrupts */
   1261	if (chip->model <= PMAC_BURGUNDY)
   1262		out_le32(&chip->awacs->control, chip->control_mask);
   1263
   1264	/* Powerbooks have odd ways of enabling inputs such as
   1265	   an expansion-bay CD or sound from an internal modem
   1266	   or a PC-card modem. */
   1267	if (chip->is_pbook_3400) {
   1268		/* Enable CD and PC-card sound inputs. */
   1269		/* This is done by reading from address
   1270		 * f301a000, + 0x10 to enable the expansion-bay
   1271		 * CD sound input, + 0x80 to enable the PC-card
   1272		 * sound input.  The 0x100 enables the SCSI bus
   1273		 * terminator power.
   1274		 */
   1275		chip->latch_base = ioremap (0xf301a000, 0x1000);
   1276		in_8(chip->latch_base + 0x190);
   1277	} else if (chip->is_pbook_G3) {
   1278		struct device_node* mio;
   1279		for (mio = chip->node->parent; mio; mio = mio->parent) {
   1280			if (of_node_name_eq(mio, "mac-io")) {
   1281				struct resource r;
   1282				if (of_address_to_resource(mio, 0, &r) == 0)
   1283					chip->macio_base =
   1284						ioremap(r.start, 0x40);
   1285				break;
   1286			}
   1287		}
   1288		/* Enable CD sound input. */
   1289		/* The relevant bits for writing to this byte are 0x8f.
   1290		 * I haven't found out what the 0x80 bit does.
   1291		 * For the 0xf bits, writing 3 or 7 enables the CD
   1292		 * input, any other value disables it.  Values
   1293		 * 1, 3, 5, 7 enable the microphone.  Values 0, 2,
   1294		 * 4, 6, 8 - f enable the input from the modem.
   1295		 */
   1296		if (chip->macio_base)
   1297			out_8(chip->macio_base + 0x37, 3);
   1298	}
   1299
   1300	/* Reset dbdma channels */
   1301	snd_pmac_dbdma_reset(chip);
   1302
   1303	err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
   1304	if (err < 0)
   1305		goto __error;
   1306
   1307	*chip_return = chip;
   1308	return 0;
   1309
   1310 __error:
   1311	snd_pmac_free(chip);
   1312	return err;
   1313}
   1314
   1315
   1316/*
   1317 * sleep notify for powerbook
   1318 */
   1319
   1320#ifdef CONFIG_PM
   1321
   1322/*
   1323 * Save state when going to sleep, restore it afterwards.
   1324 */
   1325
   1326void snd_pmac_suspend(struct snd_pmac *chip)
   1327{
   1328	unsigned long flags;
   1329
   1330	snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot);
   1331	if (chip->suspend)
   1332		chip->suspend(chip);
   1333	spin_lock_irqsave(&chip->reg_lock, flags);
   1334	snd_pmac_beep_stop(chip);
   1335	spin_unlock_irqrestore(&chip->reg_lock, flags);
   1336	if (chip->irq >= 0)
   1337		disable_irq(chip->irq);
   1338	if (chip->tx_irq >= 0)
   1339		disable_irq(chip->tx_irq);
   1340	if (chip->rx_irq >= 0)
   1341		disable_irq(chip->rx_irq);
   1342	snd_pmac_sound_feature(chip, 0);
   1343}
   1344
   1345void snd_pmac_resume(struct snd_pmac *chip)
   1346{
   1347	snd_pmac_sound_feature(chip, 1);
   1348	if (chip->resume)
   1349		chip->resume(chip);
   1350	/* enable CD sound input */
   1351	if (chip->macio_base && chip->is_pbook_G3)
   1352		out_8(chip->macio_base + 0x37, 3);
   1353	else if (chip->is_pbook_3400)
   1354		in_8(chip->latch_base + 0x190);
   1355
   1356	snd_pmac_pcm_set_format(chip);
   1357
   1358	if (chip->irq >= 0)
   1359		enable_irq(chip->irq);
   1360	if (chip->tx_irq >= 0)
   1361		enable_irq(chip->tx_irq);
   1362	if (chip->rx_irq >= 0)
   1363		enable_irq(chip->rx_irq);
   1364
   1365	snd_power_change_state(chip->card, SNDRV_CTL_POWER_D0);
   1366}
   1367
   1368#endif /* CONFIG_PM */
   1369