void dhd_wifi_platform_register_drv(struct work_struct *work) { int err = 0; struct device *dev; /* register Broadcom wifi platform data driver if multi-chip is enabled, * otherwise use Android style wifi platform data (aka wifi control function) * if it exists * * to support multi-chip DHD, Broadcom wifi platform data device must * be added in kernel early boot (e.g. board config file). */ if (cfg_multichip) { dev = bus_find_device(&platform_bus_type, NULL, WIFI_PLAT_EXT, wifi_platdev_match); if (dev == NULL) { DHD_ERROR(("bcmdhd wifi platform data device not found!!\n")); } err = platform_driver_register(&dhd_wifi_platform_dev_driver); } else { err = wifi_ctrlfunc_register_drv(); /* no wifi ctrl func either, load bus directly and ignore this error */ if (err) { if (err == -ENXIO) { /* wifi ctrl function does not exist */ err = dhd_wifi_platform_load(); } else { /* unregister driver due to initialization failure */ wifi_ctrlfunc_unregister_drv(); } } } }
static int wifi_plat_dev_drv_probe(struct platform_device *pdev) { struct resource *resource; wifi_adapter_info_t *adapter; /* Android style wifi platform data device ("bcmdhd_wlan" or "bcm4329_wlan") * is kept for backward compatibility and supports only 1 adapter */ ASSERT(dhd_wifi_platdata != NULL); ASSERT(dhd_wifi_platdata->num_adapters == 1); adapter = &dhd_wifi_platdata->adapters[0]; adapter->wifi_plat_data = (struct wifi_platform_data *)(pdev->dev.platform_data); if (!adapter->wifi_plat_data) { DHD_ERROR(("%s: unable to get platform data !\n", __FUNCTION__)); return -ENODATA; } ((struct wifi_platform_data *)(adapter->wifi_plat_data))->set_power = bcmsdh_sdmmc_set_power; ((struct wifi_platform_data *)(adapter->wifi_plat_data))->get_mac_addr = dhd_custom_get_mac_address; resource = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (resource == NULL) { DHD_ERROR(("%s: unable to get IORESOURCE_IRQ !\n", __FUNCTION__)); return -ENODATA; } adapter->irq_num = resource->start; adapter->intr_flags = resource->flags & IRQF_TRIGGER_MASK; wifi_plat_dev_probe_ret = dhd_wifi_platform_load(); return wifi_plat_dev_probe_ret; }
static int wifi_plat_dev_drv_probe(struct platform_device *pdev) { struct resource *resource; wifi_adapter_info_t *adapter; /* Android style wifi platform data device ("bcmdhd_wlan" or "bcm4329_wlan") * is kept for backward compatibility and supports only 1 adapter */ ASSERT(dhd_wifi_platdata != NULL); ASSERT(dhd_wifi_platdata->num_adapters == 1); adapter = &dhd_wifi_platdata->adapters[0]; adapter->wifi_plat_data = (struct wifi_platform_data *)(pdev->dev.platform_data); resource = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcmdhd_wlan_irq"); if (resource == NULL) resource = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcm4329_wlan_irq"); if (resource) { adapter->irq_num = resource->start; adapter->intr_flags = resource->flags & IRQF_TRIGGER_MASK; } wifi_plat_dev_probe_ret = dhd_wifi_platform_load(); return wifi_plat_dev_probe_ret; }
static int wifi_ctrlfunc_register_drv(void) { int err = 0; struct device *dev1, *dev2; wifi_adapter_info_t *adapter; dev1 = bus_find_device(&platform_bus_type, NULL, WIFI_PLAT_NAME, wifi_platdev_match); dev2 = bus_find_device(&platform_bus_type, NULL, WIFI_PLAT_NAME2, wifi_platdev_match); if (!dts_enabled) { if (dev1 == NULL && dev2 == NULL) { DHD_ERROR(("no wifi platform data, skip\n")); return -ENXIO; } } /* multi-chip support not enabled, build one adapter information for * DHD (either SDIO, USB or PCIe) */ adapter = kzalloc(sizeof(wifi_adapter_info_t), GFP_KERNEL); adapter->name = "DHD generic adapter"; adapter->bus_type = -1; adapter->bus_num = -1; adapter->slot_num = -1; adapter->irq_num = -1; is_power_on = FALSE; wifi_plat_dev_probe_ret = 0; dhd_wifi_platdata = kzalloc(sizeof(bcmdhd_wifi_platdata_t), GFP_KERNEL); dhd_wifi_platdata->num_adapters = 1; dhd_wifi_platdata->adapters = adapter; if (dev1) { err = platform_driver_register(&wifi_platform_dev_driver); if (err) { DHD_ERROR(("%s: failed to register wifi ctrl func driver\n", __FUNCTION__)); return err; } } if (dev2) { err = platform_driver_register(&wifi_platform_dev_driver_legacy); if (err) { DHD_ERROR(("%s: failed to register wifi ctrl func legacy driver\n", __FUNCTION__)); return err; } } if (dts_enabled) { struct resource *resource; adapter->wifi_plat_data = (void *)&dhd_wlan_control; resource = &dhd_wlan_resources; adapter->irq_num = resource->start; adapter->intr_flags = resource->flags; wifi_plat_dev_probe_ret = dhd_wifi_platform_load(); } /* return probe function's return value if registeration succeeded */ return wifi_plat_dev_probe_ret; }
static int wifi_plat_dev_drv_probe(struct platform_device *pdev) { struct resource *resource; wifi_adapter_info_t *adapter; #ifdef CONFIG_DTS int irq, gpio; #endif /* CONFIG_DTS */ /* Android style wifi platform data device ("bcmdhd_wlan" or "bcm4329_wlan") * is kept for backward compatibility and supports only 1 adapter */ ASSERT(dhd_wifi_platdata != NULL); ASSERT(dhd_wifi_platdata->num_adapters == 1); adapter = &dhd_wifi_platdata->adapters[0]; adapter->wifi_plat_data = (struct wifi_platform_data *)(pdev->dev.platform_data); resource = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcmdhd_wlan_irq"); if (resource == NULL) resource = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcm4329_wlan_irq"); if (resource) { adapter->irq_num = resource->start; adapter->intr_flags = resource->flags & IRQF_TRIGGER_MASK; } #ifdef CONFIG_DTS wifi_regulator = regulator_get(&pdev->dev, "wlreg_on"); if (wifi_regulator == NULL) { DHD_ERROR(("%s regulator is null\n", __FUNCTION__)); return -1; } /* This is to get the irq for the OOB */ gpio = of_get_gpio(pdev->dev.of_node, 0); if (gpio < 0) { DHD_ERROR(("%s gpio information is incorrect\n", __FUNCTION__)); return -1; } irq = gpio_to_irq(gpio); if (irq < 0) { DHD_ERROR(("%s irq information is incorrect\n", __FUNCTION__)); return -1; } adapter->irq_num = irq; /* need to change the flags according to our requirement */ adapter->intr_flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | IORESOURCE_IRQ_SHAREABLE; #endif /* CONFIG_DTS */ wifi_plat_dev_probe_ret = dhd_wifi_platform_load(); return wifi_plat_dev_probe_ret; }
static int wifi_plat_dev_drv_probe(struct platform_device *pdev) { struct resource *resource; wifi_adapter_info_t *adapter; #if defined(BCMPCIE) && defined(CONFIG_WIFI_CONTROL_FUNC) int irq, gpio; #endif /* Android style wifi platform data device ("bcmdhd_wlan" or "bcm4329_wlan") * is kept for backward compatibility and supports only 1 adapter */ ASSERT(dhd_wifi_platdata != NULL); ASSERT(dhd_wifi_platdata->num_adapters == 1); adapter = &dhd_wifi_platdata->adapters[0]; #if defined(BCMPCIE) && defined(CONFIG_WIFI_CONTROL_FUNC) adapter->wifi_plat_data = (void *)&somc_wifi_control; #else adapter->wifi_plat_data = (struct wifi_platform_data *)(pdev->dev.platform_data); #endif resource = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcmdhd_wlan_irq"); if (resource == NULL) resource = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcm4329_wlan_irq"); if (resource) { adapter->irq_num = resource->start; adapter->intr_flags = resource->flags & IRQF_TRIGGER_MASK; } #if defined(BCMPCIE) && defined(CONFIG_WIFI_CONTROL_FUNC) somc_wifi_init(pdev); gpio = of_get_gpio(pdev->dev.of_node, 1); if (gpio < 0) { DHD_ERROR(("%s gpio information is incorrect\n", __FUNCTION__)); return -1; } irq = gpio_to_irq(gpio); if (irq < 0) { DHD_ERROR(("%s irq information is incorrect\n", __FUNCTION__)); return -1; } adapter->irq_num = irq; /* need to change the flags according to our requirement */ adapter->intr_flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | IORESOURCE_IRQ_SHAREABLE; #endif wifi_plat_dev_probe_ret = dhd_wifi_platform_load(); return wifi_plat_dev_probe_ret; }
static int wifi_plat_dev_drv_probe_acpi(struct platform_device *pdev) { wifi_adapter_info_t *adapter; acpi_handle handle; struct acpi_device *adev; int irq_num; /* Android style wifi platform data device ("bcmdhd_wlan" or "bcm4329_wlan") * is kept for backward compatibility and supports only 1 adapter */ ASSERT(dhd_wifi_platdata != NULL); ASSERT(dhd_wifi_platdata->num_adapters == 1); adapter = &dhd_wifi_platdata->adapters[0]; adapter->wifi_plat_data = (void *)&dhd_wlan_control; if (ACPI_HANDLE(&pdev->dev)) { handle = ACPI_HANDLE(&pdev->dev); /* Dont try to do acpi pm for the wifi module */ if (!handle || acpi_bus_get_device(handle, &adev)) DHD_ERROR(("%s: could not get acpi pointer!\n", __FUNCTION__)); else adev->flags.power_manageable = 0; irq_num = acpi_get_gpio_by_index(&pdev->dev, 0, NULL); DHD_INFO(("%s: Using ACPI table to get IRQ number: %d\n", __FUNCTION__, irq_num)); if (irq_num < 0) { if (INTEL_MID_BOARD(2, TABLET, BYT, BLB, PRO) || INTEL_MID_BOARD(2, TABLET, BYT, BLB, ENG)) { DHD_INFO(("%s: BYT-M hardcoding\n", __FUNCTION__)); irq_num = acpi_get_gpio("\\_SB.GPO2", 17); } else { DHD_INFO(("%s: BYT-T hardcoding\n", __FUNCTION__)); irq_num = acpi_get_gpio("\\_SB.GPO2", 15); } } } else { DHD_ERROR(("%s: Null ACPI_HANDLE, try legacy probe\n", __FUNCTION__)); return wifi_plat_dev_drv_probe(pdev); } adapter->irq_num = irq_num; adapter->intr_flags = IRQF_TRIGGER_FALLING; wifi_plat_dev_probe_ret = dhd_wifi_platform_load(); return wifi_plat_dev_probe_ret; }
static int bcmdhd_wifi_plat_dev_drv_probe(struct platform_device *pdev) { dhd_wifi_platdata = (bcmdhd_wifi_platdata_t *)(pdev->dev.platform_data); return dhd_wifi_platform_load(); }
static int wifi_ctrlfunc_register_drv(void) { wifi_adapter_info_t *adapter; #ifndef CUSTOMER_HW int err = 0; struct device *dev1, *dev2; dev1 = bus_find_device(&platform_bus_type, NULL, WIFI_PLAT_NAME, wifi_platdev_match); dev2 = bus_find_device(&platform_bus_type, NULL, WIFI_PLAT_NAME2, wifi_platdev_match); #endif #if !defined(CONFIG_DTS) && !defined(CUSTOMER_HW) if (!dts_enabled) { if (dev1 == NULL && dev2 == NULL) { DHD_ERROR(("no wifi platform data, skip\n")); return -ENXIO; } } #endif /* !defined(CONFIG_DTS) */ /* multi-chip support not enabled, build one adapter information for * DHD (either SDIO, USB or PCIe) */ adapter = kzalloc(sizeof(wifi_adapter_info_t), GFP_KERNEL); adapter->name = "DHD generic adapter"; adapter->bus_type = -1; adapter->bus_num = -1; adapter->slot_num = -1; adapter->irq_num = -1; is_power_on = FALSE; wifi_plat_dev_probe_ret = 0; dhd_wifi_platdata = kzalloc(sizeof(bcmdhd_wifi_platdata_t), GFP_KERNEL); dhd_wifi_platdata->num_adapters = 1; dhd_wifi_platdata->adapters = adapter; #ifndef CUSTOMER_HW if (dev1) { err = platform_driver_register(&wifi_platform_dev_driver); if (err) { DHD_ERROR(("%s: failed to register wifi ctrl func driver\n", __FUNCTION__)); return err; } } if (dev2) { err = platform_driver_register(&wifi_platform_dev_driver_legacy); if (err) { DHD_ERROR(("%s: failed to register wifi ctrl func legacy driver\n", __FUNCTION__)); return err; } } #endif #if !defined(CONFIG_DTS) if (dts_enabled) { #ifdef CUSTOMER_HW adapter->wifi_plat_data = (void *)&dhd_wlan_control; bcm_wlan_set_plat_data(); #ifdef CUSTOMER_OOB adapter->irq_num = bcm_wlan_get_oob_irq(); adapter->intr_flags = bcm_wlan_get_oob_irq_flags(); #endif #else struct resource *resource; resource = &dhd_wlan_resources; adapter->irq_num = resource->start; adapter->intr_flags = resource->flags & IRQF_TRIGGER_MASK; #endif wifi_plat_dev_probe_ret = dhd_wifi_platform_load(); } #endif /* !defined(CONFIG_DTS) */ #if defined(CONFIG_DTS) && !defined(CUSTOMER_HW) wifi_plat_dev_probe_ret = platform_driver_register(&wifi_platform_dev_driver); #endif /* CONFIG_DTS */ /* return probe function's return value if registeration succeeded */ return wifi_plat_dev_probe_ret; }