Skip to contentSkip to conversation

AT91: Add a driver for the ADC

PATCH Superseded Maxime Ripard 3 participants 6 messages Nov 30, 2011

Subsystems (4)

v11 of 13 Superseded Latest is v13 →

lore
Share & tools
lore
#0 lore raw

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

Cc Nicolas Ferre <[email protected]>
Cc Patrice Vilchez <[email protected]>
Cc Thomas Petazzoni <[email protected]>
#1 lore raw

PATCH 1/3 ARM: AT91: Add platform data for the ADCs

Cc Patrice Vilchez <[email protected]>
Cc Thomas Petazzoni <[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.h
include/linux/platform_data/at91_adc.h new file +36 -0
new file mode 100644
index 0000000..1e1813d
@@ -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
#2 lore raw

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
---
  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 +1 -0
new file mode 100644
index 0000000..1e1813d
@@ -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
#3 lore raw

PATCH 2/3 ARM: AT91: IIO: Add AT91 ADC driver.

In reply to Maxime Ripard
Cc Patrice Vilchez <[email protected]>
Cc Thomas Petazzoni <[email protected]>
---
 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
index 3d97b21..02ed274 100644
@@ -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
index c197334..50ceaab7 100644
@@ -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
\ No newline at end of file
+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
#5 lore raw

PATCH 3/3 ARM: AT91: Add the ADC to the sam9g20ek board

In reply to Maxime Ripard
Cc Patrice Vilchez <[email protected]>
Cc Thomas Petazzoni <[email protected]>
---
 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
index 39f81f4..012992b 100644
@@ -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
index 817f59d..29dae9f 100644
@@ -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