Le Wed, 19 Oct 2011 18:18:54 +0200, Maxime Ripard <maxime.ripard@xxxxxxxxxxxxxxxxxx> a écrit : > +void __init at91_add_device_adc(struct at91_adc_data *data) > +{ > + if (!data) > + return; > + > + at91_set_A_periph(AT91_PIN_PC0, 0); > + at91_set_A_periph(AT91_PIN_PC1, 0); > + at91_set_A_periph(AT91_PIN_PC2, 0); > + at91_set_A_periph(AT91_PIN_PC3, 0); As suggested, the decision of which ADC channels are used and therefore which pins should be muxed to function A is a board-specific decision and should not be enforced by SoC code. > +static struct at91_adc_data ek_adc_data = { > + .channels = 4, > + .adc_clock = 5000000, > + .startup_time = 10, > +}; And on the opposite, those informations are specific to a SoC, not to a board. So to avoid duplication in all board files, they should be moved to the corresponding SoC file. Maybe something like: #define AT91_ADC_MAX_CHANNELS 8 struct at91_adc_data { unsigned int adc_clock; u8 channels_used[AT91_ADC_MAX_CHANNELS]; u8 startup_time; u8 channels; }; at91_add_device_adc() { if (data->channels_used[0]) at91_set_A_periph(AT91_PIN_PC0, 0); if (data->channels_used[1]) at91_set_A_periph(AT91_PIN_PC1, 0); if (data->channels_used[2]) at91_set_A_periph(AT91_PIN_PC2, 0); if (data->channels_used[3]) at91_set_A_periph(AT91_PIN_PC3, 0); data->startup_time = ... data->channels = ... data->adc_clock = ... } and the board file would do: struct at91_adc_data ek_adc_data = { .channels_used = { 1, 0, 1, 1 },; }; Or maybe others have different suggestions ? Regards, Thomas -- Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html