161f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai/* 261f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * Copyright (c) 2014 Broadcom Corporation 361f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * 461f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * Permission to use, copy, modify, and/or distribute this software for any 561f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * purpose with or without fee is hereby granted, provided that the above 661f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * copyright notice and this permission notice appear in all copies. 761f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * 861f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 961f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1061f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 1161f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1261f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 1361f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 1461f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1561f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai */ 1661f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai#include <linux/init.h> 1761f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai#include <linux/of.h> 1861f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai#include <linux/of_irq.h> 1961f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai#include <linux/mmc/card.h> 2061f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai#include <linux/platform_data/brcmfmac-sdio.h> 2161f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai#include <linux/mmc/sdio_func.h> 2261f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai 2361f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai#include <defs.h> 2461f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai#include "dhd_dbg.h" 2561f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai#include "sdio_host.h" 2661f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai 2761f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsaivoid brcmf_of_probe(struct brcmf_sdio_dev *sdiodev) 2861f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai{ 2961f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai struct device *dev = sdiodev->dev; 3061f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai struct device_node *np = dev->of_node; 3161f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai int irq; 3261f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai u32 irqf; 3361f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai u32 val; 3461f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai 3561f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac")) 3661f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai return; 3761f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai 3861f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai sdiodev->pdata = devm_kzalloc(dev, sizeof(*sdiodev->pdata), GFP_KERNEL); 3961f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai if (!sdiodev->pdata) 4061f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai return; 4161f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai 4261f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai irq = irq_of_parse_and_map(np, 0); 434c69f05eaa428e37890daf88b86a567ce615570bDmitry Torokhov if (!irq) { 444c69f05eaa428e37890daf88b86a567ce615570bDmitry Torokhov brcmf_err("interrupt could not be mapped\n"); 4561f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai devm_kfree(dev, sdiodev->pdata); 4661f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai return; 4761f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai } 4861f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai irqf = irqd_get_trigger_type(irq_get_irq_data(irq)); 4961f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai 5061f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai sdiodev->pdata->oob_irq_supported = true; 5161f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai sdiodev->pdata->oob_irq_nr = irq; 5261f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai sdiodev->pdata->oob_irq_flags = irqf; 5361f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai 5461f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0) 5561f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai sdiodev->pdata->drive_strength = val; 5661f663dfc1a091c7c04fa73666af52a42aaa083fChen-Yu Tsai} 57