[ARM] pxa/cm-x270: add libertas device registration
v2 changes: - use gpio_to_irq instead of IRQ_GPIO - check gpio_direction_output return value to be on the safe side :) Signed-off-by: Mike Rapoport <mike@compulab.co.il> Signed-off-by: Eric Miao <eric.y.miao@gmail.com>
This commit is contained in:
parent
100a1d250d
commit
a2099e49f4
|
@ -13,13 +13,18 @@
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
|
||||||
#include <linux/rtc-v3020.h>
|
#include <linux/rtc-v3020.h>
|
||||||
#include <video/mbxfb.h>
|
#include <video/mbxfb.h>
|
||||||
|
|
||||||
|
#include <linux/spi/spi.h>
|
||||||
|
#include <linux/spi/libertas_spi.h>
|
||||||
|
|
||||||
#include <mach/pxa27x.h>
|
#include <mach/pxa27x.h>
|
||||||
#include <mach/ohci.h>
|
#include <mach/ohci.h>
|
||||||
#include <mach/mmc.h>
|
#include <mach/mmc.h>
|
||||||
|
#include <mach/pxa2xx_spi.h>
|
||||||
|
|
||||||
#include "generic.h"
|
#include "generic.h"
|
||||||
|
|
||||||
|
@ -34,6 +39,10 @@
|
||||||
/* MMC power enable */
|
/* MMC power enable */
|
||||||
#define GPIO105_MMC_POWER (105)
|
#define GPIO105_MMC_POWER (105)
|
||||||
|
|
||||||
|
/* WLAN GPIOS */
|
||||||
|
#define GPIO19_WLAN_STRAP (19)
|
||||||
|
#define GPIO102_WLAN_RST (102)
|
||||||
|
|
||||||
static unsigned long cmx270_pin_config[] = {
|
static unsigned long cmx270_pin_config[] = {
|
||||||
/* AC'97 */
|
/* AC'97 */
|
||||||
GPIO28_AC97_BITCLK,
|
GPIO28_AC97_BITCLK,
|
||||||
|
@ -94,8 +103,8 @@ static unsigned long cmx270_pin_config[] = {
|
||||||
GPIO26_SSP1_RXD,
|
GPIO26_SSP1_RXD,
|
||||||
|
|
||||||
/* SSP2 */
|
/* SSP2 */
|
||||||
GPIO19_SSP2_SCLK,
|
GPIO19_GPIO, /* SSP2 clock is used as GPIO for Libertas pin-strap */
|
||||||
GPIO14_SSP2_SFRM,
|
GPIO14_GPIO,
|
||||||
GPIO87_SSP2_TXD,
|
GPIO87_SSP2_TXD,
|
||||||
GPIO88_SSP2_RXD,
|
GPIO88_SSP2_RXD,
|
||||||
|
|
||||||
|
@ -123,6 +132,7 @@ static unsigned long cmx270_pin_config[] = {
|
||||||
GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH,
|
GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH,
|
||||||
GPIO105_GPIO | MFP_LPM_DRIVE_HIGH, /* MMC/SD power */
|
GPIO105_GPIO | MFP_LPM_DRIVE_HIGH, /* MMC/SD power */
|
||||||
GPIO53_GPIO, /* PC card reset */
|
GPIO53_GPIO, /* PC card reset */
|
||||||
|
GPIO102_GPIO, /* WLAN reset */
|
||||||
|
|
||||||
/* NAND controls */
|
/* NAND controls */
|
||||||
GPIO11_GPIO | MFP_LPM_DRIVE_HIGH, /* NAND CE# */
|
GPIO11_GPIO | MFP_LPM_DRIVE_HIGH, /* NAND CE# */
|
||||||
|
@ -131,6 +141,7 @@ static unsigned long cmx270_pin_config[] = {
|
||||||
/* interrupts */
|
/* interrupts */
|
||||||
GPIO10_GPIO, /* DM9000 interrupt */
|
GPIO10_GPIO, /* DM9000 interrupt */
|
||||||
GPIO83_GPIO, /* MMC card detect */
|
GPIO83_GPIO, /* MMC card detect */
|
||||||
|
GPIO95_GPIO, /* WLAN interrupt */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* V3020 RTC */
|
/* V3020 RTC */
|
||||||
|
@ -287,6 +298,100 @@ static void __init cmx270_init_mmc(void)
|
||||||
static inline void cmx270_init_mmc(void) {}
|
static inline void cmx270_init_mmc(void) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
|
||||||
|
static struct pxa2xx_spi_master cm_x270_spi_info = {
|
||||||
|
.num_chipselect = 1,
|
||||||
|
.enable_dma = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct pxa2xx_spi_chip cm_x270_libertas_chip = {
|
||||||
|
.rx_threshold = 1,
|
||||||
|
.tx_threshold = 1,
|
||||||
|
.timeout = 1000,
|
||||||
|
.gpio_cs = 14,
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned long cm_x270_libertas_pin_config[] = {
|
||||||
|
/* SSP2 */
|
||||||
|
GPIO19_SSP2_SCLK,
|
||||||
|
GPIO14_GPIO,
|
||||||
|
GPIO87_SSP2_TXD,
|
||||||
|
GPIO88_SSP2_RXD,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
static int cm_x270_libertas_setup(struct spi_device *spi)
|
||||||
|
{
|
||||||
|
int err = gpio_request(GPIO19_WLAN_STRAP, "WLAN STRAP");
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
err = gpio_request(GPIO102_WLAN_RST, "WLAN RST");
|
||||||
|
if (err)
|
||||||
|
goto err_free_strap;
|
||||||
|
|
||||||
|
err = gpio_direction_output(GPIO102_WLAN_RST, 0);
|
||||||
|
if (err)
|
||||||
|
goto err_free_strap;
|
||||||
|
msleep(100);
|
||||||
|
|
||||||
|
err = gpio_direction_output(GPIO19_WLAN_STRAP, 1);
|
||||||
|
if (err)
|
||||||
|
goto err_free_strap;
|
||||||
|
msleep(100);
|
||||||
|
|
||||||
|
pxa2xx_mfp_config(ARRAY_AND_SIZE(cm_x270_libertas_pin_config));
|
||||||
|
|
||||||
|
gpio_set_value(GPIO102_WLAN_RST, 1);
|
||||||
|
msleep(100);
|
||||||
|
|
||||||
|
spi->bits_per_word = 16;
|
||||||
|
spi_setup(spi);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_free_strap:
|
||||||
|
gpio_free(GPIO19_WLAN_STRAP);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cm_x270_libertas_teardown(struct spi_device *spi)
|
||||||
|
{
|
||||||
|
gpio_set_value(GPIO102_WLAN_RST, 0);
|
||||||
|
gpio_free(GPIO102_WLAN_RST);
|
||||||
|
gpio_free(GPIO19_WLAN_STRAP);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct libertas_spi_platform_data cm_x270_libertas_pdata = {
|
||||||
|
.use_dummy_writes = 1,
|
||||||
|
.setup = cm_x270_libertas_setup,
|
||||||
|
.teardown = cm_x270_libertas_teardown,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct spi_board_info cm_x270_spi_devices[] __initdata = {
|
||||||
|
{
|
||||||
|
.modalias = "libertas_spi",
|
||||||
|
.max_speed_hz = 13000000,
|
||||||
|
.bus_num = 2,
|
||||||
|
.irq = gpio_to_irq(95),
|
||||||
|
.chip_select = 0,
|
||||||
|
.controller_data = &cm_x270_libertas_chip,
|
||||||
|
.platform_data = &cm_x270_libertas_pdata,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static void __init cmx270_init_spi(void)
|
||||||
|
{
|
||||||
|
pxa2xx_set_spi_info(2, &cm_x270_spi_info);
|
||||||
|
spi_register_board_info(ARRAY_AND_SIZE(cm_x270_spi_devices));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void cmx270_init_spi(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
void __init cmx270_init(void)
|
void __init cmx270_init(void)
|
||||||
{
|
{
|
||||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(cmx270_pin_config));
|
pxa2xx_mfp_config(ARRAY_AND_SIZE(cmx270_pin_config));
|
||||||
|
@ -299,4 +404,5 @@ void __init cmx270_init(void)
|
||||||
cmx270_init_mmc();
|
cmx270_init_mmc();
|
||||||
cmx270_init_ohci();
|
cmx270_init_ohci();
|
||||||
cmx270_init_2700G();
|
cmx270_init_2700G();
|
||||||
|
cmx270_init_spi();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue