diff options
Diffstat (limited to 'arch/avr32/mach-at32ap/at32ap700x.c')
-rw-r--r-- | arch/avr32/mach-at32ap/at32ap700x.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c index 07b21b121eef..021d51217184 100644 --- a/arch/avr32/mach-at32ap/at32ap700x.c +++ b/arch/avr32/mach-at32ap/at32ap700x.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/spi/spi.h> | 14 | #include <linux/spi/spi.h> |
15 | #include <linux/usb/atmel_usba_udc.h> | 15 | #include <linux/usb/atmel_usba_udc.h> |
16 | 16 | ||
17 | #include <asm/atmel-mci.h> | ||
17 | #include <asm/io.h> | 18 | #include <asm/io.h> |
18 | #include <asm/irq.h> | 19 | #include <asm/irq.h> |
19 | 20 | ||
@@ -1278,20 +1279,32 @@ static struct clk atmel_mci0_pclk = { | |||
1278 | .index = 9, | 1279 | .index = 9, |
1279 | }; | 1280 | }; |
1280 | 1281 | ||
1281 | struct platform_device *__init at32_add_device_mci(unsigned int id) | 1282 | struct platform_device *__init |
1283 | at32_add_device_mci(unsigned int id, struct mci_platform_data *data) | ||
1282 | { | 1284 | { |
1283 | struct platform_device *pdev; | 1285 | struct mci_platform_data _data; |
1286 | struct platform_device *pdev; | ||
1287 | struct dw_dma_slave *dws; | ||
1284 | 1288 | ||
1285 | if (id != 0) | 1289 | if (id != 0) |
1286 | return NULL; | 1290 | return NULL; |
1287 | 1291 | ||
1288 | pdev = platform_device_alloc("atmel_mci", id); | 1292 | pdev = platform_device_alloc("atmel_mci", id); |
1289 | if (!pdev) | 1293 | if (!pdev) |
1290 | return NULL; | 1294 | goto fail; |
1291 | 1295 | ||
1292 | if (platform_device_add_resources(pdev, atmel_mci0_resource, | 1296 | if (platform_device_add_resources(pdev, atmel_mci0_resource, |
1293 | ARRAY_SIZE(atmel_mci0_resource))) | 1297 | ARRAY_SIZE(atmel_mci0_resource))) |
1294 | goto err_add_resources; | 1298 | goto fail; |
1299 | |||
1300 | if (!data) { | ||
1301 | data = &_data; | ||
1302 | memset(data, 0, sizeof(struct mci_platform_data)); | ||
1303 | } | ||
1304 | |||
1305 | if (platform_device_add_data(pdev, data, | ||
1306 | sizeof(struct mci_platform_data))) | ||
1307 | goto fail; | ||
1295 | 1308 | ||
1296 | select_peripheral(PA(10), PERIPH_A, 0); /* CLK */ | 1309 | select_peripheral(PA(10), PERIPH_A, 0); /* CLK */ |
1297 | select_peripheral(PA(11), PERIPH_A, 0); /* CMD */ | 1310 | select_peripheral(PA(11), PERIPH_A, 0); /* CMD */ |
@@ -1300,12 +1313,19 @@ struct platform_device *__init at32_add_device_mci(unsigned int id) | |||
1300 | select_peripheral(PA(14), PERIPH_A, 0); /* DATA2 */ | 1313 | select_peripheral(PA(14), PERIPH_A, 0); /* DATA2 */ |
1301 | select_peripheral(PA(15), PERIPH_A, 0); /* DATA3 */ | 1314 | select_peripheral(PA(15), PERIPH_A, 0); /* DATA3 */ |
1302 | 1315 | ||
1316 | if (data) { | ||
1317 | if (data->detect_pin != GPIO_PIN_NONE) | ||
1318 | at32_select_gpio(data->detect_pin, 0); | ||
1319 | if (data->wp_pin != GPIO_PIN_NONE) | ||
1320 | at32_select_gpio(data->wp_pin, 0); | ||
1321 | } | ||
1322 | |||
1303 | atmel_mci0_pclk.dev = &pdev->dev; | 1323 | atmel_mci0_pclk.dev = &pdev->dev; |
1304 | 1324 | ||
1305 | platform_device_add(pdev); | 1325 | platform_device_add(pdev); |
1306 | return pdev; | 1326 | return pdev; |
1307 | 1327 | ||
1308 | err_add_resources: | 1328 | fail: |
1309 | platform_device_put(pdev); | 1329 | platform_device_put(pdev); |
1310 | return NULL; | 1330 | return NULL; |
1311 | } | 1331 | } |