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
16static unsigned int *cp1_base;
17
18unsigned 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}
25EXPORT_SYMBOL(ltq_get_cp1_base);
26
27static 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
54static const struct of_device_id vmmc_match[] = {
55	{ .compatible = "lantiq,vmmc-xway" },
56	{},
57};
58MODULE_DEVICE_TABLE(of, vmmc_match);
59
60static struct platform_driver vmmc_driver = {
61	.probe = vmmc_probe,
62	.driver = {
63		.name = "lantiq,vmmc",
64		.of_match_table = vmmc_match,
65	},
66};
67
68module_platform_driver(vmmc_driver);
69