aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
Commit message (Expand)AuthorAge
* Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/asy...Linus Torvalds2009-04-03
|\
| * dmaengine: allow dma support for async_tx to be toggledDan Williams2009-03-25
| * async_tx: provide __async_inline for HAS_DMA=n archsDan Williams2009-03-25
* | Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6Linus Torvalds2009-04-03
|\ \
| * | crypto: shash - Fix unaligned calculation with short lengthYehuda Sadeh2009-03-27
* | | Merge branch 'for-linus' of git://neil.brown.name/mdLinus Torvalds2009-04-03
|\ \ \ | |/ / |/| |
| * | md: move lots of #include lines out of .h files and into .cNeilBrown2009-03-30
| |/
* | Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6Linus Torvalds2009-03-26
|\ \ | |/ |/|
| * crypto: testmgr - add zlib testGeert Uytterhoeven2009-03-04
| * crypto: zlib - New zlib crypto module, using pcompGeert Uytterhoeven2009-03-04
| * crypto: testmgr - Add support for the pcomp interfaceGeert Uytterhoeven2009-03-04
| * crypto: compress - Add pcomp interfaceGeert Uytterhoeven2009-03-04
| * crypto: Fix dead linksAdrian-Ken Rueegsegger2009-03-04
| * crypto: chainiv - Use kcrypto_wq instead of keventd_wqHuang Ying2009-02-19
| * crypto: cryptd - Per-CPU thread implementation based on kcrypto_wqHuang Ying2009-02-19
| * crypto: api - Use dedicated workqueue for crypto subsystemHuang Ying2009-02-19
| * crypto: testmgr - Test skciphers with no IVsHerbert Xu2009-02-18
| * crypto: aead - Avoid infinite loop when nivaead fails selftestHerbert Xu2009-02-18
| * crypto: skcipher - Avoid infinite loop when cipher fails selftestHerbert Xu2009-02-18
| * crypto: api - Fix crypto_alloc_tfm/create_create_tfm return conventionHerbert Xu2009-02-18
| * crypto: api - crypto_alg_mod_lookup either tested or untestedHerbert Xu2009-02-18
| * crypto: ansi_cprng - Panic on CPRNG test failure when in FIPS mode Neil Horman2009-02-18
| * crypto: ansi_cprng - Force reset on allocationNeil Horman2009-02-18
| * crypto: aes-ni - Add support to Intel AES-NI instructions for x86_64 platformHuang Ying2009-02-18
| * crypto: cryptd - Add support to access underlying blkcipherHuang Ying2009-02-18
| * crypto: shash - Remove superfluous check in init_tfmHerbert Xu2009-02-18
* | crypto: api - Fix module load deadlock with fallback algorithmsHerbert Xu2009-02-26
* | crypto: ahash - Fix digest size in /proc/cryptoLee Nipper2009-02-19
|/
* crypto: lrw - Fix big endian supportHerbert Xu2009-02-17
* crypto: scatterwalk - Avoid flush_dcache_page on slab pagesHerbert Xu2009-02-08
* crypto: api - Fix zeroing on freeHerbert Xu2009-02-05
* crypto: shash - Fix module refcountAdrian-Ken Rueegsegger2009-02-05
* crypto: api - Fix algorithm test race that broke aead initialisationHerbert Xu2009-01-27
* crypto: ccm - Fix handling of null assoc dataJarod Wilson2009-01-27
* crypto: blkcipher - Fix WARN_ON handling in walk_doneHerbert Xu2009-01-27
* crypto: authenc - Fix zero-length IV crashHerbert Xu2009-01-14
* dmaengine: replace dma_async_client_register with dmaengine_getDan Williams2009-01-06
* dmaengine: provide a common 'issue_pending_all' implementationDan Williams2009-01-06
* dmaengine: centralize channel allocation, introduce dma_find_channelDan Williams2009-01-06
* dmaengine: up-level reference counting to the module levelDan Williams2009-01-06
* dmaengine: remove dependency on async_txDan Williams2009-01-05
* crypto: aes - Precompute tablesHerbert Xu2008-12-24
* crypto: testmgr - Correct comment about deflate parametersGeert Uytterhoeven2008-12-24
* crypto: salsa20 - Remove private wrappers around various operationsHarvey Harrison2008-12-24
* crypto: des3_ede - permit weak keys unless REQ_WEAK_KEY setJarod Wilson2008-12-24
* crypto: sha512 - Switch to shash Adrian-Ken Rueegsegger2008-12-24
* crypto: sha512 - Move message schedule W[80] to static percpu areaAdrian-Ken Rueegsegger2008-12-24
* crypto: michael_mic - Switch to shashAdrian-Ken Rueegsegger2008-12-24
* crypto: wp512 - Switch to shashAdrian-Ken Rueegsegger2008-12-24
* crypto: tgr192 - Switch to shashAdrian-Ken Rueegsegger2008-12-24
5e24c1c1c496








241b3ee70d2d
5e24c1c1c496
c95eadd2f1af


1da177e4c3f4



43bcd973d6d0


1da177e4c3f4




43bcd973d6d0


1da177e4c3f4


43bcd973d6d0

1da177e4c3f4
760fc6b838d8



43bcd973d6d0
feb158e6ada2
1da177e4c3f4
ead893c0deee


43bcd973d6d0
1da177e4c3f4
5664daa1c1fa


43bcd973d6d0
1da177e4c3f4
43bcd973d6d0


1da177e4c3f4






5e24c1c1c496
43bcd973d6d0



5e24c1c1c496
1da177e4c3f4
43bcd973d6d0



1da177e4c3f4

5e24c1c1c496
feb158e6ada2
5e24c1c1c496

feb158e6ada2



5e24c1c1c496

feb158e6ada2
5e24c1c1c496
241b3ee70d2d
feb158e6ada2





5e24c1c1c496
feb158e6ada2
5e24c1c1c496
241b3ee70d2d
feb158e6ada2

760fc6b838d8

feb158e6ada2





83c51c0ab08f
feb158e6ada2
5e24c1c1c496

feb158e6ada2






83c51c0ab08f
feb158e6ada2


1da177e4c3f4

5e24c1c1c496
1da177e4c3f4



5e24c1c1c496
1da177e4c3f4



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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369






















                                                                               
                       
                      
                      



                              
                    

                       
                      

































                                                                                     

                           





                                                      
                                                                                 

















                                                                            

                                                                  











                                                            
                                                                     



                        
                                                                                























                                                                             
                                                        






                                          
                                                                                            












                                                                         
                                                                  

     
                                                   











                                                             




                                                                   

  
                                                            
 

                                           

























                                                                      


                                                                                




                                   
                                                                               
 

                         
                                             
                                                             
                         

                                              
                                                              
                         
         








                                                                               
                             
 


                                                                          



                                                                           


                                                                               




                                                                            


                                                                               


                 

                                                             
 



                                                        
                          
                                  
 


                                                                       
                          
         


                                                                  
                          
         


                                                              






                                                                        
                                       



                                                
                                      
                 



                            

 
                                                                                
 

                                               



                 

                                                                   
 
                                                      
                                                  





                                                            
                                                                  
 
                                                      
                                                  

                           

                                                                               





                                                         
                          
 

                                               






                                                          
                                  


          

                                              
                                                                     



                                               
                                                   



                                   
/*
 *  Driver for Aztech Sound Galaxy cards
 *  Copyright (c) by Christopher Butler <chrisb@sandy.force9.co.uk.
 *
 *  I don't have documentation for this card, I based this driver on the
 *  driver for OSS/Free included in the kernel source (drivers/sound/sgalaxy.c)
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 */

#include <linux/init.h>
#include <linux/err.h>
#include <linux/isa.h>
#include <linux/delay.h>
#include <linux/time.h>
#include <linux/interrupt.h>
#include <linux/moduleparam.h>
#include <asm/dma.h>
#include <sound/core.h>
#include <sound/sb.h>
#include <sound/wss.h>
#include <sound/control.h>
#define SNDRV_LEGACY_FIND_FREE_IRQ
#define SNDRV_LEGACY_FIND_FREE_DMA
#include <sound/initval.h>

MODULE_AUTHOR("Christopher Butler <chrisb@sandy.force9.co.uk>");
MODULE_DESCRIPTION("Aztech Sound Galaxy");
MODULE_LICENSE("GPL");
MODULE_SUPPORTED_DEVICE("{{Aztech Systems,Sound Galaxy}}");

static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE;	/* Enable this card */
static long sbport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;	/* 0x220,0x240 */
static long wssport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;	/* 0x530,0xe80,0xf40,0x604 */
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* 7,9,10,11 */
static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3 */

module_param_array(index, int, NULL, 0444);
MODULE_PARM_DESC(index, "Index value for Sound Galaxy soundcard.");
module_param_array(id, charp, NULL, 0444);
MODULE_PARM_DESC(id, "ID string for Sound Galaxy soundcard.");
module_param_array(sbport, long, NULL, 0444);
MODULE_PARM_DESC(sbport, "Port # for Sound Galaxy SB driver.");
module_param_array(wssport, long, NULL, 0444);
MODULE_PARM_DESC(wssport, "Port # for Sound Galaxy WSS driver.");
module_param_array(irq, int, NULL, 0444);
MODULE_PARM_DESC(irq, "IRQ # for Sound Galaxy driver.");
module_param_array(dma1, int, NULL, 0444);
MODULE_PARM_DESC(dma1, "DMA1 # for Sound Galaxy driver.");

#define SGALAXY_AUXC_LEFT 18
#define SGALAXY_AUXC_RIGHT 19

#define PFX	"sgalaxy: "

/*

 */

#define AD1848P1( port, x ) ( port + c_d_c_AD1848##x )

/* from lowlevel/sb/sb.c - to avoid having to allocate a struct snd_sb for the */
/* short time we actually need it.. */

static int snd_sgalaxy_sbdsp_reset(unsigned long port)
{
	int i;

	outb(1, SBP1(port, RESET));
	udelay(10);
	outb(0, SBP1(port, RESET));
	udelay(30);
	for (i = 0; i < 1000 && !(inb(SBP1(port, DATA_AVAIL)) & 0x80); i++);
	if (inb(SBP1(port, READ)) != 0xaa) {
		snd_printd("sb_reset: failed at 0x%lx!!!\n", port);
		return -ENODEV;
	}
	return 0;
}

static int __devinit snd_sgalaxy_sbdsp_command(unsigned long port,
					       unsigned char val)
{
	int i;
       	
	for (i = 10000; i; i--)
		if ((inb(SBP1(port, STATUS)) & 0x80) == 0) {
			outb(val, SBP1(port, COMMAND));
			return 1;
		}

	return 0;
}

static irqreturn_t snd_sgalaxy_dummy_interrupt(int irq, void *dev_id)
{
	return IRQ_NONE;
}

static int __devinit snd_sgalaxy_setup_wss(unsigned long port, int irq, int dma)
{
	static int interrupt_bits[] = {-1, -1, -1, -1, -1, -1, -1, 0x08, -1, 
				       0x10, 0x18, 0x20, -1, -1, -1, -1};
	static int dma_bits[] = {1, 2, 0, 3};
	int tmp, tmp1;

	if ((tmp = inb(port + 3)) == 0xff)
	{
		snd_printdd("I/O address dead (0x%lx)\n", port);
		return 0;
	}
#if 0
	snd_printdd("WSS signature = 0x%x\n", tmp);
#endif

        if ((tmp & 0x3f) != 0x04 &&
            (tmp & 0x3f) != 0x0f &&
            (tmp & 0x3f) != 0x00) {
		snd_printdd("No WSS signature detected on port 0x%lx\n",
			    port + 3);
		return 0;
	}

#if 0
	snd_printdd(PFX "setting up IRQ/DMA for WSS\n");
#endif

        /* initialize IRQ for WSS codec */
        tmp = interrupt_bits[irq % 16];
        if (tmp < 0)
                return -EINVAL;

	if (request_irq(irq, snd_sgalaxy_dummy_interrupt, IRQF_DISABLED, "sgalaxy", NULL)) {
		snd_printk(KERN_ERR "sgalaxy: can't grab irq %d\n", irq);
		return -EIO;
	}

        outb(tmp | 0x40, port);
        tmp1 = dma_bits[dma % 4];
        outb(tmp | tmp1, port);

	free_irq(irq, NULL);

	return 0;
}

static int __devinit snd_sgalaxy_detect(int dev, int irq, int dma)
{
#if 0
	snd_printdd(PFX "switching to WSS mode\n");
#endif

	/* switch to WSS mode */
	snd_sgalaxy_sbdsp_reset(sbport[dev]);

	snd_sgalaxy_sbdsp_command(sbport[dev], 9);
	snd_sgalaxy_sbdsp_command(sbport[dev], 0);

	udelay(400);
	return snd_sgalaxy_setup_wss(wssport[dev], irq, dma);
}

static struct snd_kcontrol_new snd_sgalaxy_controls[] = {
WSS_DOUBLE("Aux Playback Switch", 0,
		SGALAXY_AUXC_LEFT, SGALAXY_AUXC_RIGHT, 7, 7, 1, 1),
WSS_DOUBLE("Aux Playback Volume", 0,
		SGALAXY_AUXC_LEFT, SGALAXY_AUXC_RIGHT, 0, 0, 31, 0)
};

static int __devinit snd_sgalaxy_mixer(struct snd_wss *chip)
{
	struct snd_card *card = chip->card;
	struct snd_ctl_elem_id id1, id2;
	unsigned int idx;
	int err;

	memset(&id1, 0, sizeof(id1));
	memset(&id2, 0, sizeof(id2));
	id1.iface = id2.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
	/* reassign AUX0 to LINE */
	strcpy(id1.name, "Aux Playback Switch");
	strcpy(id2.name, "Line Playback Switch");
	if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0)
		return err;
	strcpy(id1.name, "Aux Playback Volume");
	strcpy(id2.name, "Line Playback Volume");
	if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0)
		return err;
	/* reassign AUX1 to FM */
	strcpy(id1.name, "Aux Playback Switch"); id1.index = 1;
	strcpy(id2.name, "FM Playback Switch");
	if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0)
		return err;
	strcpy(id1.name, "Aux Playback Volume");
	strcpy(id2.name, "FM Playback Volume");
	if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0)
		return err;
	/* build AUX2 input */
	for (idx = 0; idx < ARRAY_SIZE(snd_sgalaxy_controls); idx++) {
		err = snd_ctl_add(card,
				snd_ctl_new1(&snd_sgalaxy_controls[idx], chip));
		if (err < 0)
			return err;
	}
	return 0;
}

static int __devinit snd_sgalaxy_match(struct device *devptr, unsigned int dev)
{
	if (!enable[dev])
		return 0;
	if (sbport[dev] == SNDRV_AUTO_PORT) {
		snd_printk(KERN_ERR PFX "specify SB port\n");
		return 0;
	}
	if (wssport[dev] == SNDRV_AUTO_PORT) {
		snd_printk(KERN_ERR PFX "specify WSS port\n");
		return 0;
	}
	return 1;
}

static int __devinit snd_sgalaxy_probe(struct device *devptr, unsigned int dev)
{
	static int possible_irqs[] = {7, 9, 10, 11, -1};
	static int possible_dmas[] = {1, 3, 0, -1};
	int err, xirq, xdma1;
	struct snd_card *card;
	struct snd_wss *chip;

	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
	if (err < 0)
		return err;

	xirq = irq[dev];
	if (xirq == SNDRV_AUTO_IRQ) {
		if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
			snd_printk(KERN_ERR PFX "unable to find a free IRQ\n");
			err = -EBUSY;
			goto _err;
		}
	}
	xdma1 = dma1[dev];
        if (xdma1 == SNDRV_AUTO_DMA) {
		if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
			snd_printk(KERN_ERR PFX "unable to find a free DMA\n");
			err = -EBUSY;
			goto _err;
		}
	}

	if ((err = snd_sgalaxy_detect(dev, xirq, xdma1)) < 0)
		goto _err;

	err = snd_wss_create(card, wssport[dev] + 4, -1,
			     xirq, xdma1, -1,
			     WSS_HW_DETECT, 0, &chip);
	if (err < 0)
		goto _err;
	card->private_data = chip;

	err = snd_wss_pcm(chip, 0, NULL);
	if (err < 0) {
		snd_printdd(PFX "error creating new WSS PCM device\n");
		goto _err;
	}
	err = snd_wss_mixer(chip);
	if (err < 0) {
		snd_printdd(PFX "error creating new WSS mixer\n");
		goto _err;
	}
	if ((err = snd_sgalaxy_mixer(chip)) < 0) {
		snd_printdd(PFX "the mixer rewrite failed\n");
		goto _err;
	}

	strcpy(card->driver, "Sound Galaxy");
	strcpy(card->shortname, "Sound Galaxy");
	sprintf(card->longname, "Sound Galaxy at 0x%lx, irq %d, dma %d",
		wssport[dev], xirq, xdma1);

	snd_card_set_dev(card, devptr);

	if ((err = snd_card_register(card)) < 0)
		goto _err;

	dev_set_drvdata(devptr, card);
	return 0;

 _err:
	snd_card_free(card);
	return err;
}

static int __devexit snd_sgalaxy_remove(struct device *devptr, unsigned int dev)
{
	snd_card_free(dev_get_drvdata(devptr));
	dev_set_drvdata(devptr, NULL);
	return 0;
}

#ifdef CONFIG_PM
static int snd_sgalaxy_suspend(struct device *pdev, unsigned int n,
			       pm_message_t state)
{
	struct snd_card *card = dev_get_drvdata(pdev);
	struct snd_wss *chip = card->private_data;

	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
	chip->suspend(chip);
	return 0;
}

static int snd_sgalaxy_resume(struct device *pdev, unsigned int n)
{
	struct snd_card *card = dev_get_drvdata(pdev);
	struct snd_wss *chip = card->private_data;

	chip->resume(chip);
	snd_wss_out(chip, SGALAXY_AUXC_LEFT, chip->image[SGALAXY_AUXC_LEFT]);
	snd_wss_out(chip, SGALAXY_AUXC_RIGHT, chip->image[SGALAXY_AUXC_RIGHT]);

	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
	return 0;
}
#endif

#define DEV_NAME "sgalaxy"

static struct isa_driver snd_sgalaxy_driver = {
	.match		= snd_sgalaxy_match,
	.probe		= snd_sgalaxy_probe,
	.remove		= __devexit_p(snd_sgalaxy_remove),
#ifdef CONFIG_PM
	.suspend	= snd_sgalaxy_suspend,
	.resume		= snd_sgalaxy_resume,
#endif
	.driver		= {
		.name	= DEV_NAME
	},
};

static int __init alsa_card_sgalaxy_init(void)
{
	return isa_register_driver(&snd_sgalaxy_driver, SNDRV_CARDS);
}

static void __exit alsa_card_sgalaxy_exit(void)
{
	isa_unregister_driver(&snd_sgalaxy_driver);
}

module_init(alsa_card_sgalaxy_init)
module_exit(alsa_card_sgalaxy_exit)