]>
Commit | Line | Data |
---|---|---|
05637f10 JC |
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 <blogic@openwrt.org> | |
7 | */ | |
8 | ||
9 | #include <linux/module.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 | MODULE_DEVICE_TABLE(of, vmmc_match); | |
59 | ||
60 | static struct platform_driver vmmc_driver = { | |
61 | .probe = vmmc_probe, | |
62 | .driver = { | |
63 | .name = "lantiq,vmmc", | |
64 | .owner = THIS_MODULE, | |
65 | .of_match_table = vmmc_match, | |
66 | }, | |
67 | }; | |
68 | ||
69 | module_platform_driver(vmmc_driver); |