1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 *   Driver for Midiman Portman2x4 parallel port midi interface
4 *
5 *   Copyright (c) by Levent Guendogdu <levon@feature-it.com>
6 *
7 * ChangeLog
8 * Jan 24 2007 Matthias Koenig <mkoenig@suse.de>
9 *      - cleanup and rewrite
10 * Sep 30 2004 Tobias Gehrig <tobias@gehrig.tk>
11 *      - source code cleanup
12 * Sep 03 2004 Tobias Gehrig <tobias@gehrig.tk>
13 *      - fixed compilation problem with alsa 1.0.6a (removed MODULE_CLASSES,
14 *        MODULE_PARM_SYNTAX and changed MODULE_DEVICES to
15 *        MODULE_SUPPORTED_DEVICE)
16 * Mar 24 2004 Tobias Gehrig <tobias@gehrig.tk>
17 *      - added 2.6 kernel support
18 * Mar 18 2004 Tobias Gehrig <tobias@gehrig.tk>
19 *      - added parport_unregister_driver to the startup routine if the driver fails to detect a portman
20 *      - added support for all 4 output ports in portman_putmidi
21 * Mar 17 2004 Tobias Gehrig <tobias@gehrig.tk>
22 *      - added checks for opened input device in interrupt handler
23 * Feb 20 2004 Tobias Gehrig <tobias@gehrig.tk>
24 *      - ported from alsa 0.5 to 1.0
25 */
26
27#include <linux/init.h>
28#include <linux/platform_device.h>
29#include <linux/parport.h>
30#include <linux/spinlock.h>
31#include <linux/delay.h>
32#include <linux/slab.h>
33#include <linux/module.h>
34#include <sound/core.h>
35#include <sound/initval.h>
36#include <sound/rawmidi.h>
37#include <sound/control.h>
38
39#define CARD_NAME "Portman 2x4"
40#define DRIVER_NAME "portman"
41#define PLATFORM_DRIVER "snd_portman2x4"
42
43static int index[SNDRV_CARDS]  = SNDRV_DEFAULT_IDX;
44static char *id[SNDRV_CARDS]   = SNDRV_DEFAULT_STR;
45static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
46
47static struct platform_device *platform_devices[SNDRV_CARDS];
48static int device_count;
49
50module_param_array(index, int, NULL, 0444);
51MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard.");
52module_param_array(id, charp, NULL, 0444);
53MODULE_PARM_DESC(id, "ID string for " CARD_NAME " soundcard.");
54module_param_array(enable, bool, NULL, 0444);
55MODULE_PARM_DESC(enable, "Enable " CARD_NAME " soundcard.");
56
57MODULE_AUTHOR("Levent Guendogdu, Tobias Gehrig, Matthias Koenig");
58MODULE_DESCRIPTION("Midiman Portman2x4");
59MODULE_LICENSE("GPL");
60MODULE_SUPPORTED_DEVICE("{{Midiman,Portman2x4}}");
61
62/*********************************************************************
63 * Chip specific
64 *********************************************************************/
65#define PORTMAN_NUM_INPUT_PORTS 2
66#define PORTMAN_NUM_OUTPUT_PORTS 4
67
68struct portman {
69	spinlock_t reg_lock;
70	struct snd_card *card;
71	struct snd_rawmidi *rmidi;
72	struct pardevice *pardev;
73	int open_count;
74	int mode[PORTMAN_NUM_INPUT_PORTS];
75	struct snd_rawmidi_substream *midi_input[PORTMAN_NUM_INPUT_PORTS];
76};
77
78static int portman_free(struct portman *pm)
79{
80	kfree(pm);
81	return 0;
82}
83
84static int portman_create(struct snd_card *card,
85			  struct pardevice *pardev,
86			  struct portman **rchip)
87{
88	struct portman *pm;
89
90	*rchip = NULL;
91
92	pm = kzalloc(sizeof(struct portman), GFP_KERNEL);
93	if (pm == NULL)
94		return -ENOMEM;
95
96	/* Init chip specific data */
97	spin_lock_init(&pm->reg_lock);
98	pm->card = card;
99	pm->pardev = pardev;
100
101	*rchip = pm;
102
103	return 0;
104}
105
106/*********************************************************************
107 * HW related constants
108 *********************************************************************/
109
110/* Standard PC parallel port status register equates. */
111#define	PP_STAT_BSY   	0x80	/* Busy status.  Inverted. */
112#define	PP_STAT_ACK   	0x40	/* Acknowledge.  Non-Inverted. */
113#define	PP_STAT_POUT  	0x20	/* Paper Out.    Non-Inverted. */
114#define	PP_STAT_SEL   	0x10	/* Select.       Non-Inverted. */
115#define	PP_STAT_ERR   	0x08	/* Error.        Non-Inverted. */
116
117/* Standard PC parallel port command register equates. */
118#define	PP_CMD_IEN  	0x10	/* IRQ Enable.   Non-Inverted. */
119#define	PP_CMD_SELI 	0x08	/* Select Input. Inverted. */
120#define	PP_CMD_INIT 	0x04	/* Init Printer. Non-Inverted. */
121#define	PP_CMD_FEED 	0x02	/* Auto Feed.    Inverted. */
122#define	PP_CMD_STB      0x01	/* Strobe.       Inverted. */
123
124/* Parallel Port Command Register as implemented by PCP2x4. */
125#define	INT_EN	 	PP_CMD_IEN	/* Interrupt enable. */
126#define	STROBE	        PP_CMD_STB	/* Command strobe. */
127
128/* The parallel port command register field (b1..b3) selects the
129 * various "registers" within the PC/P 2x4.  These are the internal
130 * address of these "registers" that must be written to the parallel
131 * port command register.
132 */
133#define	RXDATA0		(0 << 1)	/* PCP RxData channel 0. */
134#define	RXDATA1		(1 << 1)	/* PCP RxData channel 1. */
135#define	GEN_CTL		(2 << 1)	/* PCP General Control Register. */
136#define	SYNC_CTL 	(3 << 1)	/* PCP Sync Control Register. */
137#define	TXDATA0		(4 << 1)	/* PCP TxData channel 0. */
138#define	TXDATA1		(5 << 1)	/* PCP TxData channel 1. */
139#define	TXDATA2		(6 << 1)	/* PCP TxData channel 2. */
140#define	TXDATA3		(7 << 1)	/* PCP TxData channel 3. */
141
142/* Parallel Port Status Register as implemented by PCP2x4. */
143#define	ESTB		PP_STAT_POUT	/* Echoed strobe. */
144#define	INT_REQ         PP_STAT_ACK	/* Input data int request. */
145#define	BUSY            PP_STAT_ERR	/* Interface Busy. */
146
147/* Parallel Port Status Register BUSY and SELECT lines are multiplexed
148 * between several functions.  Depending on which 2x4 "register" is
149 * currently selected (b1..b3), the BUSY and SELECT lines are
150 * assigned as follows:
151 *
152 *   SELECT LINE:                                                    A3 A2 A1
153 *                                                                   --------
154 */
155#define	RXAVAIL		PP_STAT_SEL	/* Rx Available, channel 0.   0 0 0 */
156//  RXAVAIL1    PP_STAT_SEL             /* Rx Available, channel 1.   0 0 1 */
157#define	SYNC_STAT	PP_STAT_SEL	/* Reserved - Sync Status.    0 1 0 */
158//                                      /* Reserved.                  0 1 1 */
159#define	TXEMPTY		PP_STAT_SEL	/* Tx Empty, channel 0.       1 0 0 */
160//      TXEMPTY1        PP_STAT_SEL     /* Tx Empty, channel 1.       1 0 1 */
161//  TXEMPTY2    PP_STAT_SEL             /* Tx Empty, channel 2.       1 1 0 */
162//  TXEMPTY3    PP_STAT_SEL             /* Tx Empty, channel 3.       1 1 1 */
163
164/*   BUSY LINE:                                                      A3 A2 A1
165 *                                                                   --------
166 */
167#define	RXDATA		PP_STAT_BSY	/* Rx Input Data, channel 0.  0 0 0 */
168//      RXDATA1         PP_STAT_BSY     /* Rx Input Data, channel 1.  0 0 1 */
169#define	SYNC_DATA       PP_STAT_BSY	/* Reserved - Sync Data.      0 1 0 */
170					/* Reserved.                  0 1 1 */
171#define	DATA_ECHO       PP_STAT_BSY	/* Parallel Port Data Echo.   1 0 0 */
172#define	A0_ECHO         PP_STAT_BSY	/* Address 0 Echo.            1 0 1 */
173#define	A1_ECHO         PP_STAT_BSY	/* Address 1 Echo.            1 1 0 */
174#define	A2_ECHO         PP_STAT_BSY	/* Address 2 Echo.            1 1 1 */
175
176#define PORTMAN2X4_MODE_INPUT_TRIGGERED	 0x01
177
178/*********************************************************************
179 * Hardware specific functions
180 *********************************************************************/
181static inline void portman_write_command(struct portman *pm, u8 value)
182{
183	parport_write_control(pm->pardev->port, value);
184}
185
186static inline u8 portman_read_command(struct portman *pm)
187{
188	return parport_read_control(pm->pardev->port);
189}
190
191static inline u8 portman_read_status(struct portman *pm)
192{
193	return parport_read_status(pm->pardev->port);
194}
195
196static inline u8 portman_read_data(struct portman *pm)
197{
198	return parport_read_data(pm->pardev->port);
199}
200
201static inline void portman_write_data(struct portman *pm, u8 value)
202{
203	parport_write_data(pm->pardev->port, value);
204}
205
206static void portman_write_midi(struct portman *pm,
207			       int port, u8 mididata)
208{
209	int command = ((port + 4) << 1);
210
211	/* Get entering data byte and port number in BL and BH respectively.
212	 * Set up Tx Channel address field for use with PP Cmd Register.
213	 * Store address field in BH register.
214	 * Inputs:      AH = Output port number (0..3).
215	 *              AL = Data byte.
216	 *    command = TXDATA0 | INT_EN;
217	 * Align port num with address field (b1...b3),
218	 * set address for TXDatax, Strobe=0
219	 */
220	command |= INT_EN;
221
222	/* Disable interrupts so that the process is not interrupted, then
223	 * write the address associated with the current Tx channel to the
224	 * PP Command Reg.  Do not set the Strobe signal yet.
225	 */
226
227	do {
228		portman_write_command(pm, command);
229
230		/* While the address lines settle, write parallel output data to
231		 * PP Data Reg.  This has no effect until Strobe signal is asserted.
232		 */
233
234		portman_write_data(pm, mididata);
235
236		/* If PCP channel's TxEmpty is set (TxEmpty is read through the PP
237		 * Status Register), then go write data.  Else go back and wait.
238		 */
239	} while ((portman_read_status(pm) & TXEMPTY) != TXEMPTY);
240
241	/* TxEmpty is set.  Maintain PC/P destination address and assert
242	 * Strobe through the PP Command Reg.  This will Strobe data into
243	 * the PC/P transmitter and set the PC/P BUSY signal.
244	 */
245
246	portman_write_command(pm, command | STROBE);
247
248	/* Wait for strobe line to settle and echo back through hardware.
249	 * Once it has echoed back, assume that the address and data lines
250	 * have settled!
251	 */
252
253	while ((portman_read_status(pm) & ESTB) == 0)
254		cpu_relax();
255
256	/* Release strobe and immediately re-allow interrupts. */
257	portman_write_command(pm, command);
258
259	while ((portman_read_status(pm) & ESTB) == ESTB)
260		cpu_relax();
261
262	/* PC/P BUSY is now set.  We must wait until BUSY resets itself.
263	 * We'll reenable ints while we're waiting.
264	 */
265
266	while ((portman_read_status(pm) & BUSY) == BUSY)
267		cpu_relax();
268
269	/* Data sent. */
270}
271
272
273/*
274 *  Read MIDI byte from port
275 *  Attempt to read input byte from specified hardware input port (0..).
276 *  Return -1 if no data
277 */
278static int portman_read_midi(struct portman *pm, int port)
279{
280	unsigned char midi_data = 0;
281	unsigned char cmdout;	/* Saved address+IE bit. */
282
283	/* Make sure clocking edge is down before starting... */
284	portman_write_data(pm, 0);	/* Make sure edge is down. */
285
286	/* Set destination address to PCP. */
287	cmdout = (port << 1) | INT_EN;	/* Address + IE + No Strobe. */
288	portman_write_command(pm, cmdout);
289
290	while ((portman_read_status(pm) & ESTB) == ESTB)
291		cpu_relax();	/* Wait for strobe echo. */
292
293	/* After the address lines settle, check multiplexed RxAvail signal.
294	 * If data is available, read it.
295	 */
296	if ((portman_read_status(pm) & RXAVAIL) == 0)
297		return -1;	/* No data. */
298
299	/* Set the Strobe signal to enable the Rx clocking circuitry. */
300	portman_write_command(pm, cmdout | STROBE);	/* Write address+IE+Strobe. */
301
302	while ((portman_read_status(pm) & ESTB) == 0)
303		cpu_relax(); /* Wait for strobe echo. */
304
305	/* The first data bit (msb) is already sitting on the input line. */
306	midi_data = (portman_read_status(pm) & 128);
307	portman_write_data(pm, 1);	/* Cause rising edge, which shifts data. */
308
309	/* Data bit 6. */
310	portman_write_data(pm, 0);	/* Cause falling edge while data settles. */
311	midi_data |= (portman_read_status(pm) >> 1) & 64;
312	portman_write_data(pm, 1);	/* Cause rising edge, which shifts data. */
313
314	/* Data bit 5. */
315	portman_write_data(pm, 0);	/* Cause falling edge while data settles. */
316	midi_data |= (portman_read_status(pm) >> 2) & 32;
317	portman_write_data(pm, 1);	/* Cause rising edge, which shifts data. */
318
319	/* Data bit 4. */
320	portman_write_data(pm, 0);	/* Cause falling edge while data settles. */
321	midi_data |= (portman_read_status(pm) >> 3) & 16;
322	portman_write_data(pm, 1);	/* Cause rising edge, which shifts data. */
323
324	/* Data bit 3. */
325	portman_write_data(pm, 0);	/* Cause falling edge while data settles. */
326	midi_data |= (portman_read_status(pm) >> 4) & 8;
327	portman_write_data(pm, 1);	/* Cause rising edge, which shifts data. */
328
329	/* Data bit 2. */
330	portman_write_data(pm, 0);	/* Cause falling edge while data settles. */
331	midi_data |= (portman_read_status(pm) >> 5) & 4;
332	portman_write_data(pm, 1);	/* Cause rising edge, which shifts data. */
333
334	/* Data bit 1. */
335	portman_write_data(pm, 0);	/* Cause falling edge while data settles. */
336	midi_data |= (portman_read_status(pm) >> 6) & 2;
337	portman_write_data(pm, 1);	/* Cause rising edge, which shifts data. */
338
339	/* Data bit 0. */
340	portman_write_data(pm, 0);	/* Cause falling edge while data settles. */
341	midi_data |= (portman_read_status(pm) >> 7) & 1;
342	portman_write_data(pm, 1);	/* Cause rising edge, which shifts data. */
343	portman_write_data(pm, 0);	/* Return data clock low. */
344
345
346	/* De-assert Strobe and return data. */
347	portman_write_command(pm, cmdout);	/* Output saved address+IE. */
348
349	/* Wait for strobe echo. */
350	while ((portman_read_status(pm) & ESTB) == ESTB)
351		cpu_relax();
352
353	return (midi_data & 255);	/* Shift back and return value. */
354}
355
356/*
357 *  Checks if any input data on the given channel is available
358 *  Checks RxAvail
359 */
360static int portman_data_avail(struct portman *pm, int channel)
361{
362	int command = INT_EN;
363	switch (channel) {
364	case 0:
365		command |= RXDATA0;
366		break;
367	case 1:
368		command |= RXDATA1;
369		break;
370	}
371	/* Write hardware (assumme STROBE=0) */
372	portman_write_command(pm, command);
373	/* Check multiplexed RxAvail signal */
374	if ((portman_read_status(pm) & RXAVAIL) == RXAVAIL)
375		return 1;	/* Data available */
376
377	/* No Data available */
378	return 0;
379}
380
381
382/*
383 *  Flushes any input
384 */
385static void portman_flush_input(struct portman *pm, unsigned char port)
386{
387	/* Local variable for counting things */
388	unsigned int i = 0;
389	unsigned char command = 0;
390
391	switch (port) {
392	case 0:
393		command = RXDATA0;
394		break;
395	case 1:
396		command = RXDATA1;
397		break;
398	default:
399		snd_printk(KERN_WARNING
400			   "portman_flush_input() Won't flush port %i\n",
401			   port);
402		return;
403	}
404
405	/* Set address for specified channel in port and allow to settle. */
406	portman_write_command(pm, command);
407
408	/* Assert the Strobe and wait for echo back. */
409	portman_write_command(pm, command | STROBE);
410
411	/* Wait for ESTB */
412	while ((portman_read_status(pm) & ESTB) == 0)
413		cpu_relax();
414
415	/* Output clock cycles to the Rx circuitry. */
416	portman_write_data(pm, 0);
417
418	/* Flush 250 bits... */
419	for (i = 0; i < 250; i++) {
420		portman_write_data(pm, 1);
421		portman_write_data(pm, 0);
422	}
423
424	/* Deassert the Strobe signal of the port and wait for it to settle. */
425	portman_write_command(pm, command | INT_EN);
426
427	/* Wait for settling */
428	while ((portman_read_status(pm) & ESTB) == ESTB)
429		cpu_relax();
430}
431
432static int portman_probe(struct parport *p)
433{
434	/* Initialize the parallel port data register.  Will set Rx clocks
435	 * low in case we happen to be addressing the Rx ports at this time.
436	 */
437	/* 1 */
438	parport_write_data(p, 0);
439
440	/* Initialize the parallel port command register, thus initializing
441	 * hardware handshake lines to midi box:
442	 *
443	 *                                  Strobe = 0
444	 *                                  Interrupt Enable = 0
445	 */
446	/* 2 */
447	parport_write_control(p, 0);
448
449	/* Check if Portman PC/P 2x4 is out there. */
450	/* 3 */
451	parport_write_control(p, RXDATA0);	/* Write Strobe=0 to command reg. */
452
453	/* Check for ESTB to be clear */
454	/* 4 */
455	if ((parport_read_status(p) & ESTB) == ESTB)
456		return 1;	/* CODE 1 - Strobe Failure. */
457
458	/* Set for RXDATA0 where no damage will be done. */
459	/* 5 */
460	parport_write_control(p, RXDATA0 | STROBE);	/* Write Strobe=1 to command reg. */
461
462	/* 6 */
463	if ((parport_read_status(p) & ESTB) != ESTB)
464		return 1;	/* CODE 1 - Strobe Failure. */
465
466	/* 7 */
467	parport_write_control(p, 0);	/* Reset Strobe=0. */
468
469	/* Check if Tx circuitry is functioning properly.  If initialized
470	 * unit TxEmpty is false, send out char and see if it goes true.
471	 */
472	/* 8 */
473	parport_write_control(p, TXDATA0);	/* Tx channel 0, strobe off. */
474
475	/* If PCP channel's TxEmpty is set (TxEmpty is read through the PP
476	 * Status Register), then go write data.  Else go back and wait.
477	 */
478	/* 9 */
479	if ((parport_read_status(p) & TXEMPTY) == 0)
480		return 2;
481
482	/* Return OK status. */
483	return 0;
484}
485
486static int portman_device_init(struct portman *pm)
487{
488	portman_flush_input(pm, 0);
489	portman_flush_input(pm, 1);
490
491	return 0;
492}
493
494/*********************************************************************
495 * Rawmidi
496 *********************************************************************/
497static int snd_portman_midi_open(struct snd_rawmidi_substream *substream)
498{
499	return 0;
500}
501
502static int snd_portman_midi_close(struct snd_rawmidi_substream *substream)
503{
504	return 0;
505}
506
507static void snd_portman_midi_input_trigger(struct snd_rawmidi_substream *substream,
508					   int up)
509{
510	struct portman *pm = substream->rmidi->private_data;
511	unsigned long flags;
512
513	spin_lock_irqsave(&pm->reg_lock, flags);
514	if (up)
515		pm->mode[substream->number] |= PORTMAN2X4_MODE_INPUT_TRIGGERED;
516	else
517		pm->mode[substream->number] &= ~PORTMAN2X4_MODE_INPUT_TRIGGERED;
518	spin_unlock_irqrestore(&pm->reg_lock, flags);
519}
520
521static void snd_portman_midi_output_trigger(struct snd_rawmidi_substream *substream,
522					    int up)
523{
524	struct portman *pm = substream->rmidi->private_data;
525	unsigned long flags;
526	unsigned char byte;
527
528	spin_lock_irqsave(&pm->reg_lock, flags);
529	if (up) {
530		while ((snd_rawmidi_transmit(substream, &byte, 1) == 1))
531			portman_write_midi(pm, substream->number, byte);
532	}
533	spin_unlock_irqrestore(&pm->reg_lock, flags);
534}
535
536static const struct snd_rawmidi_ops snd_portman_midi_output = {
537	.open =		snd_portman_midi_open,
538	.close =	snd_portman_midi_close,
539	.trigger =	snd_portman_midi_output_trigger,
540};
541
542static const struct snd_rawmidi_ops snd_portman_midi_input = {
543	.open =		snd_portman_midi_open,
544	.close =	snd_portman_midi_close,
545	.trigger =	snd_portman_midi_input_trigger,
546};
547
548/* Create and initialize the rawmidi component */
549static int snd_portman_rawmidi_create(struct snd_card *card)
550{
551	struct portman *pm = card->private_data;
552	struct snd_rawmidi *rmidi;
553	struct snd_rawmidi_substream *substream;
554	int err;
555
556	err = snd_rawmidi_new(card, CARD_NAME, 0,
557			      PORTMAN_NUM_OUTPUT_PORTS,
558			      PORTMAN_NUM_INPUT_PORTS,
559			      &rmidi);
560	if (err < 0)
561		return err;
562
563	rmidi->private_data = pm;
564	strcpy(rmidi->name, CARD_NAME);
565	rmidi->info_flags = SNDRV_RAWMIDI_INFO_OUTPUT |
566		            SNDRV_RAWMIDI_INFO_INPUT |
567                            SNDRV_RAWMIDI_INFO_DUPLEX;
568
569	pm->rmidi = rmidi;
570
571	/* register rawmidi ops */
572	snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT,
573			    &snd_portman_midi_output);
574	snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_INPUT,
575			    &snd_portman_midi_input);
576
577	/* name substreams */
578	/* output */
579	list_for_each_entry(substream,
580			    &rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams,
581			    list) {
582		sprintf(substream->name,
583			"Portman2x4 %d", substream->number+1);
584	}
585	/* input */
586	list_for_each_entry(substream,
587			    &rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substreams,
588			    list) {
589		pm->midi_input[substream->number] = substream;
590		sprintf(substream->name,
591			"Portman2x4 %d", substream->number+1);
592	}
593
594	return err;
595}
596
597/*********************************************************************
598 * parport stuff
599 *********************************************************************/
600static void snd_portman_interrupt(void *userdata)
601{
602	unsigned char midivalue = 0;
603	struct portman *pm = ((struct snd_card*)userdata)->private_data;
604
605	spin_lock(&pm->reg_lock);
606
607	/* While any input data is waiting */
608	while ((portman_read_status(pm) & INT_REQ) == INT_REQ) {
609		/* If data available on channel 0,
610		   read it and stuff it into the queue. */
611		if (portman_data_avail(pm, 0)) {
612			/* Read Midi */
613			midivalue = portman_read_midi(pm, 0);
614			/* put midi into queue... */
615			if (pm->mode[0] & PORTMAN2X4_MODE_INPUT_TRIGGERED)
616				snd_rawmidi_receive(pm->midi_input[0],
617						    &midivalue, 1);
618
619		}
620		/* If data available on channel 1,
621		   read it and stuff it into the queue. */
622		if (portman_data_avail(pm, 1)) {
623			/* Read Midi */
624			midivalue = portman_read_midi(pm, 1);
625			/* put midi into queue... */
626			if (pm->mode[1] & PORTMAN2X4_MODE_INPUT_TRIGGERED)
627				snd_rawmidi_receive(pm->midi_input[1],
628						    &midivalue, 1);
629		}
630
631	}
632
633	spin_unlock(&pm->reg_lock);
634}
635
636static void snd_portman_attach(struct parport *p)
637{
638	struct platform_device *device;
639
640	device = platform_device_alloc(PLATFORM_DRIVER, device_count);
641	if (!device)
642		return;
643
644	/* Temporary assignment to forward the parport */
645	platform_set_drvdata(device, p);
646
647	if (platform_device_add(device) < 0) {
648		platform_device_put(device);
649		return;
650	}
651
652	/* Since we dont get the return value of probe
653	 * We need to check if device probing succeeded or not */
654	if (!platform_get_drvdata(device)) {
655		platform_device_unregister(device);
656		return;
657	}
658
659	/* register device in global table */
660	platform_devices[device_count] = device;
661	device_count++;
662}
663
664static void snd_portman_detach(struct parport *p)
665{
666	/* nothing to do here */
667}
668
669static int snd_portman_dev_probe(struct pardevice *pardev)
670{
671	if (strcmp(pardev->name, DRIVER_NAME))
672		return -ENODEV;
673
674	return 0;
675}
676
677static struct parport_driver portman_parport_driver = {
678	.name		= "portman2x4",
679	.probe		= snd_portman_dev_probe,
680	.match_port	= snd_portman_attach,
681	.detach		= snd_portman_detach,
682	.devmodel	= true,
683};
684
685/*********************************************************************
686 * platform stuff
687 *********************************************************************/
688static void snd_portman_card_private_free(struct snd_card *card)
689{
690	struct portman *pm = card->private_data;
691	struct pardevice *pardev = pm->pardev;
692
693	if (pardev) {
694		parport_release(pardev);
695		parport_unregister_device(pardev);
696	}
697
698	portman_free(pm);
699}
700
701static int snd_portman_probe(struct platform_device *pdev)
702{
703	struct pardevice *pardev;
704	struct parport *p;
705	int dev = pdev->id;
706	struct snd_card *card = NULL;
707	struct portman *pm = NULL;
708	int err;
709	struct pardev_cb portman_cb = {
710		.preempt = NULL,
711		.wakeup = NULL,
712		.irq_func = snd_portman_interrupt,	/* ISR */
713		.flags = PARPORT_DEV_EXCL,		/* flags */
714	};
715
716	p = platform_get_drvdata(pdev);
717	platform_set_drvdata(pdev, NULL);
718
719	if (dev >= SNDRV_CARDS)
720		return -ENODEV;
721	if (!enable[dev])
722		return -ENOENT;
723
724	err = snd_card_new(&pdev->dev, index[dev], id[dev], THIS_MODULE,
725			   0, &card);
726	if (err < 0) {
727		snd_printd("Cannot create card\n");
728		return err;
729	}
730	strcpy(card->driver, DRIVER_NAME);
731	strcpy(card->shortname, CARD_NAME);
732	sprintf(card->longname,  "%s at 0x%lx, irq %i",
733		card->shortname, p->base, p->irq);
734
735	portman_cb.private = card;			   /* private */
736	pardev = parport_register_dev_model(p,		   /* port */
737					    DRIVER_NAME,   /* name */
738					    &portman_cb,   /* callbacks */
739					    pdev->id);	   /* device number */
740	if (pardev == NULL) {
741		snd_printd("Cannot register pardevice\n");
742		err = -EIO;
743		goto __err;
744	}
745
746	/* claim parport */
747	if (parport_claim(pardev)) {
748		snd_printd("Cannot claim parport 0x%lx\n", pardev->port->base);
749		err = -EIO;
750		goto free_pardev;
751	}
752
753	if ((err = portman_create(card, pardev, &pm)) < 0) {
754		snd_printd("Cannot create main component\n");
755		goto release_pardev;
756	}
757	card->private_data = pm;
758	card->private_free = snd_portman_card_private_free;
759
760	err = portman_probe(p);
761	if (err) {
762		err = -EIO;
763		goto __err;
764	}
765
766	if ((err = snd_portman_rawmidi_create(card)) < 0) {
767		snd_printd("Creating Rawmidi component failed\n");
768		goto __err;
769	}
770
771	/* init device */
772	if ((err = portman_device_init(pm)) < 0)
773		goto __err;
774
775	platform_set_drvdata(pdev, card);
776
777	/* At this point card will be usable */
778	if ((err = snd_card_register(card)) < 0) {
779		snd_printd("Cannot register card\n");
780		goto __err;
781	}
782
783	snd_printk(KERN_INFO "Portman 2x4 on 0x%lx\n", p->base);
784	return 0;
785
786release_pardev:
787	parport_release(pardev);
788free_pardev:
789	parport_unregister_device(pardev);
790__err:
791	snd_card_free(card);
792	return err;
793}
794
795static int snd_portman_remove(struct platform_device *pdev)
796{
797	struct snd_card *card = platform_get_drvdata(pdev);
798
799	if (card)
800		snd_card_free(card);
801
802	return 0;
803}
804
805
806static struct platform_driver snd_portman_driver = {
807	.probe  = snd_portman_probe,
808	.remove = snd_portman_remove,
809	.driver = {
810		.name = PLATFORM_DRIVER,
811	}
812};
813
814/*********************************************************************
815 * module init stuff
816 *********************************************************************/
817static void snd_portman_unregister_all(void)
818{
819	int i;
820
821	for (i = 0; i < SNDRV_CARDS; ++i) {
822		if (platform_devices[i]) {
823			platform_device_unregister(platform_devices[i]);
824			platform_devices[i] = NULL;
825		}
826	}
827	platform_driver_unregister(&snd_portman_driver);
828	parport_unregister_driver(&portman_parport_driver);
829}
830
831static int __init snd_portman_module_init(void)
832{
833	int err;
834
835	if ((err = platform_driver_register(&snd_portman_driver)) < 0)
836		return err;
837
838	if (parport_register_driver(&portman_parport_driver) != 0) {
839		platform_driver_unregister(&snd_portman_driver);
840		return -EIO;
841	}
842
843	if (device_count == 0) {
844		snd_portman_unregister_all();
845		return -ENODEV;
846	}
847
848	return 0;
849}
850
851static void __exit snd_portman_module_exit(void)
852{
853	snd_portman_unregister_all();
854}
855
856module_init(snd_portman_module_init);
857module_exit(snd_portman_module_exit);
858