diff options
Diffstat (limited to 'arch/avr32/mach-at32ap/at32ap700x.c')
-rw-r--r-- | arch/avr32/mach-at32ap/at32ap700x.c | 112 |
1 files changed, 79 insertions, 33 deletions
diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c index 3fbfd1e32a9e..7cc653798327 100644 --- a/arch/avr32/mach-at32ap/at32ap700x.c +++ b/arch/avr32/mach-at32ap/at32ap700x.c | |||
@@ -26,6 +26,9 @@ | |||
26 | #include <mach/portmux.h> | 26 | #include <mach/portmux.h> |
27 | #include <mach/sram.h> | 27 | #include <mach/sram.h> |
28 | 28 | ||
29 | #include <sound/atmel-abdac.h> | ||
30 | #include <sound/atmel-ac97c.h> | ||
31 | |||
29 | #include <video/atmel_lcdc.h> | 32 | #include <video/atmel_lcdc.h> |
30 | 33 | ||
31 | #include "clock.h" | 34 | #include "clock.h" |
@@ -963,56 +966,68 @@ static struct resource atmel_usart3_resource[] = { | |||
963 | DEFINE_DEV_DATA(atmel_usart, 3); | 966 | DEFINE_DEV_DATA(atmel_usart, 3); |
964 | DEV_CLK(usart, atmel_usart3, pba, 6); | 967 | DEV_CLK(usart, atmel_usart3, pba, 6); |
965 | 968 | ||
966 | static inline void configure_usart0_pins(void) | 969 | static inline void configure_usart0_pins(int flags) |
967 | { | 970 | { |
968 | u32 pin_mask = (1 << 8) | (1 << 9); /* RXD & TXD */ | 971 | u32 pin_mask = (1 << 8) | (1 << 9); /* RXD & TXD */ |
972 | if (flags & ATMEL_USART_RTS) pin_mask |= (1 << 6); | ||
973 | if (flags & ATMEL_USART_CTS) pin_mask |= (1 << 7); | ||
974 | if (flags & ATMEL_USART_CLK) pin_mask |= (1 << 10); | ||
969 | 975 | ||
970 | select_peripheral(PIOA, pin_mask, PERIPH_B, AT32_GPIOF_PULLUP); | 976 | select_peripheral(PIOA, pin_mask, PERIPH_B, AT32_GPIOF_PULLUP); |
971 | } | 977 | } |
972 | 978 | ||
973 | static inline void configure_usart1_pins(void) | 979 | static inline void configure_usart1_pins(int flags) |
974 | { | 980 | { |
975 | u32 pin_mask = (1 << 17) | (1 << 18); /* RXD & TXD */ | 981 | u32 pin_mask = (1 << 17) | (1 << 18); /* RXD & TXD */ |
982 | if (flags & ATMEL_USART_RTS) pin_mask |= (1 << 19); | ||
983 | if (flags & ATMEL_USART_CTS) pin_mask |= (1 << 20); | ||
984 | if (flags & ATMEL_USART_CLK) pin_mask |= (1 << 16); | ||
976 | 985 | ||
977 | select_peripheral(PIOA, pin_mask, PERIPH_A, AT32_GPIOF_PULLUP); | 986 | select_peripheral(PIOA, pin_mask, PERIPH_A, AT32_GPIOF_PULLUP); |
978 | } | 987 | } |
979 | 988 | ||
980 | static inline void configure_usart2_pins(void) | 989 | static inline void configure_usart2_pins(int flags) |
981 | { | 990 | { |
982 | u32 pin_mask = (1 << 26) | (1 << 27); /* RXD & TXD */ | 991 | u32 pin_mask = (1 << 26) | (1 << 27); /* RXD & TXD */ |
992 | if (flags & ATMEL_USART_RTS) pin_mask |= (1 << 30); | ||
993 | if (flags & ATMEL_USART_CTS) pin_mask |= (1 << 29); | ||
994 | if (flags & ATMEL_USART_CLK) pin_mask |= (1 << 28); | ||
983 | 995 | ||
984 | select_peripheral(PIOB, pin_mask, PERIPH_B, AT32_GPIOF_PULLUP); | 996 | select_peripheral(PIOB, pin_mask, PERIPH_B, AT32_GPIOF_PULLUP); |
985 | } | 997 | } |
986 | 998 | ||
987 | static inline void configure_usart3_pins(void) | 999 | static inline void configure_usart3_pins(int flags) |
988 | { | 1000 | { |
989 | u32 pin_mask = (1 << 18) | (1 << 17); /* RXD & TXD */ | 1001 | u32 pin_mask = (1 << 18) | (1 << 17); /* RXD & TXD */ |
1002 | if (flags & ATMEL_USART_RTS) pin_mask |= (1 << 16); | ||
1003 | if (flags & ATMEL_USART_CTS) pin_mask |= (1 << 15); | ||
1004 | if (flags & ATMEL_USART_CLK) pin_mask |= (1 << 19); | ||
990 | 1005 | ||
991 | select_peripheral(PIOB, pin_mask, PERIPH_B, AT32_GPIOF_PULLUP); | 1006 | select_peripheral(PIOB, pin_mask, PERIPH_B, AT32_GPIOF_PULLUP); |
992 | } | 1007 | } |
993 | 1008 | ||
994 | static struct platform_device *__initdata at32_usarts[4]; | 1009 | static struct platform_device *__initdata at32_usarts[4]; |
995 | 1010 | ||
996 | void __init at32_map_usart(unsigned int hw_id, unsigned int line) | 1011 | void __init at32_map_usart(unsigned int hw_id, unsigned int line, int flags) |
997 | { | 1012 | { |
998 | struct platform_device *pdev; | 1013 | struct platform_device *pdev; |
999 | 1014 | ||
1000 | switch (hw_id) { | 1015 | switch (hw_id) { |
1001 | case 0: | 1016 | case 0: |
1002 | pdev = &atmel_usart0_device; | 1017 | pdev = &atmel_usart0_device; |
1003 | configure_usart0_pins(); | 1018 | configure_usart0_pins(flags); |
1004 | break; | 1019 | break; |
1005 | case 1: | 1020 | case 1: |
1006 | pdev = &atmel_usart1_device; | 1021 | pdev = &atmel_usart1_device; |
1007 | configure_usart1_pins(); | 1022 | configure_usart1_pins(flags); |
1008 | break; | 1023 | break; |
1009 | case 2: | 1024 | case 2: |
1010 | pdev = &atmel_usart2_device; | 1025 | pdev = &atmel_usart2_device; |
1011 | configure_usart2_pins(); | 1026 | configure_usart2_pins(flags); |
1012 | break; | 1027 | break; |
1013 | case 3: | 1028 | case 3: |
1014 | pdev = &atmel_usart3_device; | 1029 | pdev = &atmel_usart3_device; |
1015 | configure_usart3_pins(); | 1030 | configure_usart3_pins(flags); |
1016 | break; | 1031 | break; |
1017 | default: | 1032 | default: |
1018 | return; | 1033 | return; |
@@ -1753,7 +1768,7 @@ at32_add_device_usba(unsigned int id, struct usba_platform_data *data) | |||
1753 | if (platform_device_add_data(pdev, data, sizeof(usba_data))) | 1768 | if (platform_device_add_data(pdev, data, sizeof(usba_data))) |
1754 | goto out_free_pdev; | 1769 | goto out_free_pdev; |
1755 | 1770 | ||
1756 | if (data->vbus_pin >= 0) | 1771 | if (gpio_is_valid(data->vbus_pin)) |
1757 | at32_select_gpio(data->vbus_pin, 0); | 1772 | at32_select_gpio(data->vbus_pin, 0); |
1758 | 1773 | ||
1759 | usba0_pclk.dev = &pdev->dev; | 1774 | usba0_pclk.dev = &pdev->dev; |
@@ -1980,11 +1995,14 @@ static struct clk atmel_ac97c0_pclk = { | |||
1980 | }; | 1995 | }; |
1981 | 1996 | ||
1982 | struct platform_device *__init | 1997 | struct platform_device *__init |
1983 | at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data) | 1998 | at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data, |
1999 | unsigned int flags) | ||
1984 | { | 2000 | { |
1985 | struct platform_device *pdev; | 2001 | struct platform_device *pdev; |
1986 | struct ac97c_platform_data _data; | 2002 | struct dw_dma_slave *rx_dws; |
1987 | u32 pin_mask; | 2003 | struct dw_dma_slave *tx_dws; |
2004 | struct ac97c_platform_data _data; | ||
2005 | u32 pin_mask; | ||
1988 | 2006 | ||
1989 | if (id != 0) | 2007 | if (id != 0) |
1990 | return NULL; | 2008 | return NULL; |
@@ -1995,37 +2013,52 @@ at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data) | |||
1995 | 2013 | ||
1996 | if (platform_device_add_resources(pdev, atmel_ac97c0_resource, | 2014 | if (platform_device_add_resources(pdev, atmel_ac97c0_resource, |
1997 | ARRAY_SIZE(atmel_ac97c0_resource))) | 2015 | ARRAY_SIZE(atmel_ac97c0_resource))) |
1998 | goto fail; | 2016 | goto out_free_resources; |
1999 | 2017 | ||
2000 | if (!data) { | 2018 | if (!data) { |
2001 | data = &_data; | 2019 | data = &_data; |
2002 | memset(data, 0, sizeof(struct ac97c_platform_data)); | 2020 | memset(data, 0, sizeof(struct ac97c_platform_data)); |
2003 | data->reset_pin = GPIO_PIN_NONE; | 2021 | data->reset_pin = -ENODEV; |
2004 | } | 2022 | } |
2005 | 2023 | ||
2006 | data->dma_rx_periph_id = 3; | 2024 | rx_dws = &data->rx_dws; |
2007 | data->dma_tx_periph_id = 4; | 2025 | tx_dws = &data->tx_dws; |
2008 | data->dma_controller_id = 0; | 2026 | |
2027 | /* Check if DMA slave interface for capture should be configured. */ | ||
2028 | if (flags & AC97C_CAPTURE) { | ||
2029 | rx_dws->dma_dev = &dw_dmac0_device.dev; | ||
2030 | rx_dws->reg_width = DW_DMA_SLAVE_WIDTH_16BIT; | ||
2031 | rx_dws->cfg_hi = DWC_CFGH_SRC_PER(3); | ||
2032 | rx_dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL); | ||
2033 | } | ||
2034 | |||
2035 | /* Check if DMA slave interface for playback should be configured. */ | ||
2036 | if (flags & AC97C_PLAYBACK) { | ||
2037 | tx_dws->dma_dev = &dw_dmac0_device.dev; | ||
2038 | tx_dws->reg_width = DW_DMA_SLAVE_WIDTH_16BIT; | ||
2039 | tx_dws->cfg_hi = DWC_CFGH_DST_PER(4); | ||
2040 | tx_dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL); | ||
2041 | } | ||
2009 | 2042 | ||
2010 | if (platform_device_add_data(pdev, data, | 2043 | if (platform_device_add_data(pdev, data, |
2011 | sizeof(struct ac97c_platform_data))) | 2044 | sizeof(struct ac97c_platform_data))) |
2012 | goto fail; | 2045 | goto out_free_resources; |
2013 | 2046 | ||
2014 | pin_mask = (1 << 20) | (1 << 21); /* SDO & SYNC */ | 2047 | /* SDO | SYNC | SCLK | SDI */ |
2015 | pin_mask |= (1 << 22) | (1 << 23); /* SCLK & SDI */ | 2048 | pin_mask = (1 << 20) | (1 << 21) | (1 << 22) | (1 << 23); |
2016 | 2049 | ||
2017 | select_peripheral(PIOB, pin_mask, PERIPH_B, 0); | 2050 | select_peripheral(PIOB, pin_mask, PERIPH_B, 0); |
2018 | 2051 | ||
2019 | /* TODO: gpio_is_valid(data->reset_pin) with kernel 2.6.26. */ | 2052 | if (gpio_is_valid(data->reset_pin)) |
2020 | if (data->reset_pin != GPIO_PIN_NONE) | 2053 | at32_select_gpio(data->reset_pin, AT32_GPIOF_OUTPUT |
2021 | at32_select_gpio(data->reset_pin, 0); | 2054 | | AT32_GPIOF_HIGH); |
2022 | 2055 | ||
2023 | atmel_ac97c0_pclk.dev = &pdev->dev; | 2056 | atmel_ac97c0_pclk.dev = &pdev->dev; |
2024 | 2057 | ||
2025 | platform_device_add(pdev); | 2058 | platform_device_add(pdev); |
2026 | return pdev; | 2059 | return pdev; |
2027 | 2060 | ||
2028 | fail: | 2061 | out_free_resources: |
2029 | platform_device_put(pdev); | 2062 | platform_device_put(pdev); |
2030 | return NULL; | 2063 | return NULL; |
2031 | } | 2064 | } |
@@ -2053,21 +2086,34 @@ static struct clk abdac0_sample_clk = { | |||
2053 | .index = 6, | 2086 | .index = 6, |
2054 | }; | 2087 | }; |
2055 | 2088 | ||
2056 | struct platform_device *__init at32_add_device_abdac(unsigned int id) | 2089 | struct platform_device *__init |
2090 | at32_add_device_abdac(unsigned int id, struct atmel_abdac_pdata *data) | ||
2057 | { | 2091 | { |
2058 | struct platform_device *pdev; | 2092 | struct platform_device *pdev; |
2059 | u32 pin_mask; | 2093 | struct dw_dma_slave *dws; |
2094 | u32 pin_mask; | ||
2060 | 2095 | ||
2061 | if (id != 0) | 2096 | if (id != 0 || !data) |
2062 | return NULL; | 2097 | return NULL; |
2063 | 2098 | ||
2064 | pdev = platform_device_alloc("abdac", id); | 2099 | pdev = platform_device_alloc("atmel_abdac", id); |
2065 | if (!pdev) | 2100 | if (!pdev) |
2066 | return NULL; | 2101 | return NULL; |
2067 | 2102 | ||
2068 | if (platform_device_add_resources(pdev, abdac0_resource, | 2103 | if (platform_device_add_resources(pdev, abdac0_resource, |
2069 | ARRAY_SIZE(abdac0_resource))) | 2104 | ARRAY_SIZE(abdac0_resource))) |
2070 | goto err_add_resources; | 2105 | goto out_free_resources; |
2106 | |||
2107 | dws = &data->dws; | ||
2108 | |||
2109 | dws->dma_dev = &dw_dmac0_device.dev; | ||
2110 | dws->reg_width = DW_DMA_SLAVE_WIDTH_32BIT; | ||
2111 | dws->cfg_hi = DWC_CFGH_DST_PER(2); | ||
2112 | dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL); | ||
2113 | |||
2114 | if (platform_device_add_data(pdev, data, | ||
2115 | sizeof(struct atmel_abdac_pdata))) | ||
2116 | goto out_free_resources; | ||
2071 | 2117 | ||
2072 | pin_mask = (1 << 20) | (1 << 22); /* DATA1 & DATAN1 */ | 2118 | pin_mask = (1 << 20) | (1 << 22); /* DATA1 & DATAN1 */ |
2073 | pin_mask |= (1 << 21) | (1 << 23); /* DATA0 & DATAN0 */ | 2119 | pin_mask |= (1 << 21) | (1 << 23); /* DATA0 & DATAN0 */ |
@@ -2080,7 +2126,7 @@ struct platform_device *__init at32_add_device_abdac(unsigned int id) | |||
2080 | platform_device_add(pdev); | 2126 | platform_device_add(pdev); |
2081 | return pdev; | 2127 | return pdev; |
2082 | 2128 | ||
2083 | err_add_resources: | 2129 | out_free_resources: |
2084 | platform_device_put(pdev); | 2130 | platform_device_put(pdev); |
2085 | return NULL; | 2131 | return NULL; |
2086 | } | 2132 | } |