1 /* 2 * This program is free software; you can redistribute it and/or modify it 3 * under the terms of the GNU General Public License version 2 as published 4 * by the Free Software Foundation. 5 * 6 * Copyright (C) 2012 John Crispin <john@phrozen.org> 7 */ 8 9 #include <linux/export.h> 10 #include <linux/of_platform.h> 11 #include <linux/of_gpio.h> 12 #include <linux/dma-mapping.h> 13 14 #include <lantiq_soc.h> 15 16 static unsigned int *cp1_base; 17 18 unsigned int *ltq_get_cp1_base(void) 19 { 20 if (!cp1_base) 21 panic("no cp1 base was set\n"); 22 23 return cp1_base; 24 } 25 EXPORT_SYMBOL(ltq_get_cp1_base); 26 27 static int vmmc_probe(struct platform_device *pdev) 28 { 29 #define CP1_SIZE (1 << 20) 30 int gpio_count; 31 dma_addr_t dma; 32 33 cp1_base = 34 (void *) CPHYSADDR(dma_alloc_coherent(NULL, CP1_SIZE, 35 &dma, GFP_ATOMIC)); 36 37 gpio_count = of_gpio_count(pdev->dev.of_node); 38 while (gpio_count > 0) { 39 enum of_gpio_flags flags; 40 int gpio = of_get_gpio_flags(pdev->dev.of_node, 41 --gpio_count, &flags); 42 if (gpio_request(gpio, "vmmc-relay")) 43 continue; 44 dev_info(&pdev->dev, "requested GPIO %d\n", gpio); 45 gpio_direction_output(gpio, 46 (flags & OF_GPIO_ACTIVE_LOW) ? (0) : (1)); 47 } 48 49 dev_info(&pdev->dev, "reserved %dMB at 0x%p", CP1_SIZE >> 20, cp1_base); 50 51 return 0; 52 } 53 54 static const struct of_device_id vmmc_match[] = { 55 { .compatible = "lantiq,vmmc-xway" }, 56 {}, 57 }; 58 59 static struct platform_driver vmmc_driver = { 60 .probe = vmmc_probe, 61 .driver = { 62 .name = "lantiq,vmmc", 63 .of_match_table = vmmc_match, 64 }, 65 }; 66 builtin_platform_driver(vmmc_driver); 67