Commit 4a5920e8 authored by Maxime Ripard's avatar Maxime Ripard Committed by Greg Kroah-Hartman

ARM: AT91: ADC: Add support for the AT91SAM9M10G45-EK board

This patch adds platform data for the AT91 ADC driver support for
the AT91SAM9M10G45-EK board.
Signed-off-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
Acked-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 67b5d7b3
...@@ -176,6 +176,12 @@ static struct clk vdec_clk = { ...@@ -176,6 +176,12 @@ static struct clk vdec_clk = {
.type = CLK_TYPE_PERIPHERAL, .type = CLK_TYPE_PERIPHERAL,
}; };
static struct clk adc_op_clk = {
.name = "adc_op_clk",
.type = CLK_TYPE_PERIPHERAL,
.rate_hz = 13200000,
};
static struct clk *periph_clocks[] __initdata = { static struct clk *periph_clocks[] __initdata = {
&pioA_clk, &pioA_clk,
&pioB_clk, &pioB_clk,
...@@ -204,6 +210,7 @@ static struct clk *periph_clocks[] __initdata = { ...@@ -204,6 +210,7 @@ static struct clk *periph_clocks[] __initdata = {
&isi_clk, &isi_clk,
&udphs_clk, &udphs_clk,
&mmc1_clk, &mmc1_clk,
&adc_op_clk,
// irq0 // irq0
}; };
...@@ -242,6 +249,8 @@ static struct clk_lookup periph_clocks_lookups[] = { ...@@ -242,6 +249,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_ID("pioC", &pioC_clk), CLKDEV_CON_ID("pioC", &pioC_clk),
CLKDEV_CON_ID("pioD", &pioDE_clk), CLKDEV_CON_ID("pioD", &pioDE_clk),
CLKDEV_CON_ID("pioE", &pioDE_clk), CLKDEV_CON_ID("pioE", &pioDE_clk),
/* Fake adc clock */
CLKDEV_CON_ID("adc_clk", &tsc_clk),
}; };
static struct clk_lookup usart_clocks_lookups[] = { static struct clk_lookup usart_clocks_lookups[] = {
......
...@@ -19,9 +19,12 @@ ...@@ -19,9 +19,12 @@
#include <linux/i2c-gpio.h> #include <linux/i2c-gpio.h>
#include <linux/atmel-mci.h> #include <linux/atmel-mci.h>
#include <linux/platform_data/at91_adc.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <video/atmel_lcdc.h> #include <video/atmel_lcdc.h>
#include <mach/at91_adc.h>
#include <mach/board.h> #include <mach/board.h>
#include <mach/at91sam9g45.h> #include <mach/at91sam9g45.h>
#include <mach/at91sam9g45_matrix.h> #include <mach/at91sam9g45_matrix.h>
...@@ -1206,6 +1209,104 @@ void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data) {} ...@@ -1206,6 +1209,104 @@ void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data) {}
#endif #endif
/* --------------------------------------------------------------------
* ADC
* -------------------------------------------------------------------- */
#if IS_ENABLED(CONFIG_AT91_ADC)
static struct at91_adc_data adc_data;
static struct resource adc_resources[] = {
[0] = {
.start = AT91SAM9G45_BASE_TSC,
.end = AT91SAM9G45_BASE_TSC + SZ_16K - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = AT91SAM9G45_ID_TSC,
.end = AT91SAM9G45_ID_TSC,
.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),
};
static struct at91_adc_trigger at91_adc_triggers[] = {
[0] = {
.name = "external-rising",
.value = 1,
.is_external = true,
},
[1] = {
.name = "external-falling",
.value = 2,
.is_external = true,
},
[2] = {
.name = "external-any",
.value = 3,
.is_external = true,
},
[3] = {
.name = "continuous",
.value = 6,
.is_external = false,
},
};
static struct at91_adc_reg_desc at91_adc_register_g45 = {
.channel_base = AT91_ADC_CHR(0),
.drdy_mask = AT91_ADC_DRDY,
.status_register = AT91_ADC_SR,
.trigger_register = 0x08,
};
void __init at91_add_device_adc(struct at91_adc_data *data)
{
if (!data)
return;
if (test_bit(0, &data->channels_used))
at91_set_gpio_input(AT91_PIN_PD20, 0);
if (test_bit(1, &data->channels_used))
at91_set_gpio_input(AT91_PIN_PD21, 0);
if (test_bit(2, &data->channels_used))
at91_set_gpio_input(AT91_PIN_PD22, 0);
if (test_bit(3, &data->channels_used))
at91_set_gpio_input(AT91_PIN_PD23, 0);
if (test_bit(4, &data->channels_used))
at91_set_gpio_input(AT91_PIN_PD24, 0);
if (test_bit(5, &data->channels_used))
at91_set_gpio_input(AT91_PIN_PD25, 0);
if (test_bit(6, &data->channels_used))
at91_set_gpio_input(AT91_PIN_PD26, 0);
if (test_bit(7, &data->channels_used))
at91_set_gpio_input(AT91_PIN_PD27, 0);
if (data->use_external_triggers)
at91_set_A_periph(AT91_PIN_PD28, 0);
data->num_channels = 8;
data->startup_time = 40;
data->registers = &at91_adc_register_g45;
data->trigger_number = 4;
data->trigger_list = at91_adc_triggers;
adc_data = *data;
platform_device_register(&at91_adc_device);
}
#else
void __init at91_add_device_adc(struct at91_adc_data *data) {}
#endif
/* -------------------------------------------------------------------- /* --------------------------------------------------------------------
* RTT * RTT
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
......
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
#include <linux/atmel-mci.h> #include <linux/atmel-mci.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/platform_data/at91_adc.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <video/atmel_lcdc.h> #include <video/atmel_lcdc.h>
#include <media/soc_camera.h> #include <media/soc_camera.h>
...@@ -315,6 +317,14 @@ static struct at91_tsadcc_data ek_tsadcc_data = { ...@@ -315,6 +317,14 @@ static struct at91_tsadcc_data ek_tsadcc_data = {
.ts_sample_hold_time = 0x0a, .ts_sample_hold_time = 0x0a,
}; };
/*
* ADCs
*/
static struct at91_adc_data ek_adc_data = {
.channels_used = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) | BIT(6) | BIT(7),
.use_external_triggers = true,
.vref = 3300,
};
/* /*
* GPIO Buttons * GPIO Buttons
...@@ -480,6 +490,8 @@ static void __init ek_board_init(void) ...@@ -480,6 +490,8 @@ static void __init ek_board_init(void)
at91_add_device_lcdc(&ek_lcdc_data); at91_add_device_lcdc(&ek_lcdc_data);
/* Touch Screen */ /* Touch Screen */
at91_add_device_tsadcc(&ek_tsadcc_data); at91_add_device_tsadcc(&ek_tsadcc_data);
/* ADC */
at91_add_device_adc(&ek_adc_data);
/* Push Buttons */ /* Push Buttons */
ek_add_device_buttons(); ek_add_device_buttons();
/* AC97 */ /* AC97 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment