From mboxrd@z Thu Jan 1 00:00:00 1970 From: ryan@bluewatersys.com (Ryan Mallon) Date: Wed, 20 Apr 2011 13:10:19 +1200 Subject: [RFC PATCH 15/23] at91: Make AC97 device common In-Reply-To: <1303261827-27730-1-git-send-email-ryan@bluewatersys.com> References: <1303261827-27730-1-git-send-email-ryan@bluewatersys.com> Message-ID: <1303261827-27730-17-git-send-email-ryan@bluewatersys.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Replace the individual AC97 code for each at91 variant with a single implementation in devices.c Signed-off-by: Ryan Mallon --- arch/arm/mach-at91/at91cap9_devices.c | 57 +++++------------------------- arch/arm/mach-at91/at91sam9263_devices.c | 56 +++++------------------------ arch/arm/mach-at91/at91sam9g45_devices.c | 57 +++++------------------------- arch/arm/mach-at91/at91sam9rl_devices.c | 57 +++++------------------------- arch/arm/mach-at91/devices.c | 54 ++++++++++++++++++++++++++++ arch/arm/mach-at91/devices.h | 7 ++++ 6 files changed, 97 insertions(+), 191 deletions(-) diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c index 8fb598b..ae8e118 100644 --- a/arch/arm/mach-at91/at91cap9_devices.c +++ b/arch/arm/mach-at91/at91cap9_devices.c @@ -317,57 +317,17 @@ static struct __initdata at91_dev_table_pwm device_pwm = { * AC97 * -------------------------------------------------------------------- */ -#if defined(CONFIG_SND_ATMEL_AC97C) || defined(CONFIG_SND_ATMEL_AC97C_MODULE) -static u64 ac97_dmamask = DMA_BIT_MASK(32); -static struct ac97c_platform_data ac97_data; - -static struct resource ac97_resources[] = { - [0] = { - .start = AT91CAP9_BASE_AC97C, - .end = AT91CAP9_BASE_AC97C + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = AT91CAP9_ID_AC97C, - .end = AT91CAP9_ID_AC97C, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device at91cap9_ac97_device = { - .name = "atmel_ac97c", - .id = 1, - .dev = { - .dma_mask = &ac97_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &ac97_data, +static struct __initdata at91_dev_table_ac97 device_ac97 = { + .mmio_base = AT91CAP9_BASE_AC97C, + .irq = AT91CAP9_ID_AC97C, + .pins = { + {AT91_PIN_PA6, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97FS */ + {AT91_PIN_PA7, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97CK */ + {AT91_PIN_PA8, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97TX */ + {AT91_PIN_PA9, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97RX */ }, - .resource = ac97_resources, - .num_resources = ARRAY_SIZE(ac97_resources), }; -void __init at91_add_device_ac97(struct ac97c_platform_data *data) -{ - if (!data) - return; - - at91_set_A_periph(AT91_PIN_PA6, 0); /* AC97FS */ - at91_set_A_periph(AT91_PIN_PA7, 0); /* AC97CK */ - at91_set_A_periph(AT91_PIN_PA8, 0); /* AC97TX */ - at91_set_A_periph(AT91_PIN_PA9, 0); /* AC97RX */ - - /* reset */ - if (data->reset_pin) - at91_set_gpio_output(data->reset_pin, 0); - - ac97_data = *data; - platform_device_register(&at91cap9_ac97_device); -} -#else -void __init at91_add_device_ac97(struct ac97c_platform_data *data) {} -#endif - - /* -------------------------------------------------------------------- * LCD Controller * -------------------------------------------------------------------- */ @@ -547,6 +507,7 @@ static struct at91_device_table __initdata at91cap9_device_table = { .pwm = &device_pwm, .ssc[0] = &device_ssc0, .ssc[1] = &device_ssc1, + .ac97 = &device_ac97, }; void __init at91cap9_init_devices(void) diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 3ff223c..6155a9f 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -299,56 +299,17 @@ static struct __initdata at91_dev_table_spi device_spi1 = { * AC97 * -------------------------------------------------------------------- */ -#if defined(CONFIG_SND_ATMEL_AC97C) || defined(CONFIG_SND_ATMEL_AC97C_MODULE) -static u64 ac97_dmamask = DMA_BIT_MASK(32); -static struct ac97c_platform_data ac97_data; - -static struct resource ac97_resources[] = { - [0] = { - .start = AT91SAM9263_BASE_AC97C, - .end = AT91SAM9263_BASE_AC97C + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = AT91SAM9263_ID_AC97C, - .end = AT91SAM9263_ID_AC97C, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device at91sam9263_ac97_device = { - .name = "atmel_ac97c", - .id = 0, - .dev = { - .dma_mask = &ac97_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &ac97_data, +static struct __initdata at91_dev_table_ac97 device_ac97 = { + .mmio_base = AT91SAM9263_BASE_AC97C, + .irq = AT91SAM9263_ID_AC97C, + .pins = { + {AT91_PIN_PB0, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97FS */ + {AT91_PIN_PB1, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97CK */ + {AT91_PIN_PB2, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97TX */ + {AT91_PIN_PB3, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97RX */ }, - .resource = ac97_resources, - .num_resources = ARRAY_SIZE(ac97_resources), }; -void __init at91_add_device_ac97(struct ac97c_platform_data *data) -{ - if (!data) - return; - - at91_set_A_periph(AT91_PIN_PB0, 0); /* AC97FS */ - at91_set_A_periph(AT91_PIN_PB1, 0); /* AC97CK */ - at91_set_A_periph(AT91_PIN_PB2, 0); /* AC97TX */ - at91_set_A_periph(AT91_PIN_PB3, 0); /* AC97RX */ - - /* reset */ - if (data->reset_pin) - at91_set_gpio_output(data->reset_pin, 0); - - ac97_data = *data; - platform_device_register(&at91sam9263_ac97_device); -} -#else -void __init at91_add_device_ac97(struct ac97c_platform_data *data) {} -#endif - /* -------------------------------------------------------------------- * CAN Controller * -------------------------------------------------------------------- */ @@ -656,6 +617,7 @@ static struct at91_device_table __initdata at91sam9263_device_table = { .pwm = &device_pwm, .ssc[0] = &device_ssc0, .ssc[1] = &device_ssc1, + .ac97 = &device_ac97, }; void __init at91sam9263_init_devices(void) diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index fcfb1ca..3f71e45 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c @@ -331,57 +331,17 @@ static struct __initdata at91_dev_table_spi device_spi1 = { * AC97 * -------------------------------------------------------------------- */ -#if defined(CONFIG_SND_ATMEL_AC97C) || defined(CONFIG_SND_ATMEL_AC97C_MODULE) -static u64 ac97_dmamask = DMA_BIT_MASK(32); -static struct ac97c_platform_data ac97_data; - -static struct resource ac97_resources[] = { - [0] = { - .start = AT91SAM9G45_BASE_AC97C, - .end = AT91SAM9G45_BASE_AC97C + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = AT91SAM9G45_ID_AC97C, - .end = AT91SAM9G45_ID_AC97C, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device at91sam9g45_ac97_device = { - .name = "atmel_ac97c", - .id = 0, - .dev = { - .dma_mask = &ac97_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &ac97_data, +static struct __initdata at91_dev_table_ac97 device_ac97 = { + .mmio_base = AT91SAM9G45_BASE_AC97C, + .irq = AT91SAM9G45_ID_AC97C, + .pins = { + {AT91_PIN_PD8, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97FS */ + {AT91_PIN_PD9, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97CK */ + {AT91_PIN_PD7, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97TX */ + {AT91_PIN_PD6, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97RX */ }, - .resource = ac97_resources, - .num_resources = ARRAY_SIZE(ac97_resources), }; -void __init at91_add_device_ac97(struct ac97c_platform_data *data) -{ - if (!data) - return; - - at91_set_A_periph(AT91_PIN_PD8, 0); /* AC97FS */ - at91_set_A_periph(AT91_PIN_PD9, 0); /* AC97CK */ - at91_set_A_periph(AT91_PIN_PD7, 0); /* AC97TX */ - at91_set_A_periph(AT91_PIN_PD6, 0); /* AC97RX */ - - /* reset */ - if (data->reset_pin) - at91_set_gpio_output(data->reset_pin, 0); - - ac97_data = *data; - platform_device_register(&at91sam9g45_ac97_device); -} -#else -void __init at91_add_device_ac97(struct ac97c_platform_data *data) {} -#endif - - /* -------------------------------------------------------------------- * LCD Controller * -------------------------------------------------------------------- */ @@ -705,6 +665,7 @@ static struct at91_device_table __initdata at91sam9g45_device_table = { .pwm = &device_pwm, .ssc[0] = &device_ssc0, .ssc[1] = &device_ssc1, + .ac97 = &device_ac97, }; void __init at91sam9g45_init_devices(void) diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index 606d790..3b6010b 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c @@ -227,57 +227,17 @@ static struct __initdata at91_dev_table_spi device_spi = { * AC97 * -------------------------------------------------------------------- */ -#if defined(CONFIG_SND_ATMEL_AC97C) || defined(CONFIG_SND_ATMEL_AC97C_MODULE) -static u64 ac97_dmamask = DMA_BIT_MASK(32); -static struct ac97c_platform_data ac97_data; - -static struct resource ac97_resources[] = { - [0] = { - .start = AT91SAM9RL_BASE_AC97C, - .end = AT91SAM9RL_BASE_AC97C + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = AT91SAM9RL_ID_AC97C, - .end = AT91SAM9RL_ID_AC97C, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device at91sam9rl_ac97_device = { - .name = "atmel_ac97c", - .id = 0, - .dev = { - .dma_mask = &ac97_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &ac97_data, +static struct __initdata at91_dev_table_ac97 device_ac97 = { + .mmio_base = AT91SAM9RL_BASE_AC97C, + .irq = AT91SAM9RL_ID_AC97C, + .pins = { + {AT91_PIN_PD1, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97FS */ + {AT91_PIN_PD2, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97CK */ + {AT91_PIN_PD3, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97TX */ + {AT91_PIN_PD4, AT91_PIN_PERIPH_A, 0, 0, 0}, /* AC97RX */ }, - .resource = ac97_resources, - .num_resources = ARRAY_SIZE(ac97_resources), }; -void __init at91_add_device_ac97(struct ac97c_platform_data *data) -{ - if (!data) - return; - - at91_set_A_periph(AT91_PIN_PD1, 0); /* AC97FS */ - at91_set_A_periph(AT91_PIN_PD2, 0); /* AC97CK */ - at91_set_A_periph(AT91_PIN_PD3, 0); /* AC97TX */ - at91_set_A_periph(AT91_PIN_PD4, 0); /* AC97RX */ - - /* reset */ - if (data->reset_pin) - at91_set_gpio_output(data->reset_pin, 0); - - ac97_data = *data; - platform_device_register(&at91sam9rl_ac97_device); -} -#else -void __init at91_add_device_ac97(struct ac97c_platform_data *data) {} -#endif - - /* -------------------------------------------------------------------- * LCD Controller * -------------------------------------------------------------------- */ @@ -580,6 +540,7 @@ static struct at91_device_table __initdata at91sam9rl_device_table = { .pwm = &device_pwm, .ssc[0] = &device_ssc0, .ssc[1] = &device_ssc1, + .ac97 = &device_ac97, }; void __init at91sam9rl_init_devices(void) diff --git a/arch/arm/mach-at91/devices.c b/arch/arm/mach-at91/devices.c index 2cab70b..86f0640 100644 --- a/arch/arm/mach-at91/devices.c +++ b/arch/arm/mach-at91/devices.c @@ -1525,6 +1525,60 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) void __init at91_add_device_ssc(unsigned id, unsigned pins) {} #endif +/* -------------------------------------------------------------------- + * AC97 + * -------------------------------------------------------------------- */ + +#if defined(CONFIG_SND_ATMEL_AC97C) || defined(CONFIG_SND_ATMEL_AC97C_MODULE) +static u64 ac97_dmamask = DMA_BIT_MASK(32); +static struct ac97c_platform_data ac97_data; + +static struct resource ac97_resources[] = { + [0] = { + .end = SZ_16K, + .flags = IORESOURCE_MEM, + }, + [1] = { + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device at91_ac97_device = { + .name = "atmel_ac97c", + .id = 0, + .dev = { + .dma_mask = &ac97_dmamask, + .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &ac97_data, + }, + .resource = ac97_resources, + .num_resources = ARRAY_SIZE(ac97_resources), +}; + +void __init at91_add_device_ac97(struct ac97c_platform_data *data) +{ + struct at91_dev_table_ac97 *info = devices->ac97; + + BUG_ON(!info); + init_resource_mem(&ac97_resources[0], info->mmio_base); + init_resource_irq(&ac97_resources[0], info->irq); + + if (!data) + return; + + at91_config_pins(info->pins, ARRAY_SIZE(info->pins)); + + /* reset */ + if (data->reset_pin) + at91_set_gpio_output(data->reset_pin, 0); + + ac97_data = *data; + platform_device_register(&at91sam9g45_ac97_device); +} +#else +void __init at91_add_device_ac97(struct ac97c_platform_data *data) {} +#endif + static int __init at91_add_standard_devices(void) { at91_add_device_tc(); diff --git a/arch/arm/mach-at91/devices.h b/arch/arm/mach-at91/devices.h index 177fc3d..3d6ca83 100644 --- a/arch/arm/mach-at91/devices.h +++ b/arch/arm/mach-at91/devices.h @@ -141,6 +141,12 @@ struct at91_dev_table_ssc { struct at91_pin_config rk_pin; }; +struct at91_dev_table_ac97 { + unsigned mmio_base; + int irq; + struct at91_pin_config pins[4]; /* FS, CK, TX, RX */ +}; + struct at91_device_table { struct at91_dev_table_ethernet *ethernet; struct at91_dev_table_usb_ohci *usbh_ohci; @@ -156,6 +162,7 @@ struct at91_device_table { struct at91_dev_table_uart *uart[6]; struct at91_dev_table_pwm *pwm; struct at91_dev_table_ssc *ssc[4]; + struct at91_dev_table_ac97 *ac97; }; extern void __init at91_init_devices(struct at91_device_table *device_table); -- 1.7.0.4