Commit cc513ac0 authored by Russell King's avatar Russell King Committed by Russell King

Merge branch 'viper-for-rmk' of git://www.misterjones.org/linux-2.6-arm

Merge branch 'pxa-viper' into pxa-machines

Conflicts:

	arch/arm/mach-pxa/Makefile
	drivers/pcmcia/Kconfig
	drivers/pcmcia/Makefile
parents 1543966a 19ec95df
This diff is collapsed.
...@@ -38,16 +38,19 @@ config ARCH_LUBBOCK ...@@ -38,16 +38,19 @@ config ARCH_LUBBOCK
bool "Intel DBPXA250 Development Platform" bool "Intel DBPXA250 Development Platform"
select PXA25x select PXA25x
select SA1111 select SA1111
select PXA_HAVE_BOARD_IRQS
config MACH_LOGICPD_PXA270 config MACH_LOGICPD_PXA270
bool "LogicPD PXA270 Card Engine Development Platform" bool "LogicPD PXA270 Card Engine Development Platform"
select PXA27x select PXA27x
select HAVE_PWM select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
config MACH_MAINSTONE config MACH_MAINSTONE
bool "Intel HCDDBBVA0 Development Platform" bool "Intel HCDDBBVA0 Development Platform"
select PXA27x select PXA27x
select HAVE_PWM select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
config MACH_MP900C config MACH_MP900C
bool "Nec Mobilepro 900/c" bool "Nec Mobilepro 900/c"
...@@ -118,10 +121,21 @@ config MACH_TOSA ...@@ -118,10 +121,21 @@ config MACH_TOSA
bool "Enable Sharp SL-6000x (Tosa) Support" bool "Enable Sharp SL-6000x (Tosa) Support"
depends on PXA_SHARPSL depends on PXA_SHARPSL
select PXA25x select PXA25x
select PXA_HAVE_BOARD_IRQS
config ARCH_VIPER
bool "Arcom/Eurotech VIPER SBC"
select PXA25x
select ISA
select I2C_GPIO
select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
select PXA_HAVE_ISA_IRQS
config ARCH_PXA_ESERIES config ARCH_PXA_ESERIES
bool "PXA based Toshiba e-series PDAs" bool "PXA based Toshiba e-series PDAs"
select PXA25x select PXA25x
select PXA_HAVE_BOARD_IRQS
config MACH_E330 config MACH_E330
bool "Toshiba e330" bool "Toshiba e330"
...@@ -255,6 +269,7 @@ config MACH_MAGICIAN ...@@ -255,6 +269,7 @@ config MACH_MAGICIAN
bool "Enable HTC Magician Support" bool "Enable HTC Magician Support"
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select PXA_HAVE_BOARD_IRQS
config MACH_MIOA701 config MACH_MIOA701
bool "Mitac Mio A701 Support" bool "Mitac Mio A701 Support"
...@@ -273,6 +288,7 @@ config MACH_PCM027 ...@@ -273,6 +288,7 @@ config MACH_PCM027
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select PXA_SSP select PXA_SSP
select PXA_HAVE_BOARD_IRQS
config ARCH_PXA_PALM config ARCH_PXA_PALM
bool "PXA based Palm PDAs" bool "PXA based Palm PDAs"
...@@ -408,4 +424,10 @@ config TOSA_BT ...@@ -408,4 +424,10 @@ config TOSA_BT
This is a simple driver that is able to control This is a simple driver that is able to control
the state of built in bluetooth chip on tosa. the state of built in bluetooth chip on tosa.
config PXA_HAVE_BOARD_IRQS
bool
config PXA_HAVE_ISA_IRQS
bool
endif endif
...@@ -39,13 +39,16 @@ obj-$(CONFIG_MACH_TOSA) += tosa.o ...@@ -39,13 +39,16 @@ obj-$(CONFIG_MACH_TOSA) += tosa.o
obj-$(CONFIG_MACH_EM_X270) += em-x270.o obj-$(CONFIG_MACH_EM_X270) += em-x270.o
obj-$(CONFIG_MACH_MAGICIAN) += magician.o obj-$(CONFIG_MACH_MAGICIAN) += magician.o
obj-$(CONFIG_MACH_MIOA701) += mioa701.o mioa701_bootresume.o obj-$(CONFIG_MACH_MIOA701) += mioa701.o mioa701_bootresume.o
obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o eseries_udc.o obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o
obj-$(CONFIG_MACH_E740) += e740_lcd.o obj-$(CONFIG_MACH_E330) += e330.o
obj-$(CONFIG_MACH_E750) += e750_lcd.o obj-$(CONFIG_MACH_E350) += e350.o
obj-$(CONFIG_MACH_E400) += e400_lcd.o obj-$(CONFIG_MACH_E740) += e740.o
obj-$(CONFIG_MACH_E800) += e800_lcd.o obj-$(CONFIG_MACH_E750) += e750.o
obj-$(CONFIG_MACH_E400) += e400.o
obj-$(CONFIG_MACH_E800) += e800.o
obj-$(CONFIG_MACH_PALMTX) += palmtx.o obj-$(CONFIG_MACH_PALMTX) += palmtx.o
obj-$(CONFIG_MACH_PALMZ72) += palmz72.o obj-$(CONFIG_MACH_PALMZ72) += palmz72.o
obj-$(CONFIG_ARCH_VIPER) += viper.o
ifeq ($(CONFIG_MACH_ZYLONITE),y) ifeq ($(CONFIG_MACH_ZYLONITE),y)
obj-y += zylonite.o obj-y += zylonite.o
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
and \irqstat, \irqstat, \irqnr and \irqstat, \irqstat, \irqnr
clz \irqnr, \irqstat clz \irqnr, \irqstat
rsb \irqnr, \irqnr, #31 rsb \irqnr, \irqnr, #31
add \irqnr, \irqnr, #32 add \irqnr, \irqnr, #(32 + PXA_IRQ(0))
b 1001f b 1001f
1003: 1003:
mrc p6, 0, \irqstat, c0, c0, 0 @ ICIP mrc p6, 0, \irqstat, c0, c0, 0 @ ICIP
...@@ -52,6 +52,6 @@ ...@@ -52,6 +52,6 @@
rsb \irqstat, \irqnr, #0 rsb \irqstat, \irqnr, #0
and \irqstat, \irqstat, \irqnr and \irqstat, \irqstat, \irqnr
clz \irqnr, \irqstat clz \irqnr, \irqstat
rsb \irqnr, \irqnr, #31 rsb \irqnr, \irqnr, #(31 + PXA_IRQ(0))
1001: 1001:
.endm .endm
...@@ -11,7 +11,14 @@ ...@@ -11,7 +11,14 @@
*/ */
#define PXA_IRQ(x) (x) #ifdef CONFIG_PXA_HAVE_ISA_IRQS
#define PXA_ISA_IRQ(x) (x)
#define PXA_ISA_IRQ_NUM (16)
#else
#define PXA_ISA_IRQ_NUM (0)
#endif
#define PXA_IRQ(x) (PXA_ISA_IRQ_NUM + (x))
#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx) #if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)
#define IRQ_SSP3 PXA_IRQ(0) /* SSP3 service request */ #define IRQ_SSP3 PXA_IRQ(0) /* SSP3 service request */
...@@ -73,7 +80,7 @@ ...@@ -73,7 +80,7 @@
#define IRQ_MMC3 PXA_IRQ(55) /* MMC3 Controller (PXA310) */ #define IRQ_MMC3 PXA_IRQ(55) /* MMC3 Controller (PXA310) */
#endif #endif
#define PXA_GPIO_IRQ_BASE (64) #define PXA_GPIO_IRQ_BASE PXA_IRQ(64)
#define PXA_GPIO_IRQ_NUM (128) #define PXA_GPIO_IRQ_NUM (128)
#define GPIO_2_x_TO_IRQ(x) (PXA_GPIO_IRQ_BASE + (x)) #define GPIO_2_x_TO_IRQ(x) (PXA_GPIO_IRQ_BASE + (x))
...@@ -178,13 +185,7 @@ ...@@ -178,13 +185,7 @@
#define NR_IRQS (IRQ_S1_BVD1_STSCHG + 1) #define NR_IRQS (IRQ_S1_BVD1_STSCHG + 1)
#elif defined(CONFIG_SHARP_LOCOMO) #elif defined(CONFIG_SHARP_LOCOMO)
#define NR_IRQS (IRQ_LOCOMO_SPI_TEND + 1) #define NR_IRQS (IRQ_LOCOMO_SPI_TEND + 1)
#elif defined(CONFIG_ARCH_LUBBOCK) || \ #elif defined(CONFIG_PXA_HAVE_BOARD_IRQS)
defined(CONFIG_MACH_LOGICPD_PXA270) || \
defined(CONFIG_MACH_TOSA) || \
defined(CONFIG_MACH_MAINSTONE) || \
defined(CONFIG_MACH_PCM027) || \
defined(CONFIG_ARCH_PXA_ESERIES) || \
defined(CONFIG_MACH_MAGICIAN)
#define NR_IRQS (IRQ_BOARD_END) #define NR_IRQS (IRQ_BOARD_END)
#elif defined(CONFIG_MACH_ZYLONITE) #elif defined(CONFIG_MACH_ZYLONITE)
#define NR_IRQS (IRQ_BOARD_START + 32) #define NR_IRQS (IRQ_BOARD_START + 32)
......
/*
* arch/arm/mach-pxa/include/mach/viper.h
*
* Author: Ian Campbell
* Created: Feb 03, 2003
* Copyright: Arcom Control Systems.
*
* Maintained by Marc Zyngier <maz@misterjones.org>
* <marc.zyngier@altran.com>
*
* Created based on lubbock.h:
* Author: Nicolas Pitre
* Created: Jun 15, 2001
* Copyright: MontaVista Software Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef ARCH_VIPER_H
#define ARCH_VIPER_H
#define VIPER_BOOT_PHYS PXA_CS0_PHYS
#define VIPER_FLASH_PHYS PXA_CS1_PHYS
#define VIPER_ETH_PHYS PXA_CS2_PHYS
#define VIPER_USB_PHYS PXA_CS3_PHYS
#define VIPER_ETH_DATA_PHYS PXA_CS4_PHYS
#define VIPER_CPLD_PHYS PXA_CS5_PHYS
#define VIPER_CPLD_BASE (0xf0000000)
#define VIPER_PC104IO_BASE (0xf1000000)
#define VIPER_USB_BASE (0xf1800000)
#define VIPER_ETH_GPIO (0)
#define VIPER_CPLD_GPIO (1)
#define VIPER_USB_GPIO (2)
#define VIPER_UARTA_GPIO (4)
#define VIPER_UARTB_GPIO (3)
#define VIPER_CF_CD_GPIO (32)
#define VIPER_CF_RDY_GPIO (8)
#define VIPER_BCKLIGHT_EN_GPIO (9)
#define VIPER_LCD_EN_GPIO (10)
#define VIPER_PSU_DATA_GPIO (6)
#define VIPER_PSU_CLK_GPIO (11)
#define VIPER_UART_SHDN_GPIO (12)
#define VIPER_BRIGHTNESS_GPIO (16)
#define VIPER_PSU_nCS_LD_GPIO (19)
#define VIPER_UPS_GPIO (20)
#define VIPER_CF_POWER_GPIO (82)
#define VIPER_TPM_I2C_SDA_GPIO (26)
#define VIPER_TPM_I2C_SCL_GPIO (27)
#define VIPER_RTC_I2C_SDA_GPIO (83)
#define VIPER_RTC_I2C_SCL_GPIO (84)
#define VIPER_CPLD_P2V(x) ((x) - VIPER_CPLD_PHYS + VIPER_CPLD_BASE)
#define VIPER_CPLD_V2P(x) ((x) - VIPER_CPLD_BASE + VIPER_CPLD_PHYS)
#ifndef __ASSEMBLY__
# define __VIPER_CPLD_REG(x) (*((volatile u16 *)VIPER_CPLD_P2V(x)))
#endif
/* board level registers in the CPLD: (offsets from CPLD_BASE) ... */
/* ... Physical addresses */
#define _VIPER_LO_IRQ_STATUS (VIPER_CPLD_PHYS + 0x100000)
#define _VIPER_ICR_PHYS (VIPER_CPLD_PHYS + 0x100002)
#define _VIPER_HI_IRQ_STATUS (VIPER_CPLD_PHYS + 0x100004)
#define _VIPER_VERSION_PHYS (VIPER_CPLD_PHYS + 0x100006)
#define VIPER_UARTA_PHYS (VIPER_CPLD_PHYS + 0x300010)
#define VIPER_UARTB_PHYS (VIPER_CPLD_PHYS + 0x300000)
#define _VIPER_SRAM_BASE (VIPER_CPLD_PHYS + 0x800000)
/* ... Virtual addresses */
#define VIPER_LO_IRQ_STATUS __VIPER_CPLD_REG(_VIPER_LO_IRQ_STATUS)
#define VIPER_HI_IRQ_STATUS __VIPER_CPLD_REG(_VIPER_HI_IRQ_STATUS)
#define VIPER_VERSION __VIPER_CPLD_REG(_VIPER_VERSION_PHYS)
#define VIPER_ICR __VIPER_CPLD_REG(_VIPER_ICR_PHYS)
/* Decode VIPER_VERSION register */
#define VIPER_CPLD_REVISION(x) (((x) >> 5) & 0x7)
#define VIPER_BOARD_VERSION(x) (((x) >> 3) & 0x3)
#define VIPER_BOARD_ISSUE(x) (((x) >> 0) & 0x7)
/* Interrupt and Configuration Register (VIPER_ICR) */
/* This is a write only register. Only CF_RST is used under Linux */
extern void viper_cf_rst(int state);
#define VIPER_ICR_RETRIG (1 << 0)
#define VIPER_ICR_AUTO_CLR (1 << 1)
#define VIPER_ICR_R_DIS (1 << 2)
#define VIPER_ICR_CF_RST (1 << 3)
#endif
...@@ -57,7 +57,7 @@ void __init pxa_init_irq(int irq_nr, set_wake_t fn) ...@@ -57,7 +57,7 @@ void __init pxa_init_irq(int irq_nr, set_wake_t fn)
pxa_internal_irq_nr = irq_nr; pxa_internal_irq_nr = irq_nr;
for (irq = 0; irq < irq_nr; irq += 32) { for (irq = PXA_IRQ(0); irq < PXA_IRQ(irq_nr); irq += 32) {
_ICMR(irq) = 0; /* disable all IRQs */ _ICMR(irq) = 0; /* disable all IRQs */
_ICLR(irq) = 0; /* all IRQs are IRQ, not FIQ */ _ICLR(irq) = 0; /* all IRQs are IRQ, not FIQ */
} }
......
This diff is collapsed.
...@@ -1520,7 +1520,9 @@ smc_open(struct net_device *dev) ...@@ -1520,7 +1520,9 @@ smc_open(struct net_device *dev)
/* Setup the default Register Modes */ /* Setup the default Register Modes */
lp->tcr_cur_mode = TCR_DEFAULT; lp->tcr_cur_mode = TCR_DEFAULT;
lp->rcr_cur_mode = RCR_DEFAULT; lp->rcr_cur_mode = RCR_DEFAULT;
lp->rpc_cur_mode = RPC_DEFAULT; lp->rpc_cur_mode = RPC_DEFAULT |
lp->cfg.leda << RPC_LSXA_SHFT |
lp->cfg.ledb << RPC_LSXB_SHFT;
/* /*
* If we are not using a MII interface, we need to * If we are not using a MII interface, we need to
...@@ -2157,6 +2159,11 @@ static int smc_drv_probe(struct platform_device *pdev) ...@@ -2157,6 +2159,11 @@ static int smc_drv_probe(struct platform_device *pdev)
lp->cfg.flags |= (nowait) ? SMC91X_NOWAIT : 0; lp->cfg.flags |= (nowait) ? SMC91X_NOWAIT : 0;
} }
if (!lp->cfg.leda && !lp->cfg.ledb) {
lp->cfg.leda = RPC_LSA_DEFAULT;
lp->cfg.ledb = RPC_LSB_DEFAULT;
}
ndev->dma = (unsigned char)-1; ndev->dma = (unsigned char)-1;
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-regs"); res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-regs");
......
...@@ -43,7 +43,8 @@ ...@@ -43,7 +43,8 @@
#if defined(CONFIG_ARCH_LUBBOCK) ||\ #if defined(CONFIG_ARCH_LUBBOCK) ||\
defined(CONFIG_MACH_MAINSTONE) ||\ defined(CONFIG_MACH_MAINSTONE) ||\
defined(CONFIG_MACH_ZYLONITE) ||\ defined(CONFIG_MACH_ZYLONITE) ||\
defined(CONFIG_MACH_LITTLETON) defined(CONFIG_MACH_LITTLETON) ||\
defined(CONFIG_ARCH_VIPER)
#include <asm/mach-types.h> #include <asm/mach-types.h>
...@@ -778,14 +779,6 @@ smc_pxa_dma_irq(int dma, void *dummy) ...@@ -778,14 +779,6 @@ smc_pxa_dma_irq(int dma, void *dummy)
#define RPC_ANEG 0x0800 // When 1 PHY is in Auto-Negotiate Mode #define RPC_ANEG 0x0800 // When 1 PHY is in Auto-Negotiate Mode
#define RPC_LSXA_SHFT 5 // Bits to shift LS2A,LS1A,LS0A to lsb #define RPC_LSXA_SHFT 5 // Bits to shift LS2A,LS1A,LS0A to lsb
#define RPC_LSXB_SHFT 2 // Bits to get LS2B,LS1B,LS0B to lsb #define RPC_LSXB_SHFT 2 // Bits to get LS2B,LS1B,LS0B to lsb
#define RPC_LED_100_10 (0x00) // LED = 100Mbps OR's with 10Mbps link detect
#define RPC_LED_RES (0x01) // LED = Reserved
#define RPC_LED_10 (0x02) // LED = 10Mbps link detect
#define RPC_LED_FD (0x03) // LED = Full Duplex Mode
#define RPC_LED_TX_RX (0x04) // LED = TX or RX packet occurred
#define RPC_LED_100 (0x05) // LED = 100Mbps link dectect
#define RPC_LED_TX (0x06) // LED = TX packet occurred
#define RPC_LED_RX (0x07) // LED = RX packet occurred
#ifndef RPC_LSA_DEFAULT #ifndef RPC_LSA_DEFAULT
#define RPC_LSA_DEFAULT RPC_LED_100 #define RPC_LSA_DEFAULT RPC_LED_100
...@@ -794,7 +787,7 @@ smc_pxa_dma_irq(int dma, void *dummy) ...@@ -794,7 +787,7 @@ smc_pxa_dma_irq(int dma, void *dummy)
#define RPC_LSB_DEFAULT RPC_LED_FD #define RPC_LSB_DEFAULT RPC_LED_FD
#endif #endif
#define RPC_DEFAULT (RPC_ANEG | (RPC_LSA_DEFAULT << RPC_LSXA_SHFT) | (RPC_LSB_DEFAULT << RPC_LSXB_SHFT) | RPC_SPEED | RPC_DPLX) #define RPC_DEFAULT (RPC_ANEG | RPC_SPEED | RPC_DPLX)
/* Bank 0 0x0C is reserved */ /* Bank 0 0x0C is reserved */
......
...@@ -220,7 +220,8 @@ config PCMCIA_PXA2XX ...@@ -220,7 +220,8 @@ config PCMCIA_PXA2XX
tristate "PXA2xx support" tristate "PXA2xx support"
depends on ARM && ARCH_PXA && PCMCIA depends on ARM && ARCH_PXA && PCMCIA
depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \ depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \
|| MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA) || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \
|| ARCH_VIPER)
help help
Say Y here to include support for the PXA2xx PCMCIA controller Say Y here to include support for the PXA2xx PCMCIA controller
......
...@@ -72,7 +72,7 @@ pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK) += pxa2xx_lubbock.o sa1111_generic.o ...@@ -72,7 +72,7 @@ pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK) += pxa2xx_lubbock.o sa1111_generic.o
pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o
pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o
pxa2xx_cs-$(CONFIG_MACH_ARMCORE) += pxa2xx_cm_x2xx.o pxa2xx_cm_x255.o pxa2xx_cm_x270.o pxa2xx_cs-$(CONFIG_MACH_ARMCORE) += pxa2xx_cm_x2xx.o pxa2xx_cm_x255.o pxa2xx_cm_x270.o
pxa2xx_cs-$(CONFIG_ARCH_VIPER) += pxa2xx_viper.o
pxa2xx_cs-$(CONFIG_TRIZEPS_PCMCIA) += pxa2xx_trizeps.o pxa2xx_cs-$(CONFIG_TRIZEPS_PCMCIA) += pxa2xx_trizeps.o
pxa2xx_cs-$(CONFIG_MACH_PALMTX) += pxa2xx_palmtx.o pxa2xx_cs-$(CONFIG_MACH_PALMTX) += pxa2xx_palmtx.o
pxa2xx_cs-$(CONFIG_MACH_PALMLD) += pxa2xx_palmld.o pxa2xx_cs-$(CONFIG_MACH_PALMLD) += pxa2xx_palmld.o
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <asm/system.h> #include <asm/system.h>
#include <mach/pxa-regs.h> #include <mach/pxa-regs.h>
#include <mach/pxa2xx-regs.h> #include <mach/pxa2xx-regs.h>
#include <asm/mach-types.h>
#include <pcmcia/cs_types.h> #include <pcmcia/cs_types.h>
#include <pcmcia/ss.h> #include <pcmcia/ss.h>
...@@ -166,18 +167,32 @@ pxa2xx_pcmcia_frequency_change(struct soc_pcmcia_socket *skt, ...@@ -166,18 +167,32 @@ pxa2xx_pcmcia_frequency_change(struct soc_pcmcia_socket *skt,
} }
#endif #endif
static void pxa2xx_configure_sockets(struct device *dev)
{
struct pcmcia_low_level *ops = dev->platform_data;
/*
* We have at least one socket, so set MECR:CIT
* (Card Is There)
*/
MECR |= MECR_CIT;
/* Set MECR:NOS (Number Of Sockets) */
if (ops->nr > 1 || machine_is_viper())
MECR |= MECR_NOS;
else
MECR &= ~MECR_NOS;
}
int __pxa2xx_drv_pcmcia_probe(struct device *dev) int __pxa2xx_drv_pcmcia_probe(struct device *dev)
{ {
int ret; int ret;
struct pcmcia_low_level *ops; struct pcmcia_low_level *ops;
int first, nr;
if (!dev || !dev->platform_data) if (!dev || !dev->platform_data)
return -ENODEV; return -ENODEV;
ops = (struct pcmcia_low_level *)dev->platform_data; ops = (struct pcmcia_low_level *)dev->platform_data;
first = ops->first;
nr = ops->nr;
/* Provide our PXA2xx specific timing routines. */ /* Provide our PXA2xx specific timing routines. */
ops->set_timing = pxa2xx_pcmcia_set_timing; ops->set_timing = pxa2xx_pcmcia_set_timing;
...@@ -185,21 +200,10 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev) ...@@ -185,21 +200,10 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
ops->frequency_change = pxa2xx_pcmcia_frequency_change; ops->frequency_change = pxa2xx_pcmcia_frequency_change;
#endif #endif
ret = soc_common_drv_pcmcia_probe(dev, ops, first, nr); ret = soc_common_drv_pcmcia_probe(dev, ops, ops->first, ops->nr);
if (ret == 0) { if (!ret)
/* pxa2xx_configure_sockets(dev);
* We have at least one socket, so set MECR:CIT
* (Card Is There)
*/
MECR |= MECR_CIT;
/* Set MECR:NOS (Number Of Sockets) */
if (nr > 1)
MECR |= MECR_NOS;
else
MECR &= ~MECR_NOS;
}
return ret; return ret;
} }
...@@ -223,11 +227,7 @@ static int pxa2xx_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t s ...@@ -223,11 +227,7 @@ static int pxa2xx_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t s
static int pxa2xx_drv_pcmcia_resume(struct platform_device *dev) static int pxa2xx_drv_pcmcia_resume(struct platform_device *dev)
{ {
struct pcmcia_low_level *ops = dev->dev.platform_data; pxa2xx_configure_sockets(&dev->dev);
int nr = ops ? ops->nr : 0;
MECR = nr > 1 ? MECR_CIT | MECR_NOS : (nr > 0 ? MECR_CIT : 0);
return pcmcia_socket_dev_resume(&dev->dev); return pcmcia_socket_dev_resume(&dev->dev);
} }
......
/*
* VIPER PCMCIA support
* Copyright 2004 Arcom Control Systems
*
* Maintained by Marc Zyngier <maz@misterjones.org>
* <marc.zyngier@altran.com>
*
* Based on:
* iPAQ h2200 PCMCIA support
* Copyright 2004 Koen Kooi <koen@vestingbar.nl>
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive for
* more details.
*/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <pcmcia/ss.h>
#include <asm/irq.h>
#include <mach/pxa-regs.h>
#include <mach/viper.h>
#include <asm/mach-types.h>
#include "soc_common.h"
#include "pxa2xx_base.h"
static struct pcmcia_irqs irqs[] = {
{ 0, gpio_to_irq(VIPER_CF_CD_GPIO), "PCMCIA_CD" }
};
static int viper_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{
unsigned long flags;
skt->irq = gpio_to_irq(VIPER_CF_RDY_GPIO);
if (gpio_request(VIPER_CF_CD_GPIO, "CF detect"))
goto err_request_cd;
if (gpio_request(VIPER_CF_RDY_GPIO, "CF ready"))
goto err_request_rdy;
if (gpio_request(VIPER_CF_POWER_GPIO, "CF power"))
goto err_request_pwr;
local_irq_save(flags);
/* GPIO 82 is the CF power enable line. initially off */
if (gpio_direction_output(VIPER_CF_POWER_GPIO, 0) ||
gpio_direction_input(VIPER_CF_CD_GPIO) ||
gpio_direction_input(VIPER_CF_RDY_GPIO)) {
local_irq_restore(flags);
goto err_dir;
}
local_irq_restore(flags);
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
err_dir:
gpio_free(VIPER_CF_POWER_GPIO);
err_request_pwr:
gpio_free(VIPER_CF_RDY_GPIO);
err_request_rdy:
gpio_free(VIPER_CF_CD_GPIO);
err_request_cd:
printk(KERN_ERR "viper: Failed to setup PCMCIA GPIOs\n");
return -1;
}
/*
* Release all resources.
*/
static void viper_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
{
soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
gpio_free(VIPER_CF_POWER_GPIO);
gpio_free(VIPER_CF_RDY_GPIO);
gpio_free(VIPER_CF_CD_GPIO);
}
static void viper_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
struct pcmcia_state *state)
{
state->detect = gpio_get_value(VIPER_CF_CD_GPIO) ? 0 : 1;
state->ready = gpio_get_value(VIPER_CF_RDY_GPIO) ? 1 : 0;
state->bvd1 = 1;
state->bvd2 = 1;
state->wrprot = 0;
state->vs_3v = 1; /* Can only apply 3.3V */
state->vs_Xv = 0;
}
static int viper_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
const socket_state_t *state)
{
/* Silently ignore Vpp, output enable, speaker enable. */
viper_cf_rst(state->flags & SS_RESET);
/* Apply socket voltage */
switch (state->Vcc) {
case 0:
gpio_set_value(VIPER_CF_POWER_GPIO, 0);
break;
case 33:
gpio_set_value(VIPER_CF_POWER_GPIO, 1);
break;
default:
printk(KERN_ERR "%s: Unsupported Vcc:%d\n",
__func__, state->Vcc);
return -1;
}
return 0;
}
static void viper_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
{
}
static void viper_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
{
}
static struct pcmcia_low_level viper_pcmcia_ops __initdata = {
.owner = THIS_MODULE,
.hw_init = viper_pcmcia_hw_init,
.hw_shutdown = viper_pcmcia_hw_shutdown,
.socket_state = viper_pcmcia_socket_state,
.configure_socket = viper_pcmcia_configure_socket,
.socket_init = viper_pcmcia_socket_init,
.socket_suspend = viper_pcmcia_socket_suspend,
.nr = 1,
};
static struct platform_device *viper_pcmcia_device;
static int __init viper_pcmcia_init(void)
{
int ret;
if (!machine_is_viper())
return -ENODEV;
viper_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
if (!viper_pcmcia_device)
return -ENOMEM;
ret = platform_device_add_data(viper_pcmcia_device,
&viper_pcmcia_ops,
sizeof(viper_pcmcia_ops));
if (!ret)
ret = platform_device_add(viper_pcmcia_device);
if (ret)
platform_device_put(viper_pcmcia_device);
return ret;
}
static void __exit viper_pcmcia_exit(void)
{
platform_device_unregister(viper_pcmcia_device);
}
module_init(viper_pcmcia_init);
module_exit(viper_pcmcia_exit);
MODULE_LICENSE("GPL");
...@@ -16,8 +16,19 @@ ...@@ -16,8 +16,19 @@
#define SMC91X_USE_DMA (1 << 6) #define SMC91X_USE_DMA (1 << 6)
#define RPC_LED_100_10 (0x00) /* LED = 100Mbps OR's with 10Mbps link detect */
#define RPC_LED_RES (0x01) /* LED = Reserved */
#define RPC_LED_10 (0x02) /* LED = 10Mbps link detect */
#define RPC_LED_FD (0x03) /* LED = Full Duplex Mode */
#define RPC_LED_TX_RX (0x04) /* LED = TX or RX packet occurred */
#define RPC_LED_100 (0x05) /* LED = 100Mbps link dectect */
#define RPC_LED_TX (0x06) /* LED = TX packet occurred */
#define RPC_LED_RX (0x07) /* LED = RX packet occurred */
struct smc91x_platdata { struct smc91x_platdata {
unsigned long flags; unsigned long flags;
unsigned char leda;
unsigned char ledb;
}; };
#endif /* __SMC91X_H__ */ #endif /* __SMC91X_H__ */
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