+++ Marek Vasut [2010-07-29 05:16 +0200]: > This driver adds support for the on-board CF socket. > > Signed-off-by: Marek Vasut > --- > arch/arm/mach-pxa/balloon3.c | 13 ++- > arch/arm/mach-pxa/include/mach/balloon3.h | 17 --- > drivers/pcmcia/Kconfig | 2 +- > drivers/pcmcia/Makefile | 1 + > drivers/pcmcia/pxa2xx_balloon3.c | 199 +++++++++++++++++++++++++++++ > 5 files changed, 213 insertions(+), 19 deletions(-) > create mode 100644 drivers/pcmcia/pxa2xx_balloon3.c > > diff --git a/arch/arm/mach-pxa/balloon3.c b/arch/arm/mach-pxa/balloon3.c > index 572525c..91ad56d 100644 > --- a/arch/arm/mach-pxa/balloon3.c > +++ b/arch/arm/mach-pxa/balloon3.c > @@ -88,6 +88,18 @@ static unsigned long balloon3_pin_config[] __initdata = { > /* USB Host */ > GPIO88_USBH1_PWR, > GPIO89_USBH1_PEN, > + > + /* PC Card */ > + GPIO48_nPOE, > + GPIO49_nPWE, > + GPIO50_nPIOR, > + GPIO51_nPIOW, > + GPIO85_nPCE_1, > + GPIO54_nPCE_2, > + GPIO79_PSKTSEL, > + GPIO55_nPREG, > + GPIO56_nPWAIT, > + GPIO57_nIOIS16, > }; > > /****************************************************************************** > @@ -405,7 +417,6 @@ static void balloon3_irq_handler(unsigned int irq, struct irq_desc *desc) > { > unsigned long pending = __raw_readl(BALLOON3_INT_CONTROL_REG) & > balloon3_irq_enabled; > - > do { > /* clear useless edge notification */ > if (desc->chip->ack) > diff --git a/arch/arm/mach-pxa/include/mach/balloon3.h b/arch/arm/mach-pxa/include/mach/balloon3.h > index 1a74106..14f4bd5 100644 > --- a/arch/arm/mach-pxa/include/mach/balloon3.h > +++ b/arch/arm/mach-pxa/include/mach/balloon3.h > @@ -26,10 +26,6 @@ enum balloon3_features { > #define BALLOON3_FPGA_VIRT (0xf1000000) /* as per balloon2 */ > #define BALLOON3_FPGA_LENGTH 0x01000000 > > -/* FPGA/CPLD registers */ > -#define BALLOON3_PCMCIA0_REG (BALLOON3_FPGA_VIRT + 0x00e00008) > -/* fixme - same for now */ > -#define BALLOON3_PCMCIA1_REG (BALLOON3_FPGA_VIRT + 0x00e00008) > #define BALLOON3_NANDIO_IO_REG (BALLOON3_FPGA_VIRT + 0x00e00000) > /* fpga/cpld interrupt control register */ > #define BALLOON3_INT_CONTROL_REG (BALLOON3_FPGA_VIRT + 0x00e0000C) > @@ -58,16 +54,6 @@ enum balloon3_features { > #define BALLOON3_INT_S0_IRQ (1 << 0) /* PCMCIA 0 IRQ */ > #define BALLOON3_INT_S0_STSCHG (1 << 1) /* PCMCIA 0 status changed */ > > -/* CF Status Register */ > -#define BALLOON3_PCMCIA_nIRQ (1 << 0) /* IRQ / ready signal */ > -#define BALLOON3_PCMCIA_nSTSCHG_BVD1 (1 << 1) > - /* VDD sense / card status changed */ > - > -/* CF control register (write) */ > -#define BALLOON3_PCMCIA_RESET (1 << 0) /* Card reset signal */ > -#define BALLOON3_PCMCIA_ENABLE (1 << 1) > -#define BALLOON3_PCMCIA_ADD_ENABLE (1 << 2) > - > -#define BALLOON3_BP_CF_NRDY_IRQ BALLOON3_IRQ(0) > -#define BALLOON3_BP_NSTSCHG_IRQ BALLOON3_IRQ(1) > - > diff --git a/drivers/pcmcia/pxa2xx_balloon3.c b/drivers/pcmcia/pxa2xx_balloon3.c > new file mode 100644 > index 0000000..1f71f0d > --- /dev/null > +++ b/drivers/pcmcia/pxa2xx_balloon3.c > @@ -0,0 +1,199 @@ > +/* > + * FPGA / CPLD register offsets for CF socket > + */ > +#define BALLOON3_CF_STATUS_REG (0x10e00008) > +#define BALLOON3_CF_CONTROL_REG (0x10e00008) > +#define BALLOON3_FPGA_VER (0x10e0001c) > + > +/* CF Status Register bits (read-only) bits */ > +#define BALLOON3_CF_nIRQ (1 << 0) > +#define BALLOON3_CF_nSTSCHG_BVD1 (1 << 1) > + > +/* CF Control Set Register bits / CF Control Clear Register bits (write-only) */ > +#define BALLOON3_CF_RESET (1 << 0) > +#define BALLOON3_CF_ENABLE (1 << 1) > +#define BALLOON3_CF_ADD_ENABLE (1 << 2) > + > +/* CF Interrupt sources */ > +#define BALLOON3_BP_CF_NRDY_IRQ BALLOON3_IRQ(0) > +#define BALLOON3_BP_NSTSCHG_IRQ BALLOON3_IRQ(1) erm. Why move the FPGA/CPLD register definitions out of balloon3.h (along with the others) and put them in balloon3.c? Is that really good kernel form? And surely keeping the FPGA_VIRT offset makes it clearer where the magic addresses come from? And finally as this code is quite dependent on VHDL version numbers and we know we have a number of incompatible versions around should we add a version check to ensure that we have the same VHDL version as the driver is expecting? I guess it should be of the 'at least n' form, otherwise later VHDL updates would break the driver, probbaly for no good reason. Wookey -- Principal hats: Linaro, Emdebian, Wookware, Balloonboard, ARM http://wookware.org/