brintos

brintos / linux-shallow public Read only

0
0
Text · 3.6 KiB · fe4f657 Raw
147 lines · c
1// SPDX-License-Identifier: ISC2/*3 * Copyright (c) 2014 Broadcom Corporation4 */5#include <linux/init.h>6#include <linux/of.h>7#include <linux/of_irq.h>8#include <linux/of_net.h>9 10#include <defs.h>11#include "debug.h"12#include "core.h"13#include "common.h"14#include "of.h"15 16static int brcmf_of_get_country_codes(struct device *dev,17				      struct brcmf_mp_device *settings)18{19	struct device_node *np = dev->of_node;20	struct brcmfmac_pd_cc_entry *cce;21	struct brcmfmac_pd_cc *cc;22	int count;23	int i;24 25	count = of_property_count_strings(np, "brcm,ccode-map");26	if (count < 0) {27		/* If no explicit country code map is specified, check whether28		 * the trivial map should be used.29		 */30		settings->trivial_ccode_map =31			of_property_read_bool(np, "brcm,ccode-map-trivial");32 33		/* The property is optional, so return success if it doesn't34		 * exist. Otherwise propagate the error code.35		 */36		return (count == -EINVAL) ? 0 : count;37	}38 39	cc = devm_kzalloc(dev, struct_size(cc, table, count), GFP_KERNEL);40	if (!cc)41		return -ENOMEM;42 43	cc->table_size = count;44 45	for (i = 0; i < count; i++) {46		const char *map;47 48		cce = &cc->table[i];49 50		if (of_property_read_string_index(np, "brcm,ccode-map",51						  i, &map))52			continue;53 54		/* String format e.g. US-Q2-86 */55		if (sscanf(map, "%2c-%2c-%d", cce->iso3166, cce->cc,56			   &cce->rev) != 3)57			brcmf_err("failed to read country map %s\n", map);58		else59			brcmf_dbg(INFO, "%s-%s-%d\n", cce->iso3166, cce->cc,60				  cce->rev);61	}62 63	settings->country_codes = cc;64 65	return 0;66}67 68void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,69		    struct brcmf_mp_device *settings)70{71	struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio;72	struct device_node *root, *np = dev->of_node;73	struct of_phandle_args oirq;74	const char *prop;75	int irq;76	int err;77	u32 irqf;78	u32 val;79 80	/* Apple ARM64 platforms have their own idea of board type, passed in81	 * via the device tree. They also have an antenna SKU parameter82	 */83	err = of_property_read_string(np, "brcm,board-type", &prop);84	if (!err)85		settings->board_type = prop;86 87	if (!of_property_read_string(np, "apple,antenna-sku", &prop))88		settings->antenna_sku = prop;89 90	/* The WLAN calibration blob is normally stored in SROM, but Apple91	 * ARM64 platforms pass it via the DT instead.92	 */93	prop = of_get_property(np, "brcm,cal-blob", &settings->cal_size);94	if (prop && settings->cal_size)95		settings->cal_blob = prop;96 97	/* Set board-type to the first string of the machine compatible prop */98	root = of_find_node_by_path("/");99	if (root && err) {100		char *board_type;101		const char *tmp;102 103		of_property_read_string_index(root, "compatible", 0, &tmp);104 105		/* get rid of '/' in the compatible string to be able to find the FW */106		board_type = devm_kstrdup(dev, tmp, GFP_KERNEL);107		if (!board_type) {108			of_node_put(root);109			return;110		}111		strreplace(board_type, '/', '-');112		settings->board_type = board_type;113 114		of_node_put(root);115	}116 117	if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))118		return;119 120	err = brcmf_of_get_country_codes(dev, settings);121	if (err)122		brcmf_err("failed to get OF country code map (err=%d)\n", err);123 124	of_get_mac_address(np, settings->mac);125 126	if (bus_type != BRCMF_BUSTYPE_SDIO)127		return;128 129	if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)130		sdio->drive_strength = val;131 132	/* make sure there are interrupts defined in the node */133	if (of_irq_parse_one(np, 0, &oirq))134		return;135 136	irq = irq_create_of_mapping(&oirq);137	if (!irq) {138		brcmf_err("interrupt could not be mapped\n");139		return;140	}141	irqf = irqd_get_trigger_type(irq_get_irq_data(irq));142 143	sdio->oob_irq_supported = true;144	sdio->oob_irq_nr = irq;145	sdio->oob_irq_flags = irqf;146}147