aboutsummaryrefslogtreecommitdiffstats
path: root/arch/avr32/mach-at32ap/at32ap700x.c
diff options
context:
space:
mode:
authorHaavard Skinnemoen <haavard.skinnemoen@atmel.com>2008-10-12 09:44:33 -0400
committerHaavard Skinnemoen <haavard.skinnemoen@atmel.com>2008-10-12 09:44:33 -0400
commit0d62950125241a6e6db8e8f14271f098ec7a2da4 (patch)
tree8cdd9e17f6a6ff4cb6166ad12a4d3ed1d45b2dc9 /arch/avr32/mach-at32ap/at32ap700x.c
parentb3bc2c5562f06ca34b30f61c5714e96490946c81 (diff)
parent5e7184ae0dd49456387e8b1cdebc6b2c92fc6d51 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen/atmel-mci-2.6.28
Diffstat (limited to 'arch/avr32/mach-at32ap/at32ap700x.c')
-rw-r--r--arch/avr32/mach-at32ap/at32ap700x.c88
1 files changed, 70 insertions, 18 deletions
diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c
index fd306c49194b..5d00bb8d3cc2 100644
--- a/arch/avr32/mach-at32ap/at32ap700x.c
+++ b/arch/avr32/mach-at32ap/at32ap700x.c
@@ -1272,10 +1272,14 @@ static struct clk atmel_mci0_pclk = {
1272struct platform_device *__init 1272struct platform_device *__init
1273at32_add_device_mci(unsigned int id, struct mci_platform_data *data) 1273at32_add_device_mci(unsigned int id, struct mci_platform_data *data)
1274{ 1274{
1275 struct mci_platform_data _data;
1276 struct platform_device *pdev; 1275 struct platform_device *pdev;
1276 struct dw_dma_slave *dws;
1277 1277
1278 if (id != 0) 1278 if (id != 0 || !data)
1279 return NULL;
1280
1281 /* Must have at least one usable slot */
1282 if (!data->slot[0].bus_width && !data->slot[1].bus_width)
1279 return NULL; 1283 return NULL;
1280 1284
1281 pdev = platform_device_alloc("atmel_mci", id); 1285 pdev = platform_device_alloc("atmel_mci", id);
@@ -1286,28 +1290,76 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data)
1286 ARRAY_SIZE(atmel_mci0_resource))) 1290 ARRAY_SIZE(atmel_mci0_resource)))
1287 goto fail; 1291 goto fail;
1288 1292
1289 if (!data) { 1293 if (data->dma_slave)
1290 data = &_data; 1294 dws = kmemdup(to_dw_dma_slave(data->dma_slave),
1291 memset(data, -1, sizeof(struct mci_platform_data)); 1295 sizeof(struct dw_dma_slave), GFP_KERNEL);
1292 data->detect_pin = GPIO_PIN_NONE; 1296 else
1293 data->wp_pin = GPIO_PIN_NONE; 1297 dws = kzalloc(sizeof(struct dw_dma_slave), GFP_KERNEL);
1294 } 1298
1299 dws->slave.dev = &pdev->dev;
1300 dws->slave.dma_dev = &dw_dmac0_device.dev;
1301 dws->slave.reg_width = DMA_SLAVE_WIDTH_32BIT;
1302 dws->cfg_hi = (DWC_CFGH_SRC_PER(0)
1303 | DWC_CFGH_DST_PER(1));
1304 dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL
1305 | DWC_CFGL_HS_SRC_POL);
1306
1307 data->dma_slave = &dws->slave;
1295 1308
1296 if (platform_device_add_data(pdev, data, 1309 if (platform_device_add_data(pdev, data,
1297 sizeof(struct mci_platform_data))) 1310 sizeof(struct mci_platform_data)))
1298 goto fail; 1311 goto fail;
1299 1312
1300 select_peripheral(PA(10), PERIPH_A, 0); /* CLK */ 1313 /* CLK line is common to both slots */
1301 select_peripheral(PA(11), PERIPH_A, 0); /* CMD */ 1314 select_peripheral(PA(10), PERIPH_A, 0);
1302 select_peripheral(PA(12), PERIPH_A, 0); /* DATA0 */
1303 select_peripheral(PA(13), PERIPH_A, 0); /* DATA1 */
1304 select_peripheral(PA(14), PERIPH_A, 0); /* DATA2 */
1305 select_peripheral(PA(15), PERIPH_A, 0); /* DATA3 */
1306 1315
1307 if (gpio_is_valid(data->detect_pin)) 1316 switch (data->slot[0].bus_width) {
1308 at32_select_gpio(data->detect_pin, 0); 1317 case 4:
1309 if (gpio_is_valid(data->wp_pin)) 1318 select_peripheral(PA(13), PERIPH_A, 0); /* DATA1 */
1310 at32_select_gpio(data->wp_pin, 0); 1319 select_peripheral(PA(14), PERIPH_A, 0); /* DATA2 */
1320 select_peripheral(PA(15), PERIPH_A, 0); /* DATA3 */
1321 /* fall through */
1322 case 1:
1323 select_peripheral(PA(11), PERIPH_A, 0); /* CMD */
1324 select_peripheral(PA(12), PERIPH_A, 0); /* DATA0 */
1325
1326 if (gpio_is_valid(data->slot[0].detect_pin))
1327 at32_select_gpio(data->slot[0].detect_pin, 0);
1328 if (gpio_is_valid(data->slot[0].wp_pin))
1329 at32_select_gpio(data->slot[0].wp_pin, 0);
1330 break;
1331 case 0:
1332 /* Slot is unused */
1333 break;
1334 default:
1335 goto fail;
1336 }
1337
1338 switch (data->slot[1].bus_width) {
1339 case 4:
1340 select_peripheral(PB(8), PERIPH_B, 0); /* DATA1 */
1341 select_peripheral(PB(9), PERIPH_B, 0); /* DATA2 */
1342 select_peripheral(PB(10), PERIPH_B, 0); /* DATA3 */
1343 /* fall through */
1344 case 1:
1345 select_peripheral(PB(6), PERIPH_B, 0); /* CMD */
1346 select_peripheral(PB(7), PERIPH_B, 0); /* DATA0 */
1347
1348 if (gpio_is_valid(data->slot[1].detect_pin))
1349 at32_select_gpio(data->slot[1].detect_pin, 0);
1350 if (gpio_is_valid(data->slot[1].wp_pin))
1351 at32_select_gpio(data->slot[1].wp_pin, 0);
1352 break;
1353 case 0:
1354 /* Slot is unused */
1355 break;
1356 default:
1357 if (!data->slot[0].bus_width)
1358 goto fail;
1359
1360 data->slot[1].bus_width = 0;
1361 break;
1362 }
1311 1363
1312 atmel_mci0_pclk.dev = &pdev->dev; 1364 atmel_mci0_pclk.dev = &pdev->dev;
1313 1365