예제 #1
0
static void __devinit snd_ice1712_stdsp24_box_channel(struct snd_ice1712 *ice, int box, int chn, int activate)
{
	struct hoontech_spec *spec = ice->spec;

	mutex_lock(&ice->gpio_mutex);

	/* select box */
	ICE1712_STDSP24_0_BOX(spec->boxbits, box);
	snd_ice1712_stdsp24_gpio_write(ice, spec->boxbits[0]);

	/* prepare for write */
	if (chn == 3)
		ICE1712_STDSP24_2_CHN4(spec->boxbits, 0);
	ICE1712_STDSP24_2_MIDI1(spec->boxbits, activate);
	snd_ice1712_stdsp24_gpio_write(ice, spec->boxbits[2]);
	snd_ice1712_stdsp24_gpio_write(ice, spec->boxbits[3]);

	ICE1712_STDSP24_1_CHN1(spec->boxbits, 1);
	ICE1712_STDSP24_1_CHN2(spec->boxbits, 1);
	ICE1712_STDSP24_1_CHN3(spec->boxbits, 1);
	ICE1712_STDSP24_2_CHN4(spec->boxbits, 1);
	snd_ice1712_stdsp24_gpio_write(ice, spec->boxbits[1]);
	snd_ice1712_stdsp24_gpio_write(ice, spec->boxbits[2]);
	udelay(100);
	if (chn == 3) {
		ICE1712_STDSP24_2_CHN4(spec->boxbits, 0);
		snd_ice1712_stdsp24_gpio_write(ice, spec->boxbits[2]);
	} else {
		switch (chn) {
		case 0:	ICE1712_STDSP24_1_CHN1(spec->boxbits, 0); break;
		case 1:	ICE1712_STDSP24_1_CHN2(spec->boxbits, 0); break;
		case 2:	ICE1712_STDSP24_1_CHN3(spec->boxbits, 0); break;
		}
		snd_ice1712_stdsp24_gpio_write(ice, spec->boxbits[1]);
	}
	udelay(100);
	ICE1712_STDSP24_1_CHN1(spec->boxbits, 1);
	ICE1712_STDSP24_1_CHN2(spec->boxbits, 1);
	ICE1712_STDSP24_1_CHN3(spec->boxbits, 1);
	ICE1712_STDSP24_2_CHN4(spec->boxbits, 1);
	snd_ice1712_stdsp24_gpio_write(ice, spec->boxbits[1]);
	snd_ice1712_stdsp24_gpio_write(ice, spec->boxbits[2]);
	udelay(100);

	ICE1712_STDSP24_2_MIDI1(spec->boxbits, 0);
	snd_ice1712_stdsp24_gpio_write(ice, spec->boxbits[2]);

	mutex_unlock(&ice->gpio_mutex);
}
예제 #2
0
static void __devinit snd_ice1712_stdsp24_box_channel(ice1712_t *ice, int box, int chn, int activate)
{
	down(&ice->gpio_mutex);

	/* select box */
	ICE1712_STDSP24_0_BOX(ice->spec.hoontech.boxbits, box);
	snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[0]);

	/* prepare for write */
	if (chn == 3)
		ICE1712_STDSP24_2_CHN4(ice->spec.hoontech.boxbits, 0);
	ICE1712_STDSP24_2_MIDI1(ice->spec.hoontech.boxbits, activate);
	snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[2]);
	snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[3]);

	ICE1712_STDSP24_1_CHN1(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_1_CHN2(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_1_CHN3(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_2_CHN4(ice->spec.hoontech.boxbits, 1);
	snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[1]);
	snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[2]);
	udelay(100);
	if (chn == 3) {
		ICE1712_STDSP24_2_CHN4(ice->spec.hoontech.boxbits, 0);
		snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[2]);
	} else {
		switch (chn) {
		case 0:	ICE1712_STDSP24_1_CHN1(ice->spec.hoontech.boxbits, 0); break;
		case 1:	ICE1712_STDSP24_1_CHN2(ice->spec.hoontech.boxbits, 0); break;
		case 2:	ICE1712_STDSP24_1_CHN3(ice->spec.hoontech.boxbits, 0); break;
		}
		snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[1]);
	}
	udelay(100);
	ICE1712_STDSP24_1_CHN1(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_1_CHN2(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_1_CHN3(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_2_CHN4(ice->spec.hoontech.boxbits, 1);
	snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[1]);
	snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[2]);
	udelay(100);

	ICE1712_STDSP24_2_MIDI1(ice->spec.hoontech.boxbits, 0);
	snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[2]);

	up(&ice->gpio_mutex);
}
예제 #3
0
static int __devinit snd_ice1712_hoontech_init(struct snd_ice1712 *ice)
{
	int box, chn;

	ice->num_total_dacs = 8;
	ice->num_total_adcs = 8;

	ice->spec.hoontech.boxbits[0] = 
	ice->spec.hoontech.boxbits[1] = 
	ice->spec.hoontech.boxbits[2] = 
	ice->spec.hoontech.boxbits[3] = 0;	/* should be already */

	ICE1712_STDSP24_SET_ADDR(ice->spec.hoontech.boxbits, 0);
	ICE1712_STDSP24_CLOCK(ice->spec.hoontech.boxbits, 0, 1);
	ICE1712_STDSP24_0_BOX(ice->spec.hoontech.boxbits, 0);
	ICE1712_STDSP24_0_DAREAR(ice->spec.hoontech.boxbits, 0);

	ICE1712_STDSP24_SET_ADDR(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_CLOCK(ice->spec.hoontech.boxbits, 1, 1);
	ICE1712_STDSP24_1_CHN1(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_1_CHN2(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_1_CHN3(ice->spec.hoontech.boxbits, 1);
	
	ICE1712_STDSP24_SET_ADDR(ice->spec.hoontech.boxbits, 2);
	ICE1712_STDSP24_CLOCK(ice->spec.hoontech.boxbits, 2, 1);
	ICE1712_STDSP24_2_CHN4(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_2_MIDIIN(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_2_MIDI1(ice->spec.hoontech.boxbits, 0);

	ICE1712_STDSP24_SET_ADDR(ice->spec.hoontech.boxbits, 3);
	ICE1712_STDSP24_CLOCK(ice->spec.hoontech.boxbits, 3, 1);
	ICE1712_STDSP24_3_MIDI2(ice->spec.hoontech.boxbits, 0);
	ICE1712_STDSP24_3_MUTE(ice->spec.hoontech.boxbits, 1);
	ICE1712_STDSP24_3_INSEL(ice->spec.hoontech.boxbits, 0);

	/* let's go - activate only functions in first box */
	ice->spec.hoontech.config = 0;
			    /* ICE1712_STDSP24_MUTE |
			       ICE1712_STDSP24_INSEL |
			       ICE1712_STDSP24_DAREAR; */
	ice->spec.hoontech.boxconfig[0] = ICE1712_STDSP24_BOX_CHN1 |
				     ICE1712_STDSP24_BOX_CHN2 |
				     ICE1712_STDSP24_BOX_CHN3 |
				     ICE1712_STDSP24_BOX_CHN4 |
				     ICE1712_STDSP24_BOX_MIDI1 |
				     ICE1712_STDSP24_BOX_MIDI2;
	ice->spec.hoontech.boxconfig[1] = 
	ice->spec.hoontech.boxconfig[2] = 
	ice->spec.hoontech.boxconfig[3] = 0;
	snd_ice1712_stdsp24_darear(ice, (ice->spec.hoontech.config & ICE1712_STDSP24_DAREAR) ? 1 : 0);
	snd_ice1712_stdsp24_mute(ice, (ice->spec.hoontech.config & ICE1712_STDSP24_MUTE) ? 1 : 0);
	snd_ice1712_stdsp24_insel(ice, (ice->spec.hoontech.config & ICE1712_STDSP24_INSEL) ? 1 : 0);
	for (box = 0; box < 4; box++) {
		for (chn = 0; chn < 4; chn++)
			snd_ice1712_stdsp24_box_channel(ice, box, chn, (ice->spec.hoontech.boxconfig[box] & (1 << chn)) ? 1 : 0);
		snd_ice1712_stdsp24_box_midi(ice, box,
				(ice->spec.hoontech.boxconfig[box] & ICE1712_STDSP24_BOX_MIDI1) ? 1 : 0);
		if (ice->spec.hoontech.boxconfig[box] & ICE1712_STDSP24_BOX_MIDI2)
			snd_ice1712_stdsp24_midi2(ice, 1);
	}

	return 0;
}
예제 #4
0
static int __devinit snd_ice1712_hoontech_init(struct snd_ice1712 *ice)
{
	struct hoontech_spec *spec;
	int box, chn;

	ice->num_total_dacs = 8;
	ice->num_total_adcs = 8;

	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
	if (!spec)
		return -ENOMEM;
	ice->spec = spec;

	ICE1712_STDSP24_SET_ADDR(spec->boxbits, 0);
	ICE1712_STDSP24_CLOCK(spec->boxbits, 0, 1);
	ICE1712_STDSP24_0_BOX(spec->boxbits, 0);
	ICE1712_STDSP24_0_DAREAR(spec->boxbits, 0);

	ICE1712_STDSP24_SET_ADDR(spec->boxbits, 1);
	ICE1712_STDSP24_CLOCK(spec->boxbits, 1, 1);
	ICE1712_STDSP24_1_CHN1(spec->boxbits, 1);
	ICE1712_STDSP24_1_CHN2(spec->boxbits, 1);
	ICE1712_STDSP24_1_CHN3(spec->boxbits, 1);
	
	ICE1712_STDSP24_SET_ADDR(spec->boxbits, 2);
	ICE1712_STDSP24_CLOCK(spec->boxbits, 2, 1);
	ICE1712_STDSP24_2_CHN4(spec->boxbits, 1);
	ICE1712_STDSP24_2_MIDIIN(spec->boxbits, 1);
	ICE1712_STDSP24_2_MIDI1(spec->boxbits, 0);

	ICE1712_STDSP24_SET_ADDR(spec->boxbits, 3);
	ICE1712_STDSP24_CLOCK(spec->boxbits, 3, 1);
	ICE1712_STDSP24_3_MIDI2(spec->boxbits, 0);
	ICE1712_STDSP24_3_MUTE(spec->boxbits, 1);
	ICE1712_STDSP24_3_INSEL(spec->boxbits, 0);

	/* let's go - activate only functions in first box */
	spec->config = 0;
			    /* ICE1712_STDSP24_MUTE |
			       ICE1712_STDSP24_INSEL |
			       ICE1712_STDSP24_DAREAR; */
	/*  These boxconfigs have caused problems in the past.
	 *  The code is not optimal, but should now enable a working config to
	 *  be achieved.
	 *  ** MIDI IN can only be configured on one box **
	 *  ICE1712_STDSP24_BOX_MIDI1 needs to be set for that box.
	 *  Tests on a ADAC2000 box suggest the box config flags do not
	 *  work as would be expected, and the inputs are crossed.
	 *  Setting ICE1712_STDSP24_BOX_MIDI1 and ICE1712_STDSP24_BOX_MIDI2
	 *  on the same box connects MIDI-In to both 401 uarts; both outputs
	 *  are then active on all boxes.
	 *  The default config here sets up everything on the first box.
	 *  Alan Horstmann  5.2.2008
	 */
	spec->boxconfig[0] = ICE1712_STDSP24_BOX_CHN1 |
				     ICE1712_STDSP24_BOX_CHN2 |
				     ICE1712_STDSP24_BOX_CHN3 |
				     ICE1712_STDSP24_BOX_CHN4 |
				     ICE1712_STDSP24_BOX_MIDI1 |
				     ICE1712_STDSP24_BOX_MIDI2;
	spec->boxconfig[1] = 
	spec->boxconfig[2] = 
	spec->boxconfig[3] = 0;
	snd_ice1712_stdsp24_darear(ice,
		(spec->config & ICE1712_STDSP24_DAREAR) ? 1 : 0);
	snd_ice1712_stdsp24_mute(ice,
		(spec->config & ICE1712_STDSP24_MUTE) ? 1 : 0);
	snd_ice1712_stdsp24_insel(ice,
		(spec->config & ICE1712_STDSP24_INSEL) ? 1 : 0);
	for (box = 0; box < 4; box++) {
		if (spec->boxconfig[box] & ICE1712_STDSP24_BOX_MIDI2)
                        snd_ice1712_stdsp24_midi2(ice, 1);
		for (chn = 0; chn < 4; chn++)
			snd_ice1712_stdsp24_box_channel(ice, box, chn,
				(spec->boxconfig[box] & (1 << chn)) ? 1 : 0);
		if (spec->boxconfig[box] & ICE1712_STDSP24_BOX_MIDI1)
			snd_ice1712_stdsp24_box_midi(ice, box, 1);
	}

	return 0;
}