1
2
3
4
5#include <linux/init.h>
6#include <linux/of.h>
7#include <linux/of_irq.h>
8
9#include <defs.h>
10#include "debug.h"
11#include "core.h"
12#include "common.h"
13#include "of.h"
14
15void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
16 struct brcmf_mp_device *settings)
17{
18 struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio;
19 struct device_node *root, *np = dev->of_node;
20 struct property *prop;
21 int irq;
22 u32 irqf;
23 u32 val;
24
25
26 root = of_find_node_by_path("/");
27 if (root) {
28 prop = of_find_property(root, "compatible", NULL);
29 settings->board_type = of_prop_next_string(prop, NULL);
30 of_node_put(root);
31 }
32
33 if (!np || bus_type != BRCMF_BUSTYPE_SDIO ||
34 !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
35 return;
36
37 if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
38 sdio->drive_strength = val;
39
40
41 if (!of_find_property(np, "interrupts", NULL))
42 return;
43
44 irq = irq_of_parse_and_map(np, 0);
45 if (!irq) {
46 brcmf_err("interrupt could not be mapped\n");
47 return;
48 }
49 irqf = irqd_get_trigger_type(irq_get_irq_data(irq));
50
51 sdio->oob_irq_supported = true;
52 sdio->oob_irq_nr = irq;
53 sdio->oob_irq_flags = irqf;
54}
55