Commit c94f05ee authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Greg Kroah-Hartman

staging/wilc1000: use more regular probing

So far, my patches tried to do equivalent conversions of the
existing code.  This one goes beyond that by restructuring
how the devices get probed. In particular, the spi driver
no longer creates the netdev until the device is probed,
and I've removed the global wilc_sdio_func and wilc_spi_dev
variables in favor of retrieving them from the wilc_dev
variable that will eventually get passed through all functions
instead of using a global.
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 750ffe9b
...@@ -1408,10 +1408,6 @@ void wilc_netdev_cleanup(struct wilc *wilc) ...@@ -1408,10 +1408,6 @@ void wilc_netdev_cleanup(struct wilc *wilc)
} }
kfree(wilc); kfree(wilc);
#if defined(WILC_DEBUGFS)
wilc_debugfs_remove();
#endif
} }
EXPORT_SYMBOL_GPL(wilc_netdev_cleanup); EXPORT_SYMBOL_GPL(wilc_netdev_cleanup);
...@@ -1491,3 +1487,5 @@ int wilc_netdev_init(struct wilc **wilc, struct device *dev, int io_type, ...@@ -1491,3 +1487,5 @@ int wilc_netdev_init(struct wilc **wilc, struct device *dev, int io_type,
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(wilc_netdev_init); EXPORT_SYMBOL_GPL(wilc_netdev_init);
MODULE_LICENSE("GPL");
...@@ -38,9 +38,6 @@ enum debug_region { ...@@ -38,9 +38,6 @@ enum debug_region {
#define FIRM_DBG (1 << Firmware_debug) #define FIRM_DBG (1 << Firmware_debug)
#if defined (WILC_DEBUGFS) #if defined (WILC_DEBUGFS)
int wilc_debugfs_init(void);
void wilc_debugfs_remove(void);
extern atomic_t WILC_REGION; extern atomic_t WILC_REGION;
extern atomic_t WILC_DEBUG_LEVEL; extern atomic_t WILC_DEBUG_LEVEL;
...@@ -122,15 +119,6 @@ extern atomic_t WILC_DEBUG_LEVEL; ...@@ -122,15 +119,6 @@ extern atomic_t WILC_DEBUG_LEVEL;
printk(__VA_ARGS__); \ printk(__VA_ARGS__); \
} while (0) } while (0)
static inline int wilc_debugfs_init(void)
{
return 0;
}
static inline void wilc_debugfs_remove(void)
{
}
#endif #endif
#define FN_IN /* PRINT_D(">>> \n") */ #define FN_IN /* PRINT_D(">>> \n") */
......
...@@ -135,12 +135,14 @@ static void linux_sdio_remove(struct sdio_func *func) ...@@ -135,12 +135,14 @@ static void linux_sdio_remove(struct sdio_func *func)
wilc_netdev_cleanup(sdio_get_drvdata(func)); wilc_netdev_cleanup(sdio_get_drvdata(func));
} }
static struct sdio_driver wilc_bus = { static struct sdio_driver wilc1000_sdio_driver = {
.name = SDIO_MODALIAS, .name = SDIO_MODALIAS,
.id_table = wilc_sdio_ids, .id_table = wilc_sdio_ids,
.probe = linux_sdio_probe, .probe = linux_sdio_probe,
.remove = linux_sdio_remove, .remove = linux_sdio_remove,
}; };
module_driver(wilc1000_sdio_driver, sdio_register_driver, sdio_unregister_driver);
MODULE_LICENSE("GPL");
int wilc_sdio_enable_interrupt(struct wilc *dev) int wilc_sdio_enable_interrupt(struct wilc *dev)
{ {
...@@ -178,14 +180,15 @@ void wilc_sdio_disable_interrupt(struct wilc *dev) ...@@ -178,14 +180,15 @@ void wilc_sdio_disable_interrupt(struct wilc *dev)
static int linux_sdio_set_speed(int speed) static int linux_sdio_set_speed(int speed)
{ {
struct mmc_ios ios; struct mmc_ios ios;
struct sdio_func *func = container_of(wilc_dev->dev, struct sdio_func, dev);
sdio_claim_host(wilc_sdio_func); sdio_claim_host(func);
memcpy((void *)&ios, (void *)&wilc_sdio_func->card->host->ios, sizeof(struct mmc_ios)); memcpy((void *)&ios, (void *)&func->card->host->ios, sizeof(struct mmc_ios));
wilc_sdio_func->card->host->ios.clock = speed; func->card->host->ios.clock = speed;
ios.clock = speed; ios.clock = speed;
wilc_sdio_func->card->host->ops->set_ios(wilc_sdio_func->card->host, &ios); func->card->host->ops->set_ios(func->card->host, &ios);
sdio_release_host(wilc_sdio_func); sdio_release_host(func);
PRINT_INFO(INIT_DBG, "@@@@@@@@@@@@ change SDIO speed to %d @@@@@@@@@\n", speed); PRINT_INFO(INIT_DBG, "@@@@@@@@@@@@ change SDIO speed to %d @@@@@@@@@\n", speed);
return 1; return 1;
...@@ -193,7 +196,8 @@ static int linux_sdio_set_speed(int speed) ...@@ -193,7 +196,8 @@ static int linux_sdio_set_speed(int speed)
static int linux_sdio_get_speed(void) static int linux_sdio_get_speed(void)
{ {
return wilc_sdio_func->card->host->ios.clock; struct sdio_func *func = container_of(wilc_dev->dev, struct sdio_func, dev);
return func->card->host->ios.clock;
} }
int wilc_sdio_init(void) int wilc_sdio_init(void)
...@@ -218,16 +222,4 @@ int wilc_sdio_set_default_speed(void) ...@@ -218,16 +222,4 @@ int wilc_sdio_set_default_speed(void)
return linux_sdio_set_speed(sdio_default_speed); return linux_sdio_set_speed(sdio_default_speed);
} }
static int __init init_wilc_sdio_driver(void)
{
return sdio_register_driver(&wilc_bus);
}
late_initcall(init_wilc_sdio_driver);
static void __exit exit_wilc_sdio_driver(void)
{
sdio_unregister_driver(&wilc_bus);
}
module_exit(exit_wilc_sdio_driver);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/of_gpio.h>
#include "linux_wlan_spi.h" #include "linux_wlan_spi.h"
#include "wilc_wfi_netdevice.h" #include "wilc_wfi_netdevice.h"
...@@ -43,59 +44,53 @@ ...@@ -43,59 +44,53 @@
static u32 SPEED = MIN_SPEED; static u32 SPEED = MIN_SPEED;
struct spi_device *wilc_spi_dev; static const struct wilc1000_ops wilc1000_spi_ops;
static int __init wilc_bus_probe(struct spi_device *spi) static int wilc_bus_probe(struct spi_device *spi)
{ {
int ret, gpio;
struct wilc *wilc;
PRINT_D(BUS_DBG, "spiModalias: %s\n", spi->modalias); gpio = of_get_gpio(spi->dev.of_node, 0);
PRINT_D(BUS_DBG, "spiMax-Speed: %d\n", spi->max_speed_hz); if (gpio < 0)
wilc_spi_dev = spi; gpio = GPIO_NUM;
ret = wilc_netdev_init(&wilc, NULL, HIF_SPI, GPIO_NUM, &wilc_hif_spi);
if (ret)
return ret;
spi_set_drvdata(spi, wilc);
wilc->dev = &spi->dev;
printk("Driver Initializing success\n");
return 0; return 0;
} }
static int __exit wilc_bus_remove(struct spi_device *spi) static int wilc_bus_remove(struct spi_device *spi)
{ {
wilc_netdev_cleanup(spi_get_drvdata(spi));
return 0; return 0;
} }
#ifdef CONFIG_OF
static const struct of_device_id wilc1000_of_match[] = { static const struct of_device_id wilc1000_of_match[] = {
{ .compatible = "atmel,wilc_spi", }, { .compatible = "atmel,wilc_spi", },
{} {}
}; };
MODULE_DEVICE_TABLE(of, wilc1000_of_match); MODULE_DEVICE_TABLE(of, wilc1000_of_match);
#endif
static struct spi_driver wilc_bus __refdata = { struct spi_driver wilc1000_spi_driver = {
.driver = { .driver = {
.name = MODALIAS, .name = MODALIAS,
#ifdef CONFIG_OF
.of_match_table = wilc1000_of_match, .of_match_table = wilc1000_of_match,
#endif
}, },
.probe = wilc_bus_probe, .probe = wilc_bus_probe,
.remove = __exit_p(wilc_bus_remove), .remove = wilc_bus_remove,
}; };
module_spi_driver(wilc1000_spi_driver);
MODULE_LICENSE("GPL");
int wilc_spi_init(void) int wilc_spi_init(void)
{ {
int ret = 1; return 1;
static int called;
if (called == 0) {
called++;
ret = spi_register_driver(&wilc_bus);
}
/* change return value to match WILC interface */
(ret < 0) ? (ret = 0) : (ret = 1);
return ret;
} }
#if defined(PLAT_WMS8304) #if defined(PLAT_WMS8304)
...@@ -106,6 +101,7 @@ int wilc_spi_init(void) ...@@ -106,6 +101,7 @@ int wilc_spi_init(void)
int wilc_spi_write(u8 *b, u32 len) int wilc_spi_write(u8 *b, u32 len)
{ {
struct spi_device *spi = to_spi_device(wilc_dev->dev);
int ret; int ret;
if (len > 0 && b != NULL) { if (len > 0 && b != NULL) {
...@@ -132,11 +128,11 @@ int wilc_spi_write(u8 *b, u32 len) ...@@ -132,11 +128,11 @@ int wilc_spi_write(u8 *b, u32 len)
memset(&msg, 0, sizeof(msg)); memset(&msg, 0, sizeof(msg));
spi_message_init(&msg); spi_message_init(&msg);
msg.spi = wilc_spi_dev; msg.spi = spi;
msg.is_dma_mapped = USE_SPI_DMA; msg.is_dma_mapped = USE_SPI_DMA;
spi_message_add_tail(&tr, &msg); spi_message_add_tail(&tr, &msg);
ret = spi_sync(wilc_spi_dev, &msg); ret = spi_sync(spi, &msg);
if (ret < 0) { if (ret < 0) {
PRINT_ER("SPI transaction failed\n"); PRINT_ER("SPI transaction failed\n");
} }
...@@ -157,11 +153,11 @@ int wilc_spi_write(u8 *b, u32 len) ...@@ -157,11 +153,11 @@ int wilc_spi_write(u8 *b, u32 len)
memset(&msg, 0, sizeof(msg)); memset(&msg, 0, sizeof(msg));
spi_message_init(&msg); spi_message_init(&msg);
msg.spi = wilc_spi_dev; msg.spi = spi;
msg.is_dma_mapped = USE_SPI_DMA; /* rachel */ msg.is_dma_mapped = USE_SPI_DMA; /* rachel */
spi_message_add_tail(&tr, &msg); spi_message_add_tail(&tr, &msg);
ret = spi_sync(wilc_spi_dev, &msg); ret = spi_sync(spi, &msg);
if (ret < 0) { if (ret < 0) {
PRINT_ER("SPI transaction failed\n"); PRINT_ER("SPI transaction failed\n");
} }
...@@ -183,7 +179,7 @@ int wilc_spi_write(u8 *b, u32 len) ...@@ -183,7 +179,7 @@ int wilc_spi_write(u8 *b, u32 len)
#else #else
int wilc_spi_write(u8 *b, u32 len) int wilc_spi_write(u8 *b, u32 len)
{ {
struct spi_device *spi = to_spi_device(wilc_dev->dev);
int ret; int ret;
struct spi_message msg; struct spi_message msg;
...@@ -204,12 +200,12 @@ int wilc_spi_write(u8 *b, u32 len) ...@@ -204,12 +200,12 @@ int wilc_spi_write(u8 *b, u32 len)
memset(&msg, 0, sizeof(msg)); memset(&msg, 0, sizeof(msg));
spi_message_init(&msg); spi_message_init(&msg);
/* [[johnny add */ /* [[johnny add */
msg.spi = wilc_spi_dev; msg.spi = spi;
msg.is_dma_mapped = USE_SPI_DMA; msg.is_dma_mapped = USE_SPI_DMA;
/* ]] */ /* ]] */
spi_message_add_tail(&tr, &msg); spi_message_add_tail(&tr, &msg);
ret = spi_sync(wilc_spi_dev, &msg); ret = spi_sync(spi, &msg);
if (ret < 0) { if (ret < 0) {
PRINT_ER("SPI transaction failed\n"); PRINT_ER("SPI transaction failed\n");
} }
...@@ -234,6 +230,7 @@ int wilc_spi_write(u8 *b, u32 len) ...@@ -234,6 +230,7 @@ int wilc_spi_write(u8 *b, u32 len)
int wilc_spi_read(u8 *rb, u32 rlen) int wilc_spi_read(u8 *rb, u32 rlen)
{ {
struct spi_device *spi = to_spi_device(wilc_dev->dev);
int ret; int ret;
if (rlen > 0) { if (rlen > 0) {
...@@ -260,11 +257,11 @@ int wilc_spi_read(u8 *rb, u32 rlen) ...@@ -260,11 +257,11 @@ int wilc_spi_read(u8 *rb, u32 rlen)
memset(&msg, 0, sizeof(msg)); memset(&msg, 0, sizeof(msg));
spi_message_init(&msg); spi_message_init(&msg);
msg.spi = wilc_spi_dev; msg.spi = spi;
msg.is_dma_mapped = USE_SPI_DMA; msg.is_dma_mapped = USE_SPI_DMA;
spi_message_add_tail(&tr, &msg); spi_message_add_tail(&tr, &msg);
ret = spi_sync(wilc_spi_dev, &msg); ret = spi_sync(spi, &msg);
if (ret < 0) { if (ret < 0) {
PRINT_ER("SPI transaction failed\n"); PRINT_ER("SPI transaction failed\n");
} }
...@@ -284,11 +281,11 @@ int wilc_spi_read(u8 *rb, u32 rlen) ...@@ -284,11 +281,11 @@ int wilc_spi_read(u8 *rb, u32 rlen)
memset(&msg, 0, sizeof(msg)); memset(&msg, 0, sizeof(msg));
spi_message_init(&msg); spi_message_init(&msg);
msg.spi = wilc_spi_dev; msg.spi = spi;
msg.is_dma_mapped = USE_SPI_DMA; /* rachel */ msg.is_dma_mapped = USE_SPI_DMA; /* rachel */
spi_message_add_tail(&tr, &msg); spi_message_add_tail(&tr, &msg);
ret = spi_sync(wilc_spi_dev, &msg); ret = spi_sync(spi, &msg);
if (ret < 0) { if (ret < 0) {
PRINT_ER("SPI transaction failed\n"); PRINT_ER("SPI transaction failed\n");
} }
...@@ -308,7 +305,7 @@ int wilc_spi_read(u8 *rb, u32 rlen) ...@@ -308,7 +305,7 @@ int wilc_spi_read(u8 *rb, u32 rlen)
#else #else
int wilc_spi_read(u8 *rb, u32 rlen) int wilc_spi_read(u8 *rb, u32 rlen)
{ {
struct spi_device *spi = to_spi_device(wilc_dev->dev);
int ret; int ret;
if (rlen > 0) { if (rlen > 0) {
...@@ -329,12 +326,12 @@ int wilc_spi_read(u8 *rb, u32 rlen) ...@@ -329,12 +326,12 @@ int wilc_spi_read(u8 *rb, u32 rlen)
memset(&msg, 0, sizeof(msg)); memset(&msg, 0, sizeof(msg));
spi_message_init(&msg); spi_message_init(&msg);
/* [[ johnny add */ /* [[ johnny add */
msg.spi = wilc_spi_dev; msg.spi = spi;
msg.is_dma_mapped = USE_SPI_DMA; msg.is_dma_mapped = USE_SPI_DMA;
/* ]] */ /* ]] */
spi_message_add_tail(&tr, &msg); spi_message_add_tail(&tr, &msg);
ret = spi_sync(wilc_spi_dev, &msg); ret = spi_sync(spi, &msg);
if (ret < 0) { if (ret < 0) {
PRINT_ER("SPI transaction failed\n"); PRINT_ER("SPI transaction failed\n");
} }
...@@ -353,7 +350,7 @@ int wilc_spi_read(u8 *rb, u32 rlen) ...@@ -353,7 +350,7 @@ int wilc_spi_read(u8 *rb, u32 rlen)
int wilc_spi_write_read(u8 *wb, u8 *rb, u32 rlen) int wilc_spi_write_read(u8 *wb, u8 *rb, u32 rlen)
{ {
struct spi_device *spi = to_spi_device(wilc_dev->dev);
int ret; int ret;
if (rlen > 0) { if (rlen > 0) {
...@@ -370,11 +367,11 @@ int wilc_spi_write_read(u8 *wb, u8 *rb, u32 rlen) ...@@ -370,11 +367,11 @@ int wilc_spi_write_read(u8 *wb, u8 *rb, u32 rlen)
memset(&msg, 0, sizeof(msg)); memset(&msg, 0, sizeof(msg));
spi_message_init(&msg); spi_message_init(&msg);
msg.spi = wilc_spi_dev; msg.spi = spi;
msg.is_dma_mapped = USE_SPI_DMA; msg.is_dma_mapped = USE_SPI_DMA;
spi_message_add_tail(&tr, &msg); spi_message_add_tail(&tr, &msg);
ret = spi_sync(wilc_spi_dev, &msg); ret = spi_sync(spi, &msg);
if (ret < 0) { if (ret < 0) {
PRINT_ER("SPI transaction failed\n"); PRINT_ER("SPI transaction failed\n");
} }
...@@ -395,40 +392,3 @@ int wilc_spi_set_max_speed(void) ...@@ -395,40 +392,3 @@ int wilc_spi_set_max_speed(void)
PRINT_INFO(BUS_DBG, "@@@@@@@@@@@@ change SPI speed to %d @@@@@@@@@\n", SPEED); PRINT_INFO(BUS_DBG, "@@@@@@@@@@@@ change SPI speed to %d @@@@@@@@@\n", SPEED);
return 1; return 1;
} }
static struct wilc *wilc;
static int __init init_wilc_spi_driver(void)
{
int ret;
wilc_debugfs_init();
ret = wilc_netdev_init(&wilc, NULL, HIF_SPI, GPIO_NUM, &wilc_hif_spi);
if (ret) {
wilc_debugfs_remove();
return ret;
}
if (!wilc_spi_init() || !wilc_spi_dev) {
PRINT_ER("Can't initialize SPI\n");
wilc_netdev_cleanup(wilc);
wilc_debugfs_remove();
return -ENXIO;
}
wilc_dev->dev = &wilc_spi_dev->dev;
return ret;
}
late_initcall(init_wilc_spi_driver);
static void __exit exit_wilc_spi_driver(void)
{
if (wilc)
wilc_netdev_cleanup(wilc);
spi_unregister_driver(&wilc_bus);
wilc_debugfs_remove();
}
module_exit(exit_wilc_spi_driver);
MODULE_LICENSE("GPL");
...@@ -138,7 +138,7 @@ static struct wilc_debugfs_info_t debugfs_info[] = { ...@@ -138,7 +138,7 @@ static struct wilc_debugfs_info_t debugfs_info[] = {
{ "wilc_debug_region", 0666, (INIT_DBG | GENERIC_DBG | CFG80211_DBG), FOPS(NULL, wilc_debug_region_read, wilc_debug_region_write, NULL), }, { "wilc_debug_region", 0666, (INIT_DBG | GENERIC_DBG | CFG80211_DBG), FOPS(NULL, wilc_debug_region_read, wilc_debug_region_write, NULL), },
}; };
int wilc_debugfs_init(void) static int __init wilc_debugfs_init(void)
{ {
int i; int i;
...@@ -173,11 +173,13 @@ int wilc_debugfs_init(void) ...@@ -173,11 +173,13 @@ int wilc_debugfs_init(void)
} }
return 0; return 0;
} }
module_init(wilc_debugfs_init);
void wilc_debugfs_remove(void) static void __exit wilc_debugfs_remove(void)
{ {
debugfs_remove_recursive(wilc_dir); debugfs_remove_recursive(wilc_dir);
} }
module_exit(wilc_debugfs_remove);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment