Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
5ff7f78a
Commit
5ff7f78a
authored
Oct 07, 2008
by
Russell King
Committed by
Russell King
Oct 07, 2008
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'pxa-trizeps' into pxa-machines
Conflicts: drivers/pcmcia/Makefile
parents
35437b61
92b797f6
Changes
10
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
680 additions
and
383 deletions
+680
-383
arch/arm/Kconfig
arch/arm/Kconfig
+1
-1
arch/arm/mach-pxa/Kconfig
arch/arm/mach-pxa/Kconfig
+30
-2
arch/arm/mach-pxa/Makefile
arch/arm/mach-pxa/Makefile
+0
-1
arch/arm/mach-pxa/include/mach/trizeps4.h
arch/arm/mach-pxa/include/mach/trizeps4.h
+70
-14
arch/arm/mach-pxa/leds-trizeps4.c
arch/arm/mach-pxa/leds-trizeps4.c
+0
-134
arch/arm/mach-pxa/leds.c
arch/arm/mach-pxa/leds.c
+0
-2
arch/arm/mach-pxa/trizeps4.c
arch/arm/mach-pxa/trizeps4.c
+321
-228
drivers/pcmcia/Kconfig
drivers/pcmcia/Kconfig
+1
-1
drivers/pcmcia/Makefile
drivers/pcmcia/Makefile
+1
-0
drivers/pcmcia/pxa2xx_trizeps4.c
drivers/pcmcia/pxa2xx_trizeps4.c
+256
-0
No files found.
arch/arm/Kconfig
View file @
5ff7f78a
...
@@ -845,7 +845,7 @@ config LEDS
...
@@ -845,7 +845,7 @@ config LEDS
ARCH_LUBBOCK || MACH_MAINSTONE || ARCH_NETWINDER || \
ARCH_LUBBOCK || MACH_MAINSTONE || ARCH_NETWINDER || \
ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \
ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \
ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE || \
ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE || \
ARCH_AT91 ||
MACH_TRIZEPS4 ||
ARCH_DAVINCI || \
ARCH_AT91 || ARCH_DAVINCI || \
ARCH_KS8695 || MACH_RD88F5182
ARCH_KS8695 || MACH_RD88F5182
help
help
If you say Y here, the LEDs on your machine will be used
If you say Y here, the LEDs on your machine will be used
...
...
arch/arm/mach-pxa/Kconfig
View file @
5ff7f78a
...
@@ -174,13 +174,41 @@ config MACH_E800
...
@@ -174,13 +174,41 @@ config MACH_E800
Say Y here if you intend to run this kernel on a Toshiba
Say Y here if you intend to run this kernel on a Toshiba
e800 family PDA.
e800 family PDA.
config TRIZEPS_PXA
bool "PXA based Keith und Koep Trizeps DIMM-Modules"
config MACH_TRIZEPS4
config MACH_TRIZEPS4
bool "Keith und Koep Trizeps4 DIMM-Module"
bool "Keith und Koep Trizeps4 DIMM-Module"
depends on TRIZEPS_PXA
select TRIZEPS_PCMCIA
select PXA27x
config MACH_TRIZEPS4WL
bool "Keith und Koep Trizeps4-WL DIMM-Module"
depends on TRIZEPS_PXA
select TRIZEPS_PCMCIA
select PXA27x
select PXA27x
select PXA_SSP
config MACH_TRIZEPS4_CONXS
choice
prompt "Select base board for Trizeps module"
depends on TRIZEPS_PXA
config MACH_TRIZEPS_CONXS
bool "ConXS Eval Board"
bool "ConXS Eval Board"
depends on MACH_TRIZEPS4
config MACH_TRIZEPS_UCONXS
bool "uConXS Eval Board"
config MACH_TRIZEPS_ANY
bool "another Board"
endchoice
config TRIZEPS_PCMCIA
bool
help
Enable PCMCIA support for Trizeps modules
config MACH_EM_X270
config MACH_EM_X270
bool "CompuLab EM-x270 platform"
bool "CompuLab EM-x270 platform"
...
...
arch/arm/mach-pxa/Makefile
View file @
5ff7f78a
...
@@ -64,7 +64,6 @@ led-y := leds.o
...
@@ -64,7 +64,6 @@ led-y := leds.o
led-$(CONFIG_ARCH_LUBBOCK)
+=
leds-lubbock.o
led-$(CONFIG_ARCH_LUBBOCK)
+=
leds-lubbock.o
led-$(CONFIG_MACH_MAINSTONE)
+=
leds-mainstone.o
led-$(CONFIG_MACH_MAINSTONE)
+=
leds-mainstone.o
led-$(CONFIG_ARCH_PXA_IDP)
+=
leds-idp.o
led-$(CONFIG_ARCH_PXA_IDP)
+=
leds-idp.o
led-$(CONFIG_MACH_TRIZEPS4)
+=
leds-trizeps4.o
obj-$(CONFIG_LEDS)
+=
$
(
led-y
)
obj-$(CONFIG_LEDS)
+=
$
(
led-y
)
...
...
arch/arm/mach-pxa/include/mach/trizeps4.h
View file @
5ff7f78a
...
@@ -17,11 +17,16 @@
...
@@ -17,11 +17,16 @@
#define TRIZEPS4_PIC_PHYS (PXA_CS3_PHYS)
/* Logic chip on ConXS-Board */
#define TRIZEPS4_PIC_PHYS (PXA_CS3_PHYS)
/* Logic chip on ConXS-Board */
#define TRIZEPS4_SDRAM_BASE 0xa0000000
/* SDRAM region */
#define TRIZEPS4_SDRAM_BASE 0xa0000000
/* SDRAM region */
#define TRIZEPS4_CFSR_PHYS (PXA_CS3_PHYS)
/* Logic chip on ConXS-Board CSFR register */
/* Logic on ConXS-board CSFR register*/
#define TRIZEPS4_BOCR_PHYS (PXA_CS3_PHYS+0x02000000)
/* Logic chip on ConXS-Board BOCR register */
#define TRIZEPS4_CFSR_PHYS (PXA_CS3_PHYS)
#define TRIZEPS4_IRCR_PHYS (PXA_CS3_PHYS+0x02400000)
/* Logic chip on ConXS-Board IRCR register*/
/* Logic on ConXS-board BOCR register*/
#define TRIZEPS4_UPSR_PHYS (PXA_CS3_PHYS+0x02800000)
/* Logic chip on ConXS-Board UPSR register*/
#define TRIZEPS4_BOCR_PHYS (PXA_CS3_PHYS+0x02000000)
#define TRIZEPS4_DICR_PHYS (PXA_CS3_PHYS+0x03800000)
/* Logic chip on ConXS-Board DICR register*/
/* Logic on ConXS-board IRCR register*/
#define TRIZEPS4_IRCR_PHYS (PXA_CS3_PHYS+0x02400000)
/* Logic on ConXS-board UPSR register*/
#define TRIZEPS4_UPSR_PHYS (PXA_CS3_PHYS+0x02800000)
/* Logic on ConXS-board DICR register*/
#define TRIZEPS4_DICR_PHYS (PXA_CS3_PHYS+0x03800000)
/* virtual memory regions */
/* virtual memory regions */
#define TRIZEPS4_DISK_VIRT 0xF0000000
/* Disk On Chip region */
#define TRIZEPS4_DISK_VIRT 0xF0000000
/* Disk On Chip region */
...
@@ -54,6 +59,15 @@
...
@@ -54,6 +59,15 @@
#define GPIO_MMC_DET 12
#define GPIO_MMC_DET 12
#define TRIZEPS4_MMC_IRQ IRQ_GPIO(GPIO_MMC_DET)
#define TRIZEPS4_MMC_IRQ IRQ_GPIO(GPIO_MMC_DET)
/* DOC NAND chip */
#define GPIO_DOC_LOCK 94
#define GPIO_DOC_IRQ 93
#define TRIZEPS4_DOC_IRQ IRQ_GPIO(GPIO_DOC_IRQ)
/* SPI interface */
#define GPIO_SPI 53
#define TRIZEPS4_SPI_IRQ IRQ_GPIO(GPIO_SPI)
/* LEDS using tx2 / rx2 */
/* LEDS using tx2 / rx2 */
#define GPIO_SYS_BUSY_LED 46
#define GPIO_SYS_BUSY_LED 46
#define GPIO_HEARTBEAT_LED 47
#define GPIO_HEARTBEAT_LED 47
...
@@ -62,6 +76,8 @@
...
@@ -62,6 +76,8 @@
#define GPIO_PIC 0
#define GPIO_PIC 0
#define TRIZEPS4_PIC_IRQ IRQ_GPIO(GPIO_PIC)
#define TRIZEPS4_PIC_IRQ IRQ_GPIO(GPIO_PIC)
#ifdef CONFIG_MACH_TRIZEPS_CONXS
/* for CONXS base board define these registers */
#define CFSR_P2V(x) ((x) - TRIZEPS4_CFSR_PHYS + TRIZEPS4_CFSR_VIRT)
#define CFSR_P2V(x) ((x) - TRIZEPS4_CFSR_PHYS + TRIZEPS4_CFSR_VIRT)
#define CFSR_V2P(x) ((x) - TRIZEPS4_CFSR_VIRT + TRIZEPS4_CFSR_PHYS)
#define CFSR_V2P(x) ((x) - TRIZEPS4_CFSR_VIRT + TRIZEPS4_CFSR_PHYS)
...
@@ -71,15 +87,55 @@
...
@@ -71,15 +87,55 @@
#define DCR_P2V(x) ((x) - TRIZEPS4_DICR_PHYS + TRIZEPS4_DICR_VIRT)
#define DCR_P2V(x) ((x) - TRIZEPS4_DICR_PHYS + TRIZEPS4_DICR_VIRT)
#define DCR_V2P(x) ((x) - TRIZEPS4_DICR_VIRT + TRIZEPS4_DICR_PHYS)
#define DCR_V2P(x) ((x) - TRIZEPS4_DICR_VIRT + TRIZEPS4_DICR_PHYS)
#define IRCR_P2V(x) ((x) - TRIZEPS4_IRCR_PHYS + TRIZEPS4_IRCR_VIRT)
#define IRCR_V2P(x) ((x) - TRIZEPS4_IRCR_VIRT + TRIZEPS4_IRCR_PHYS)
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLY__
#define ConXS_CFSR (*((volatile unsigned short *)CFSR_P2V(0x0C000000)))
static
inline
unsigned
short
CFSR_readw
(
void
)
#define ConXS_BCR (*((volatile unsigned short *)BCR_P2V(0x0E000000)))
{
#define ConXS_DCR (*((volatile unsigned short *)DCR_P2V(0x0F800000)))
/* [Compact Flash Status Register] is read only */
return
*
((
unsigned
short
*
)
CFSR_P2V
(
0x0C000000
));
}
static
inline
void
BCR_writew
(
unsigned
short
value
)
{
/* [Board Control Regsiter] is write only */
*
((
unsigned
short
*
)
BCR_P2V
(
0x0E000000
))
=
value
;
}
static
inline
void
DCR_writew
(
unsigned
short
value
)
{
/* [Display Control Register] is write only */
*
((
unsigned
short
*
)
DCR_P2V
(
0x0E000000
))
=
value
;
}
static
inline
void
IRCR_writew
(
unsigned
short
value
)
{
/* [InfraRed data Control Register] is write only */
*
((
unsigned
short
*
)
IRCR_P2V
(
0x0E000000
))
=
value
;
}
#else
#else
#define ConXS_CFSR CFSR_P2V(0x0C000000)
#define ConXS_CFSR CFSR_P2V(0x0C000000)
#define ConXS_BCR BCR_P2V(0x0E000000)
#define ConXS_BCR BCR_P2V(0x0E000000)
#define ConXS_DCR DCR_P2V(0x0F800000)
#define ConXS_DCR DCR_P2V(0x0F800000)
#define ConXS_IRCR IRCR_P2V(0x0F800000)
#endif
#endif
#else
/* for whatever baseboard define function registers */
static
inline
unsigned
short
CFSR_readw
(
void
)
{
return
0
;
}
static
inline
void
BCR_writew
(
unsigned
short
value
)
{
;
}
static
inline
void
DCR_writew
(
unsigned
short
value
)
{
;
}
static
inline
void
IRCR_writew
(
unsigned
short
value
)
{
;
}
#endif
/* CONFIG_MACH_TRIZEPS_CONXS */
#define ConXS_CFSR_BVD_MASK 0x0003
#define ConXS_CFSR_BVD_MASK 0x0003
#define ConXS_CFSR_BVD1 (1 << 0)
#define ConXS_CFSR_BVD1 (1 << 0)
...
...
arch/arm/mach-pxa/leds-trizeps4.c
deleted
100644 → 0
View file @
35437b61
/*
* linux/arch/arm/mach-pxa/leds-trizeps4.c
*
* Author: Jürgen Schindele
* Created: 20 02, 2006
* Copyright: Jürgen Schindele
*
* 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.
*/
#include <linux/init.h>
#include <mach/hardware.h>
#include <asm/system.h>
#include <asm/types.h>
#include <asm/leds.h>
#include <mach/pxa-regs.h>
#include <mach/pxa2xx-gpio.h>
#include <mach/trizeps4.h>
#include "leds.h"
#define LED_STATE_ENABLED 1
#define LED_STATE_CLAIMED 2
#define SYS_BUSY 0x01
#define HEARTBEAT 0x02
#define BLINK 0x04
static
unsigned
int
led_state
;
static
unsigned
int
hw_led_state
;
void
trizeps4_leds_event
(
led_event_t
evt
)
{
unsigned
long
flags
;
local_irq_save
(
flags
);
switch
(
evt
)
{
case
led_start
:
hw_led_state
=
0
;
pxa_gpio_mode
(
GPIO_SYS_BUSY_LED
|
GPIO_OUT
);
/* LED1 */
pxa_gpio_mode
(
GPIO_HEARTBEAT_LED
|
GPIO_OUT
);
/* LED2 */
led_state
=
LED_STATE_ENABLED
;
break
;
case
led_stop
:
led_state
&=
~
LED_STATE_ENABLED
;
break
;
case
led_claim
:
led_state
|=
LED_STATE_CLAIMED
;
hw_led_state
=
0
;
break
;
case
led_release
:
led_state
&=
~
LED_STATE_CLAIMED
;
hw_led_state
=
0
;
break
;
#ifdef CONFIG_LEDS_TIMER
case
led_timer
:
hw_led_state
^=
HEARTBEAT
;
break
;
#endif
#ifdef CONFIG_LEDS_CPU
case
led_idle_start
:
hw_led_state
&=
~
SYS_BUSY
;
break
;
case
led_idle_end
:
hw_led_state
|=
SYS_BUSY
;
break
;
#endif
case
led_halted
:
break
;
case
led_green_on
:
hw_led_state
|=
BLINK
;
break
;
case
led_green_off
:
hw_led_state
&=
~
BLINK
;
break
;
case
led_amber_on
:
break
;
case
led_amber_off
:
break
;
case
led_red_on
:
break
;
case
led_red_off
:
break
;
default:
break
;
}
if
(
led_state
&
LED_STATE_ENABLED
)
{
switch
(
hw_led_state
)
{
case
0
:
GPSR
(
GPIO_SYS_BUSY_LED
)
|=
GPIO_bit
(
GPIO_SYS_BUSY_LED
);
GPSR
(
GPIO_HEARTBEAT_LED
)
|=
GPIO_bit
(
GPIO_HEARTBEAT_LED
);
break
;
case
1
:
GPCR
(
GPIO_SYS_BUSY_LED
)
|=
GPIO_bit
(
GPIO_SYS_BUSY_LED
);
GPSR
(
GPIO_HEARTBEAT_LED
)
|=
GPIO_bit
(
GPIO_HEARTBEAT_LED
);
break
;
case
2
:
GPSR
(
GPIO_SYS_BUSY_LED
)
|=
GPIO_bit
(
GPIO_SYS_BUSY_LED
);
GPCR
(
GPIO_HEARTBEAT_LED
)
|=
GPIO_bit
(
GPIO_HEARTBEAT_LED
);
break
;
case
3
:
GPCR
(
GPIO_SYS_BUSY_LED
)
|=
GPIO_bit
(
GPIO_SYS_BUSY_LED
);
GPCR
(
GPIO_HEARTBEAT_LED
)
|=
GPIO_bit
(
GPIO_HEARTBEAT_LED
);
break
;
}
}
else
{
/* turn all off */
GPSR
(
GPIO_SYS_BUSY_LED
)
|=
GPIO_bit
(
GPIO_SYS_BUSY_LED
);
GPSR
(
GPIO_HEARTBEAT_LED
)
|=
GPIO_bit
(
GPIO_HEARTBEAT_LED
);
}
local_irq_restore
(
flags
);
}
arch/arm/mach-pxa/leds.c
View file @
5ff7f78a
...
@@ -24,8 +24,6 @@ pxa_leds_init(void)
...
@@ -24,8 +24,6 @@ pxa_leds_init(void)
leds_event
=
mainstone_leds_event
;
leds_event
=
mainstone_leds_event
;
if
(
machine_is_pxa_idp
())
if
(
machine_is_pxa_idp
())
leds_event
=
idp_leds_event
;
leds_event
=
idp_leds_event
;
if
(
machine_is_trizeps4
())
leds_event
=
trizeps4_leds_event
;
leds_event
(
led_start
);
leds_event
(
led_start
);
return
0
;
return
0
;
...
...
arch/arm/mach-pxa/trizeps4.c
View file @
5ff7f78a
This diff is collapsed.
Click to expand it.
drivers/pcmcia/Kconfig
View file @
5ff7f78a
...
@@ -220,7 +220,7 @@ config PCMCIA_PXA2XX
...
@@ -220,7 +220,7 @@ 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)
|| MACH_ARMCORE || ARCH_PXA_PALM
|| TRIZEPS_PCMCIA
)
help
help
Say Y here to include support for the PXA2xx PCMCIA controller
Say Y here to include support for the PXA2xx PCMCIA controller
...
...
drivers/pcmcia/Makefile
View file @
5ff7f78a
...
@@ -72,5 +72,6 @@ pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK) += pxa2xx_lubbock.o sa1111_generic.o
...
@@ -72,5 +72,6 @@ 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_TRIZEPS_PCMCIA)
+=
pxa2xx_trizeps.o
pxa2xx_cs-$(CONFIG_MACH_PALMTX)
+=
pxa2xx_palmtx.o
pxa2xx_cs-$(CONFIG_MACH_PALMTX)
+=
pxa2xx_palmtx.o
drivers/pcmcia/pxa2xx_trizeps4.c
0 → 100644
View file @
5ff7f78a
/*
* linux/drivers/pcmcia/pxa2xx_trizeps4.c
*
* TRIZEPS PCMCIA specific routines.
*
* Author: Jürgen Schindele
* Created: 20 02, 2006
* Copyright: Jürgen Schindele
*
* 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.
*/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <asm/mach-types.h>
#include <asm/irq.h>
#include <mach/hardware.h>
#include <mach/pxa-regs.h>
#include <mach/trizeps4.h>
#include "soc_common.h"
extern
void
board_pcmcia_power
(
int
power
);
static
struct
pcmcia_irqs
irqs
[]
=
{
{
0
,
IRQ_GPIO
(
GPIO_PCD
),
"cs0_cd"
}
/* on other baseboards we can have more inputs */
};
static
int
trizeps_pcmcia_hw_init
(
struct
soc_pcmcia_socket
*
skt
)
{
int
ret
,
i
;
/* we dont have voltage/card/ready detection
* so we dont need interrupts for it
*/
switch
(
skt
->
nr
)
{
case
0
:
if
(
gpio_request
(
GPIO_PRDY
,
"cf_irq"
)
<
0
)
{
pr_err
(
"%s: sock %d unable to request gpio %d
\n
"
,
__func__
,
skt
->
nr
,
GPIO_PRDY
);
return
-
EBUSY
;
}
if
(
gpio_direction_input
(
GPIO_PRDY
)
<
0
)
{
pr_err
(
"%s: sock %d unable to set input gpio %d
\n
"
,
__func__
,
skt
->
nr
,
GPIO_PRDY
);
gpio_free
(
GPIO_PRDY
);
return
-
EINVAL
;
}
skt
->
irq
=
IRQ_GPIO
(
GPIO_PRDY
);
break
;
#ifndef CONFIG_MACH_TRIZEPS_CONXS
case
1
:
#endif
default:
break
;
}
/* release the reset of this card */
pr_debug
(
"%s: sock %d irq %d
\n
"
,
__func__
,
skt
->
nr
,
skt
->
irq
);
/* supplementory irqs for the socket */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
irqs
);
i
++
)
{
if
(
irqs
[
i
].
sock
!=
skt
->
nr
)
continue
;
if
(
gpio_request
(
IRQ_TO_GPIO
(
irqs
[
i
].
irq
),
irqs
[
i
].
str
)
<
0
)
{
pr_err
(
"%s: sock %d unable to request gpio %d
\n
"
,
__func__
,
skt
->
nr
,
IRQ_TO_GPIO
(
irqs
[
i
].
irq
));
ret
=
-
EBUSY
;
goto
error
;
}
if
(
gpio_direction_input
(
IRQ_TO_GPIO
(
irqs
[
i
].
irq
))
<
0
)
{
pr_err
(
"%s: sock %d unable to set input gpio %d
\n
"
,
__func__
,
skt
->
nr
,
IRQ_TO_GPIO
(
irqs
[
i
].
irq
));
ret
=
-
EINVAL
;
goto
error
;
}
}
return
soc_pcmcia_request_irqs
(
skt
,
irqs
,
ARRAY_SIZE
(
irqs
));
error:
for
(;
i
>=
0
;
i
--
)
{
gpio_free
(
IRQ_TO_GPIO
(
irqs
[
i
].
irq
));
}
return
(
ret
);
}
static
void
trizeps_pcmcia_hw_shutdown
(
struct
soc_pcmcia_socket
*
skt
)
{
int
i
;
/* free allocated gpio's */
gpio_free
(
GPIO_PRDY
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
irqs
);
i
++
)
gpio_free
(
IRQ_TO_GPIO
(
irqs
[
i
].
irq
));
}
static
unsigned
long
trizeps_pcmcia_status
[
2
];
static
void
trizeps_pcmcia_socket_state
(
struct
soc_pcmcia_socket
*
skt
,
struct
pcmcia_state
*
state
)
{
unsigned
short
status
=
0
,
change
;
status
=
CFSR_readw
();
change
=
(
status
^
trizeps_pcmcia_status
[
skt
->
nr
])
&
ConXS_CFSR_BVD_MASK
;
if
(
change
)
{
trizeps_pcmcia_status
[
skt
->
nr
]
=
status
;
if
(
status
&
ConXS_CFSR_BVD1
)
{
/* enable_irq empty */
}
else
{
/* disable_irq empty */
}
}
switch
(
skt
->
nr
)
{
case
0
:
/* just fill in fix states */
state
->
detect
=
gpio_get_value
(
GPIO_PCD
)
?
0
:
1
;
state
->
ready
=
gpio_get_value
(
GPIO_PRDY
)
?
1
:
0
;
state
->
bvd1
=
(
status
&
ConXS_CFSR_BVD1
)
?
1
:
0
;
state
->
bvd2
=
(
status
&
ConXS_CFSR_BVD2
)
?
1
:
0
;
state
->
vs_3v
=
(
status
&
ConXS_CFSR_VS1
)
?
0
:
1
;
state
->
vs_Xv
=
(
status
&
ConXS_CFSR_VS2
)
?
0
:
1
;
state
->
wrprot
=
0
;
/* not available */
break
;
#ifndef CONFIG_MACH_TRIZEPS_CONXS
/* on ConXS we only have one slot. Second is inactive */
case
1
:
state
->
detect
=
0
;
state
->
ready
=
0
;
state
->
bvd1
=
0
;
state
->
bvd2
=
0
;
state
->
vs_3v
=
0
;
state
->
vs_Xv
=
0
;
state
->
wrprot
=
0
;
break
;
#endif
}
}
static
int
trizeps_pcmcia_configure_socket
(
struct
soc_pcmcia_socket
*
skt
,
const
socket_state_t
*
state
)
{
int
ret
=
0
;
unsigned
short
power
=
0
;
/* we do nothing here just check a bit */
switch
(
state
->
Vcc
)
{
case
0
:
power
&=
0xfc
;
break
;
case
33
:
power
|=
ConXS_BCR_S0_VCC_3V3
;
break
;
case
50
:
pr_err
(
"%s(): Vcc 5V not supported in socket
\n
"
,
__func__
);
break
;
default:
pr_err
(
"%s(): bad Vcc %u
\n
"
,
__func__
,
state
->
Vcc
);
ret
=
-
1
;
}
switch
(
state
->
Vpp
)
{
case
0
:
power
&=
0xf3
;
break
;
case
33
:
power
|=
ConXS_BCR_S0_VPP_3V3
;
break
;
case
120
:
pr_err
(
"%s(): Vpp 12V not supported in socket
\n
"
,
__func__
);
break
;
default:
if
(
state
->
Vpp
!=
state
->
Vcc
)
{
pr_err
(
"%s(): bad Vpp %u
\n
"
,
__func__
,
state
->
Vpp
);
ret
=
-
1
;
}
}
switch
(
skt
->
nr
)
{
case
0
:
/* we only have 3.3V */
board_pcmcia_power
(
power
);
break
;
#ifndef CONFIG_MACH_TRIZEPS_CONXS
/* on ConXS we only have one slot. Second is inactive */
case
1
:
#endif
default:
break
;
}
return
ret
;
}
static
void
trizeps_pcmcia_socket_init
(
struct
soc_pcmcia_socket
*
skt
)
{
/* default is on */
board_pcmcia_power
(
0x9
);
}
static
void
trizeps_pcmcia_socket_suspend
(
struct
soc_pcmcia_socket
*
skt
)
{
board_pcmcia_power
(
0x0
);
}
static
struct
pcmcia_low_level
trizeps_pcmcia_ops
=
{
.
owner
=
THIS_MODULE
,
.
hw_init
=
trizeps_pcmcia_hw_init
,
.
hw_shutdown
=
trizeps_pcmcia_hw_shutdown
,
.
socket_state
=
trizeps_pcmcia_socket_state
,
.
configure_socket
=
trizeps_pcmcia_configure_socket
,
.
socket_init
=
trizeps_pcmcia_socket_init
,
.
socket_suspend
=
trizeps_pcmcia_socket_suspend
,
#ifdef CONFIG_MACH_TRIZEPS_CONXS
.
nr
=
1
,
#else
.
nr
=
2
,
#endif
.
first
=
0
,
};
static
struct
platform_device
*
trizeps_pcmcia_device
;
static
int
__init
trizeps_pcmcia_init
(
void
)
{
int
ret
;
trizeps_pcmcia_device
=
platform_device_alloc
(
"pxa2xx-pcmcia"
,
-
1
);
if
(
!
trizeps_pcmcia_device
)
return
-
ENOMEM
;
ret
=
platform_device_add_data
(
trizeps_pcmcia_device
,
&
trizeps_pcmcia_ops
,
sizeof
(
trizeps_pcmcia_ops
));
if
(
ret
==
0
)
ret
=
platform_device_add
(
trizeps_pcmcia_device
);
if
(
ret
)
platform_device_put
(
trizeps_pcmcia_device
);
return
ret
;
}
static
void
__exit
trizeps_pcmcia_exit
(
void
)
{
platform_device_unregister
(
trizeps_pcmcia_device
);
}
fs_initcall
(
trizeps_pcmcia_init
);
module_exit
(
trizeps_pcmcia_exit
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Juergen Schindele"
);
MODULE_ALIAS
(
"platform:pxa2xx-pcmcia"
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment