AT91: Add a driver for the ADC
Subsystems (4)
PATCH v11 1/1 AT91: Add a driver for the ADC
Hi all,
As suggested by Arnd, I moved the platform data from the board.h additions in the first patch to a new include/linux/platform_data/at91_adc.h file for this version.
Maxime
PATCH 1/3 ARM: AT91: Add platform data for the ADCs
--- include/linux/platform_data/at91_adc.h | 36 ++++++++++++++++++++++++++++++++ 1 files changed, 36 insertions(+), 0 deletions(-) create mode 100644 include/linux/platform_data/at91_adc.h
include/linux/platform_data/at91_adc.h new file +36 -0
@@ -0,0 +1,36 @@ +/* +* Copyright (C) 2011 Free Electrons +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* 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. +* +*/ + +#ifndef _AT91_ADC_H_ +#define _AT91_ADC_H_ + +struct at91_adc_data { +/* ADC Clock as specified by the datasheet, in Hz. */ +unsigned int adc_clock; +/* +* Global number of channels available (to specify which channels are +* indeed used on the board, see the channels_used bitmask). +*/ +u8 num_channels; +/* Channels in use on the board as a bitmask */ +unsigned long channels_used; +/* Startup time of the ADC, in microseconds. */ +u8 startup_time; +/* Reference voltage for the ADC in millivolts */ +unsigned short vref; +}; + +extern void __init at91_add_device_adc (struct at91_adc_data *data); + +#endif
Signature · 1 line
1.7.4.1
PATCH 1/3 ARM: AT91: Add platform data for the ADCs
Hi Maxime,
On 11/30/2011 10:15 AM, Maxime Ripard :
Quoted 2 lines
Cc Patrice Vilchez<[email protected]>Cc Thomas Petazzoni<[email protected]>
"CC:" lines should not be located here: place them just *after* "Signed-off-by:" and "Acked-by:" lines.
Quoted 16 lines
Signed-off-by Maxime Ripard<[email protected]>Acked-by Jonathan Cameron<[email protected]>Signed-off-by Nicolas Ferre<[email protected]>--- include/linux/platform_data/at91_adc.h | 36 ++++++++++++++++++++++++++++++++ 1 files changed, 36 insertions(+), 0 deletions(-)create mode 100644
include/linux/platform_data/at91_adc.hinclude/linux/platform_data/at91_adc.h new file +1
-0@@ -0,0 +1,36 @@ +/*
include/linux/platform_data/at91_adc.h line 11
Quoted 10 lines
include/linux/platform_data/at91_adc.h new file +10
-0+* Copyright (C) 2011 Free Electrons +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* 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.
Can be shorten in:
"Licensed under GPLv2."
"Licensed under the GPL v2."
"License terms: GNU General Public License (GPL) version 2."
Quoted 15 lines
include/linux/platform_data/at91_adc.h new file +15
-0+* +*/ + +#ifndef _AT91_ADC_H_ +#define _AT91_ADC_H_ + +struct at91_adc_data { + /* ADC Clock as specified by the datasheet, in Hz. */ + unsigned int adc_clock; + /* + * Global number of channels available (to specify which channels are + * indeed used on the board, see the channels_used bitmask). + */ + u8 num_channels; + /* Channels in use on the board as a bitmask */
include/linux/platform_data/at91_adc.h line 36
Quoted 10 lines
include/linux/platform_data/at91_adc.h new file +10
-0+unsigned long channels_used; +/* Startup time of the ADC, in microseconds. */ +u8 startup_time; +/* Reference voltage for the ADC in millivolts */ + unsigned short vref; +}; + +extern void __init at91_add_device_adc (struct at91_adc_data *data); + +#endif
I think that now it is located at this generic directory, it can easily go mainline through IIO subsystem (patches 1 and 2/3): Jonathan, do you agree with this?
Best regards,
Signature · 1 line
Nicolas Ferre
PATCH 2/3 ARM: AT91: IIO: Add AT91 ADC driver.
In reply to Maxime Ripard--- drivers/iio/adc/Kconfig | 6 + drivers/iio/adc/Makefile | 4 +- drivers/iio/adc/at91_adc.c | 333 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 342 insertions(+), 1 deletions(-) create mode 100644 drivers/iio/adc/at91_adc.c
drivers/iio/adc/Kconfig +6 -0
@@ -14,6 +14,12 @@ config IIO_AD799X i2c analog to digital convertors (ADC). Provides direct access via sysfs. +config IIO_AT91_ADC + tristate "Atmel AT91 ADC" + depends on SYSFS && ARCH_AT91 + help + Say yes here to build support for Atmel AT91 ADC. + config IIO_MAX1363 tristate "Maxim max1363 ADC driver" depends on I2C
drivers/iio/adc/Makefile +3 -1
@@ -6,4 +6,6 @@ iio_ad799x-y := ad799x_core.o obj-$(CONFIG_IIO_AD799X) += iio_ad799x.o iio_max1363-y := max1363_core.o -obj-$(CONFIG_IIO_MAX1363) += iio_max1363.o +obj-$(CONFIG_IIO_MAX1363) += iio_max1363.o + +obj-$(CONFIG_IIO_AT91_ADC) += at91_adc.o
drivers/iio/adc/at91_adc.c new file +333 -0
333 lines not on this page · raw message
Signature · 1 line
1.7.4.1
PATCH 2/3 ARM: AT91: IIO: Add AT91 ADC driver.
Quoted 8 lines · Maxime Ripard
Cc Patrice Vilchez <[email protected]>Cc Thomas Petazzoni <[email protected]>Signed-off-by Maxime Ripard <[email protected]>Acked-by Jonathan Cameron <[email protected]>Acked-by Nicolas Ferre <[email protected]>Reviewed-by Marek Vasut <[email protected]>
PATCH 3/3 ARM: AT91: Add the ADC to the sam9g20ek board
In reply to Maxime Ripard--- arch/arm/mach-at91/at91sam9260_devices.c | 62 ++++++++++++++++++++++++++++++ arch/arm/mach-at91/board-sam9g20ek.c | 13 ++++++ 2 files changed, 75 insertions(+), 0 deletions(-)
arch/arm/mach-at91/at91sam9260_devices.c +62 -0
@@ -16,6 +16,8 @@#include <linux/platform_device.h> #include <linux/i2c-gpio.h> +#include <linux/platform_data/at91_adc.h> +#include <mach/board.h> #include <mach/gpio.h> #include <mach/cpu.h>
@@ -1312,6 +1314,66 @@ void __init at91_add_device_cf(struct at91_cf_data *data)void __init at91_add_device_cf (struct at91_cf_data * data) {}#endif +/* -------------------------------------------------------------------- +* ADCs +* -------------------------------------------------------------------- */ + +#if defined(CONFIG_IIO_AT91_ADC ) || defined(CONFIG_IIO_AT91_ADC_MODULE ) +static struct at91_adc_data adc_data; + +static struct resource adc_resources[] = { + [0 ] = { + .start =AT91SAM9260_BASE_ADC , + .end =AT91SAM9260_BASE_ADC +SZ_16K -1 , + .flags =IORESOURCE_MEM , + }, + [1 ] = { + .start =AT91SAM9260_ID_ADC , + .end =AT91SAM9260_ID_ADC , + .flags =IORESOURCE_IRQ , + }, +}; + +static struct platform_device at91_adc_device = { + .name ="at91_adc" , + .id =-1 , + .dev = { + .platform_data = &adc_data, + }, + .resource = adc_resources, + .num_resources =ARRAY_SIZE (adc_resources), +}; + +void __init at91_add_device_adc (struct at91_adc_data *data) +{ +if (!data) +return ; + +if (test_bit (0 , &data->channels_used)) +at91_set_A_periph (AT91_PIN_PC0 ,0 ); +if (test_bit (1 , &data->channels_used)) +at91_set_A_periph (AT91_PIN_PC1 ,0 ); +if (test_bit (2 , &data->channels_used)) +at91_set_A_periph (AT91_PIN_PC2 ,0 ); +if (test_bit (3 , &data->channels_used)) +at91_set_A_periph (AT91_PIN_PC3 ,0 ); + +/* +* The electrical characteristics part of the AT91SAM9G20 datasheet +* sets the ADC clock to 5MHz. +*/ + data->adc_clock =5000000 ; + + data->num_channels =4 ; + data->startup_time =10 ; + + adc_data = *data; +platform_device_register (&at91_adc_device); +} +#else +void __init at91_add_device_adc (struct at91_adc_data *data) {} +#endif +/* -------------------------------------------------------------------- */ /* * These devices are always present and don't need any board-specific
arch/arm/mach-at91/board-sam9g20ek.c +13 -0
@@ -31,6 +31,8 @@#include <linux/regulator/fixed.h> #include <linux/regulator/consumer.h> +#include <linux/platform_data/at91_adc.h> +#include <mach/hardware.h> #include <asm/setup.h> #include <asm/mach-types.h>
@@ -314,6 +316,15 @@ static void __init ek_add_device_buttons(void)static void __init ek_add_device_buttons (void ) {}#endif +/* +* ADCs +*/ + +static struct at91_adc_data ek_adc_data = { + .channels_used =BIT (0 ) |BIT (1 ) |BIT (2 ) |BIT (3 ), + .vref =3300 , +}; +#if defined(CONFIG_REGULATOR_FIXED_VOLTAGE ) || defined(CONFIG_REGULATOR_FIXED_VOLTAGE_MODULE )static struct regulator_consumer_supply ek_audio_consumer_supplies[] = { REGULATOR_SUPPLY("AVDD", "0-001b"),
@@ -389,6 +400,8 @@ static void __init ek_board_init(void)ek_add_device_gpio_leds ();/* Push Buttons */ ek_add_device_buttons (); +/* ADCs */ +at91_add_device_adc (&ek_adc_data);/* PCK0 provides MCLK to the WM8731 */ at91_set_B_periph (AT91_PIN_PC1 ,0 );/* SSC (for WM8731) */
Signature · 1 line
1.7.4.1