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