diff options
| author | David S. Miller <davem@davemloft.net> | 2012-11-10 18:32:51 -0500 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2012-11-10 18:32:51 -0500 | 
| commit | d4185bbf62a5d8d777ee445db1581beb17882a07 (patch) | |
| tree | 024b0badbd7c970b1983be6d8c345cc4a290cb31 /sound/pci/rme9652 | |
| parent | c075b13098b399dc565b4d53f42047a8d40ed3ba (diff) | |
| parent | a375413311b39005ef281bfd71ae8f4e3df22e97 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
	drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
Minor conflict between the BCM_CNIC define removal in net-next
and a bug fix added to net.  Based upon a conflict resolution
patch posted by Stephen Rothwell.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'sound/pci/rme9652')
| -rw-r--r-- | sound/pci/rme9652/hdspm.c | 234 | 
1 files changed, 139 insertions, 95 deletions
| diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c index b12308b5ba2a..f1cd1e387801 100644 --- a/sound/pci/rme9652/hdspm.c +++ b/sound/pci/rme9652/hdspm.c @@ -971,6 +971,7 @@ static inline void snd_hdspm_initialize_midi_flush(struct hdspm *hdspm);  static int hdspm_update_simple_mixer_controls(struct hdspm *hdspm);  static int hdspm_autosync_ref(struct hdspm *hdspm);  static int snd_hdspm_set_defaults(struct hdspm *hdspm); +static int hdspm_system_clock_mode(struct hdspm *hdspm);  static void hdspm_set_sgbuf(struct hdspm *hdspm,  			    struct snd_pcm_substream *substream,  			     unsigned int reg, int channels); @@ -1989,10 +1990,14 @@ static int hdspm_get_system_sample_rate(struct hdspm *hdspm)  	rate = hdspm_calc_dds_value(hdspm, period);  	if (rate > 207000) { -		/* Unreasonable high sample rate as seen on PCI MADI cards. -		 * Use the cached value instead. -		 */ -		rate = hdspm->system_sample_rate; +		/* Unreasonable high sample rate as seen on PCI MADI cards. */ +		if (0 == hdspm_system_clock_mode(hdspm)) { +			/* master mode, return internal sample rate */ +			rate = hdspm->system_sample_rate; +		} else { +			/* slave mode, return external sample rate */ +			rate = hdspm_external_sample_rate(hdspm); +		}  	}  	return rate; @@ -2000,12 +2005,14 @@ static int hdspm_get_system_sample_rate(struct hdspm *hdspm)  #define HDSPM_SYSTEM_SAMPLE_RATE(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .access = SNDRV_CTL_ELEM_ACCESS_READ, \ -  .info = snd_hdspm_info_system_sample_rate, \ -  .get = snd_hdspm_get_system_sample_rate \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\ +		SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ +	.info = snd_hdspm_info_system_sample_rate, \ +	.put = snd_hdspm_put_system_sample_rate, \ +	.get = snd_hdspm_get_system_sample_rate \  }  static int snd_hdspm_info_system_sample_rate(struct snd_kcontrol *kcontrol, @@ -2030,6 +2037,16 @@ static int snd_hdspm_get_system_sample_rate(struct snd_kcontrol *kcontrol,  	return 0;  } +static int snd_hdspm_put_system_sample_rate(struct snd_kcontrol *kcontrol, +					    struct snd_ctl_elem_value * +					    ucontrol) +{ +	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); + +	hdspm_set_dds_value(hdspm, ucontrol->value.enumerated.item[0]); +	return 0; +} +  /**   * Returns the WordClock sample rate class for the given card. @@ -2163,6 +2180,7 @@ static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,  				hdspm_get_s1_sample_rate(hdspm,  						kcontrol->private_value-1);  		} +		break;  	case AIO:  		switch (kcontrol->private_value) { @@ -2183,6 +2201,7 @@ static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,  				hdspm_get_s1_sample_rate(hdspm,  						ucontrol->id.index-1);  		} +		break;  	case AES32: @@ -2204,8 +2223,23 @@ static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,  				hdspm_get_s1_sample_rate(hdspm,  						kcontrol->private_value-1);  			break; +		} +		break; +	case MADI: +	case MADIface: +		{ +			int rate = hdspm_external_sample_rate(hdspm); +			int i, selected_rate = 0; +			for (i = 1; i < 10; i++) +				if (HDSPM_bit2freq(i) == rate) { +					selected_rate = i; +					break; +				} +			ucontrol->value.enumerated.item[0] = selected_rate;  		} +		break; +  	default:  		break;  	} @@ -2430,7 +2464,7 @@ static int snd_hdspm_put_clock_source(struct snd_kcontrol *kcontrol,  #define HDSPM_PREF_SYNC_REF(xname, xindex) \ -{.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \  	.name = xname, \  	.index = xindex, \  	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\ @@ -2766,12 +2800,12 @@ static int snd_hdspm_put_pref_sync_ref(struct snd_kcontrol *kcontrol,  #define HDSPM_AUTOSYNC_REF(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .access = SNDRV_CTL_ELEM_ACCESS_READ, \ -  .info = snd_hdspm_info_autosync_ref, \ -  .get = snd_hdspm_get_autosync_ref, \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.access = SNDRV_CTL_ELEM_ACCESS_READ, \ +	.info = snd_hdspm_info_autosync_ref, \ +	.get = snd_hdspm_get_autosync_ref, \  }  static int hdspm_autosync_ref(struct hdspm *hdspm) @@ -2855,12 +2889,12 @@ static int snd_hdspm_get_autosync_ref(struct snd_kcontrol *kcontrol,  #define HDSPM_LINE_OUT(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .info = snd_hdspm_info_line_out, \ -  .get = snd_hdspm_get_line_out, \ -  .put = snd_hdspm_put_line_out \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.info = snd_hdspm_info_line_out, \ +	.get = snd_hdspm_get_line_out, \ +	.put = snd_hdspm_put_line_out \  }  static int hdspm_line_out(struct hdspm * hdspm) @@ -2912,12 +2946,12 @@ static int snd_hdspm_put_line_out(struct snd_kcontrol *kcontrol,  #define HDSPM_TX_64(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .info = snd_hdspm_info_tx_64, \ -  .get = snd_hdspm_get_tx_64, \ -  .put = snd_hdspm_put_tx_64 \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.info = snd_hdspm_info_tx_64, \ +	.get = snd_hdspm_get_tx_64, \ +	.put = snd_hdspm_put_tx_64 \  }  static int hdspm_tx_64(struct hdspm * hdspm) @@ -2968,12 +3002,12 @@ static int snd_hdspm_put_tx_64(struct snd_kcontrol *kcontrol,  #define HDSPM_C_TMS(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .info = snd_hdspm_info_c_tms, \ -  .get = snd_hdspm_get_c_tms, \ -  .put = snd_hdspm_put_c_tms \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.info = snd_hdspm_info_c_tms, \ +	.get = snd_hdspm_get_c_tms, \ +	.put = snd_hdspm_put_c_tms \  }  static int hdspm_c_tms(struct hdspm * hdspm) @@ -3024,12 +3058,12 @@ static int snd_hdspm_put_c_tms(struct snd_kcontrol *kcontrol,  #define HDSPM_SAFE_MODE(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .info = snd_hdspm_info_safe_mode, \ -  .get = snd_hdspm_get_safe_mode, \ -  .put = snd_hdspm_put_safe_mode \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.info = snd_hdspm_info_safe_mode, \ +	.get = snd_hdspm_get_safe_mode, \ +	.put = snd_hdspm_put_safe_mode \  }  static int hdspm_safe_mode(struct hdspm * hdspm) @@ -3080,12 +3114,12 @@ static int snd_hdspm_put_safe_mode(struct snd_kcontrol *kcontrol,  #define HDSPM_EMPHASIS(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .info = snd_hdspm_info_emphasis, \ -  .get = snd_hdspm_get_emphasis, \ -  .put = snd_hdspm_put_emphasis \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.info = snd_hdspm_info_emphasis, \ +	.get = snd_hdspm_get_emphasis, \ +	.put = snd_hdspm_put_emphasis \  }  static int hdspm_emphasis(struct hdspm * hdspm) @@ -3136,12 +3170,12 @@ static int snd_hdspm_put_emphasis(struct snd_kcontrol *kcontrol,  #define HDSPM_DOLBY(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .info = snd_hdspm_info_dolby, \ -  .get = snd_hdspm_get_dolby, \ -  .put = snd_hdspm_put_dolby \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.info = snd_hdspm_info_dolby, \ +	.get = snd_hdspm_get_dolby, \ +	.put = snd_hdspm_put_dolby \  }  static int hdspm_dolby(struct hdspm * hdspm) @@ -3192,12 +3226,12 @@ static int snd_hdspm_put_dolby(struct snd_kcontrol *kcontrol,  #define HDSPM_PROFESSIONAL(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .info = snd_hdspm_info_professional, \ -  .get = snd_hdspm_get_professional, \ -  .put = snd_hdspm_put_professional \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.info = snd_hdspm_info_professional, \ +	.get = snd_hdspm_get_professional, \ +	.put = snd_hdspm_put_professional \  }  static int hdspm_professional(struct hdspm * hdspm) @@ -3247,12 +3281,12 @@ static int snd_hdspm_put_professional(struct snd_kcontrol *kcontrol,  }  #define HDSPM_INPUT_SELECT(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .info = snd_hdspm_info_input_select, \ -  .get = snd_hdspm_get_input_select, \ -  .put = snd_hdspm_put_input_select \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.info = snd_hdspm_info_input_select, \ +	.get = snd_hdspm_get_input_select, \ +	.put = snd_hdspm_put_input_select \  }  static int hdspm_input_select(struct hdspm * hdspm) @@ -3319,12 +3353,12 @@ static int snd_hdspm_put_input_select(struct snd_kcontrol *kcontrol,  #define HDSPM_DS_WIRE(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .info = snd_hdspm_info_ds_wire, \ -  .get = snd_hdspm_get_ds_wire, \ -  .put = snd_hdspm_put_ds_wire \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.info = snd_hdspm_info_ds_wire, \ +	.get = snd_hdspm_get_ds_wire, \ +	.put = snd_hdspm_put_ds_wire \  }  static int hdspm_ds_wire(struct hdspm * hdspm) @@ -3391,12 +3425,12 @@ static int snd_hdspm_put_ds_wire(struct snd_kcontrol *kcontrol,  #define HDSPM_QS_WIRE(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .name = xname, \ -  .index = xindex, \ -  .info = snd_hdspm_info_qs_wire, \ -  .get = snd_hdspm_get_qs_wire, \ -  .put = snd_hdspm_put_qs_wire \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.name = xname, \ +	.index = xindex, \ +	.info = snd_hdspm_info_qs_wire, \ +	.get = snd_hdspm_get_qs_wire, \ +	.put = snd_hdspm_put_qs_wire \  }  static int hdspm_qs_wire(struct hdspm * hdspm) @@ -3563,15 +3597,15 @@ static int snd_hdspm_put_madi_speedmode(struct snd_kcontrol *kcontrol,  }  #define HDSPM_MIXER(xname, xindex) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ -  .name = xname, \ -  .index = xindex, \ -  .device = 0, \ -  .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \ -		 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ -  .info = snd_hdspm_info_mixer, \ -  .get = snd_hdspm_get_mixer, \ -  .put = snd_hdspm_put_mixer \ +{	.iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ +	.name = xname, \ +	.index = xindex, \ +	.device = 0, \ +	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \ +		SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ +	.info = snd_hdspm_info_mixer, \ +	.get = snd_hdspm_get_mixer, \ +	.put = snd_hdspm_put_mixer \  }  static int snd_hdspm_info_mixer(struct snd_kcontrol *kcontrol, @@ -3670,12 +3704,12 @@ static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol,  */  #define HDSPM_PLAYBACK_MIXER \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ -  .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \ -		 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ -  .info = snd_hdspm_info_playback_mixer, \ -  .get = snd_hdspm_get_playback_mixer, \ -  .put = snd_hdspm_put_playback_mixer \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ +	.access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \ +		SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ +	.info = snd_hdspm_info_playback_mixer, \ +	.get = snd_hdspm_get_playback_mixer, \ +	.put = snd_hdspm_put_playback_mixer \  }  static int snd_hdspm_info_playback_mixer(struct snd_kcontrol *kcontrol, @@ -3851,12 +3885,17 @@ static int hdspm_sync_in_sync_check(struct hdspm *hdspm)  		break;  	case MADI: -	case AES32: -		status = hdspm_read(hdspm, HDSPM_statusRegister2); +		status = hdspm_read(hdspm, HDSPM_statusRegister);  		lock = (status & HDSPM_syncInLock) ? 1 : 0;  		sync = (status & HDSPM_syncInSync) ? 1 : 0;  		break; +	case AES32: +		status = hdspm_read(hdspm, HDSPM_statusRegister2); +		lock = (status & 0x100000) ? 1 : 0; +		sync = (status & 0x200000) ? 1 : 0; +		break; +  	case MADIface:  		break;  	} @@ -3942,6 +3981,7 @@ static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,  		default:  			val = hdspm_s1_sync_check(hdspm, ucontrol->id.index-1);  		} +		break;  	case AIO:  		switch (kcontrol->private_value) { @@ -3954,6 +3994,7 @@ static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,  		default:  			val = hdspm_s1_sync_check(hdspm, ucontrol->id.index-1);  		} +		break;  	case MADI:  		switch (kcontrol->private_value) { @@ -3966,6 +4007,7 @@ static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,  		case 3: /* SYNC_IN */  			val = hdspm_sync_in_sync_check(hdspm); break;  		} +		break;  	case MADIface:  		val = hdspm_madi_sync_check(hdspm); /* MADI */ @@ -3983,6 +4025,7 @@ static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,  			 val = hdspm_aes_sync_check(hdspm,  					 kcontrol->private_value-1);  		} +		break;  	} @@ -4427,9 +4470,10 @@ static struct snd_kcontrol_new snd_hdspm_controls_madi[] = {  	HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),  	HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),  	HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0), +	HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),  	HDSPM_SYNC_CHECK("WC SyncCheck", 0),  	HDSPM_SYNC_CHECK("MADI SyncCheck", 1), -	HDSPM_SYNC_CHECK("TCO SyncCHeck", 2), +	HDSPM_SYNC_CHECK("TCO SyncCheck", 2),  	HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 3),  	HDSPM_LINE_OUT("Line Out", 0),  	HDSPM_TX_64("TX 64 channels mode", 0), | 
