|
@@ -23,6 +23,8 @@
|
|
|
#include <linux/mod_devicetable.h>
|
|
|
#include <linux/mmc/sdio_func.h>
|
|
|
#include <linux/mmc/sdio_ids.h>
|
|
|
+#include <linux/platform_device.h>
|
|
|
+#include <linux/spi/wl12xx.h>
|
|
|
|
|
|
#include "wl1251.h"
|
|
|
|
|
@@ -34,6 +36,8 @@
|
|
|
#define SDIO_DEVICE_ID_TI_WL1251 0x9066
|
|
|
#endif
|
|
|
|
|
|
+static struct wl12xx_platform_data *wl12xx_board_data;
|
|
|
+
|
|
|
static struct sdio_func *wl_to_func(struct wl1251 *wl)
|
|
|
{
|
|
|
return wl->if_priv;
|
|
@@ -144,6 +148,30 @@ static const struct wl1251_if_operations wl1251_sdio_ops = {
|
|
|
.disable_irq = wl1251_sdio_disable_irq,
|
|
|
};
|
|
|
|
|
|
+static int wl1251_platform_probe(struct platform_device *pdev)
|
|
|
+{
|
|
|
+ if (pdev->id != -1) {
|
|
|
+ wl1251_error("can only handle single device");
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
+ wl12xx_board_data = pdev->dev.platform_data;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Dummy platform_driver for passing platform_data to this driver,
|
|
|
+ * until we have a way to pass this through SDIO subsystem or
|
|
|
+ * some other way.
|
|
|
+ */
|
|
|
+static struct platform_driver wl1251_platform_driver = {
|
|
|
+ .driver = {
|
|
|
+ .name = "wl1251_data",
|
|
|
+ .owner = THIS_MODULE,
|
|
|
+ },
|
|
|
+ .probe = wl1251_platform_probe,
|
|
|
+};
|
|
|
+
|
|
|
static int wl1251_sdio_probe(struct sdio_func *func,
|
|
|
const struct sdio_device_id *id)
|
|
|
{
|
|
@@ -169,6 +197,11 @@ static int wl1251_sdio_probe(struct sdio_func *func,
|
|
|
wl->if_ops = &wl1251_sdio_ops;
|
|
|
wl->set_power = wl1251_sdio_set_power;
|
|
|
|
|
|
+ if (wl12xx_board_data != NULL) {
|
|
|
+ wl->set_power = wl12xx_board_data->set_power;
|
|
|
+ wl->use_eeprom = wl12xx_board_data->use_eeprom;
|
|
|
+ }
|
|
|
+
|
|
|
sdio_release_host(func);
|
|
|
ret = wl1251_init_ieee80211(wl);
|
|
|
if (ret)
|
|
@@ -208,6 +241,12 @@ static int __init wl1251_sdio_init(void)
|
|
|
{
|
|
|
int err;
|
|
|
|
|
|
+ err = platform_driver_register(&wl1251_platform_driver);
|
|
|
+ if (err) {
|
|
|
+ wl1251_error("failed to register platform driver: %d", err);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
err = sdio_register_driver(&wl1251_sdio_driver);
|
|
|
if (err)
|
|
|
wl1251_error("failed to register sdio driver: %d", err);
|
|
@@ -217,6 +256,7 @@ static int __init wl1251_sdio_init(void)
|
|
|
static void __exit wl1251_sdio_exit(void)
|
|
|
{
|
|
|
sdio_unregister_driver(&wl1251_sdio_driver);
|
|
|
+ platform_driver_unregister(&wl1251_platform_driver);
|
|
|
wl1251_notice("unloaded");
|
|
|
}
|
|
|
|