Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
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
Hide 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
ARCH_LUBBOCK || MACH_MAINSTONE || ARCH_NETWINDER || \
ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \
ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE || \
ARCH_AT91 ||
MACH_TRIZEPS4 ||
ARCH_DAVINCI || \
ARCH_AT91 || ARCH_DAVINCI || \
ARCH_KS8695 || MACH_RD88F5182
help
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
Say Y here if you intend to run this kernel on a Toshiba
e800 family PDA.
config TRIZEPS_PXA
bool "PXA based Keith und Koep Trizeps DIMM-Modules"
config MACH_TRIZEPS4
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 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"
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
bool "CompuLab EM-x270 platform"
...
...
arch/arm/mach-pxa/Makefile
View file @
5ff7f78a
...
...
@@ -64,7 +64,6 @@ led-y := leds.o
led-$(CONFIG_ARCH_LUBBOCK)
+=
leds-lubbock.o
led-$(CONFIG_MACH_MAINSTONE)
+=
leds-mainstone.o
led-$(CONFIG_ARCH_PXA_IDP)
+=
leds-idp.o
led-$(CONFIG_MACH_TRIZEPS4)
+=
leds-trizeps4.o
obj-$(CONFIG_LEDS)
+=
$
(
led-y
)
...
...
arch/arm/mach-pxa/include/mach/trizeps4.h
View file @
5ff7f78a
...
...
@@ -17,11 +17,16 @@
#define TRIZEPS4_PIC_PHYS (PXA_CS3_PHYS)
/* Logic chip on ConXS-Board */
#define TRIZEPS4_SDRAM_BASE 0xa0000000
/* SDRAM region */
#define TRIZEPS4_CFSR_PHYS (PXA_CS3_PHYS)
/* Logic chip on ConXS-Board CSFR register */
#define TRIZEPS4_BOCR_PHYS (PXA_CS3_PHYS+0x02000000)
/* Logic chip on ConXS-Board BOCR register */
#define TRIZEPS4_IRCR_PHYS (PXA_CS3_PHYS+0x02400000)
/* Logic chip on ConXS-Board IRCR register*/
#define TRIZEPS4_UPSR_PHYS (PXA_CS3_PHYS+0x02800000)
/* Logic chip on ConXS-Board UPSR register*/
#define TRIZEPS4_DICR_PHYS (PXA_CS3_PHYS+0x03800000)
/* Logic chip on ConXS-Board DICR register*/
/* Logic on ConXS-board CSFR register*/
#define TRIZEPS4_CFSR_PHYS (PXA_CS3_PHYS)
/* Logic on ConXS-board BOCR register*/
#define TRIZEPS4_BOCR_PHYS (PXA_CS3_PHYS+0x02000000)
/* 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 */
#define TRIZEPS4_DISK_VIRT 0xF0000000
/* Disk On Chip region */
...
...
@@ -54,6 +59,15 @@
#define GPIO_MMC_DET 12
#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 */
#define GPIO_SYS_BUSY_LED 46
#define GPIO_HEARTBEAT_LED 47
...
...
@@ -62,24 +76,66 @@
#define GPIO_PIC 0
#define TRIZEPS4_PIC_IRQ IRQ_GPIO(GPIO_PIC)
#define CFSR_P2V(x) ((x) - TRIZEPS4_CFSR_PHYS + TRIZEPS4_CFSR_VIRT)
#define CFSR_V2P(x) ((x) - TRIZEPS4_CFSR_VIRT + TRIZEPS4_CFSR_PHYS)
#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_V2P(x) ((x) - TRIZEPS4_CFSR_VIRT + TRIZEPS4_CFSR_PHYS)
#define BCR_P2V(x)
((x) - TRIZEPS4_BOCR_PHYS + TRIZEPS4_BOCR_VIRT)
#define BCR_V2P(x)
((x) - TRIZEPS4_BOCR_VIRT + TRIZEPS4_BOCR_PHYS)
#define BCR_P2V(x) ((x) - TRIZEPS4_BOCR_PHYS + TRIZEPS4_BOCR_VIRT)
#define BCR_V2P(x) ((x) - TRIZEPS4_BOCR_VIRT + TRIZEPS4_BOCR_PHYS)
#define DCR_P2V(x) ((x) - TRIZEPS4_DICR_PHYS + TRIZEPS4_DICR_VIRT)
#define DCR_V2P(x) ((x) - TRIZEPS4_DICR_VIRT + TRIZEPS4_DICR_PHYS)
#define DCR_P2V(x) ((x) - TRIZEPS4_DICR_PHYS + TRIZEPS4_DICR_VIRT)
#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__
#define ConXS_CFSR (*((volatile unsigned short *)CFSR_P2V(0x0C000000)))
#define ConXS_BCR (*((volatile unsigned short *)BCR_P2V(0x0E000000)))
#define ConXS_DCR (*((volatile unsigned short *)DCR_P2V(0x0F800000)))
static
inline
unsigned
short
CFSR_readw
(
void
)
{
/* [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
#define ConXS_CFSR CFSR_P2V(0x0C000000)
#define ConXS_BCR BCR_P2V(0x0E000000)
#define ConXS_DCR DCR_P2V(0x0F800000)
#define ConXS_IRCR IRCR_P2V(0x0F800000)
#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_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)
leds_event
=
mainstone_leds_event
;
if
(
machine_is_pxa_idp
())
leds_event
=
idp_leds_event
;
if
(
machine_is_trizeps4
())
leds_event
=
trizeps4_leds_event
;
leds_event
(
led_start
);
return
0
;
...
...
arch/arm/mach-pxa/trizeps4.c
View file @
5ff7f78a
...
...
@@ -22,8 +22,8 @@
#include <linux/fb.h>
#include <linux/ioport.h>
#include <linux/delay.h>
#include <linux/
serial_8250
.h>
#include <linux/
mtd/mtd
.h>
#include <linux/
gpio
.h>
#include <linux/
dm9000
.h>
#include <linux/mtd/physmap.h>
#include <linux/mtd/partitions.h>
...
...
@@ -31,7 +31,6 @@
#include <asm/setup.h>
#include <asm/memory.h>
#include <asm/mach-types.h>
#include <mach/hardware.h>
#include <asm/irq.h>
#include <asm/sizes.h>
...
...
@@ -40,41 +39,148 @@
#include <asm/mach/irq.h>
#include <asm/mach/flash.h>
#include <mach/hardware.h>
#include <mach/pxa-regs.h>
#include <mach/pxa2xx-regs.h>
#include <mach/pxa2xx-gpio.h>
#include <mach/mfp-pxa27x.h>
#include <mach/pxa2xx_spi.h>
#include <mach/trizeps4.h>
#include <mach/audio.h>
#include <mach/pxafb.h>
#include <mach/mmc.h>
#include <mach/irda.h>
#include <mach/ohci.h>
#include <mach/i2c.h>
#include "generic.h"
#include "devices.h"
/********************************************************************************************
/* comment out the following line if you want to use the
* Standard UART from PXA for serial / irda transmission
* and acivate it if you have status leds connected */
#define STATUS_LEDS_ON_STUART_PINS 1
/*****************************************************************************
* MultiFunctionPins of CPU
*****************************************************************************/
static
unsigned
long
trizeps4_pin_config
[]
__initdata
=
{
/* Chip Selects */
GPIO15_nCS_1
,
/* DiskOnChip CS */
GPIO93_GPIO
,
/* TRIZEPS4_DOC_IRQ */
GPIO94_GPIO
,
/* DOC lock */
GPIO78_nCS_2
,
/* DM9000 CS */
GPIO101_GPIO
,
/* TRIZEPS4_ETH_IRQ */
GPIO79_nCS_3
,
/* Logic CS */
GPIO0_GPIO
|
WAKEUP_ON_EDGE_RISE
,
/* Logic irq */
/* LCD - 16bpp Active TFT */
GPIO58_LCD_LDD_0
,
GPIO59_LCD_LDD_1
,
GPIO60_LCD_LDD_2
,
GPIO61_LCD_LDD_3
,
GPIO62_LCD_LDD_4
,
GPIO63_LCD_LDD_5
,
GPIO64_LCD_LDD_6
,
GPIO65_LCD_LDD_7
,
GPIO66_LCD_LDD_8
,
GPIO67_LCD_LDD_9
,
GPIO68_LCD_LDD_10
,
GPIO69_LCD_LDD_11
,
GPIO70_LCD_LDD_12
,
GPIO71_LCD_LDD_13
,
GPIO72_LCD_LDD_14
,
GPIO73_LCD_LDD_15
,
GPIO74_LCD_FCLK
,
GPIO75_LCD_LCLK
,
GPIO76_LCD_PCLK
,
GPIO77_LCD_BIAS
,
/* UART */
GPIO9_FFUART_CTS
,
GPIO10_FFUART_DCD
,
GPIO16_FFUART_TXD
,
GPIO33_FFUART_DSR
,
GPIO38_FFUART_RI
,
GPIO82_FFUART_DTR
,
GPIO83_FFUART_RTS
,
GPIO96_FFUART_RXD
,
GPIO42_BTUART_RXD
,
GPIO43_BTUART_TXD
,
GPIO44_BTUART_CTS
,
GPIO45_BTUART_RTS
,
#ifdef STATUS_LEDS_ON_STUART_PINS
GPIO46_GPIO
,
GPIO47_GPIO
,
#else
GPIO46_STUART_RXD
,
GPIO47_STUART_TXD
,
#endif
/* PCMCIA */
GPIO11_GPIO
,
/* TRIZEPS4_CD_IRQ */
GPIO13_GPIO
,
/* TRIZEPS4_READY_NINT */
GPIO48_nPOE
,
GPIO49_nPWE
,
GPIO50_nPIOR
,
GPIO51_nPIOW
,
GPIO54_nPCE_2
,
GPIO55_nPREG
,
GPIO56_nPWAIT
,
GPIO57_nIOIS16
,
GPIO102_nPCE_1
,
GPIO104_PSKTSEL
,
/* MultiMediaCard */
GPIO32_MMC_CLK
,
GPIO92_MMC_DAT_0
,
GPIO109_MMC_DAT_1
,
GPIO110_MMC_DAT_2
,
GPIO111_MMC_DAT_3
,
GPIO112_MMC_CMD
,
GPIO12_GPIO
,
/* TRIZEPS4_MMC_IRQ */
/* USB OHCI */
GPIO88_USBH1_PWR
,
/* USBHPWR1 */
GPIO89_USBH1_PEN
,
/* USBHPEN1 */
/* I2C */
GPIO117_I2C_SCL
,
GPIO118_I2C_SDA
,
};
static
unsigned
long
trizeps4wl_pin_config
[]
__initdata
=
{
/* SSP 2 */
GPIO14_SSP2_SFRM
,
GPIO19_SSP2_SCLK
,
GPIO53_GPIO
,
/* TRIZEPS4_SPI_IRQ */
GPIO86_SSP2_RXD
,
GPIO87_SSP2_TXD
,
};
/****************************************************************************
* ONBOARD FLASH
****************************************************************************
****************
/
****************************************************************************/
static
struct
mtd_partition
trizeps4_partitions
[]
=
{
{
.
name
=
"Bootloader"
,
.
offset
=
0x00000000
,
.
size
=
0x00040000
,
.
mask_flags
=
MTD_WRITEABLE
/* force read-only */
},{
},
{
.
name
=
"Backup"
,
.
offset
=
0x00040000
,
.
size
=
0x00040000
,
},{
},
{
.
name
=
"Image"
,
.
offset
=
0x00080000
,
.
size
=
0x01080000
,
},{
},
{
.
name
=
"IPSM"
,
.
offset
=
0x01100000
,
.
size
=
0x00e00000
,
},{
},
{
.
name
=
"Registry"
,
.
offset
=
0x01f00000
,
.
size
=
MTDPART_SIZ_FULL
,
...
...
@@ -105,9 +211,9 @@ static struct platform_device flash_device = {
.
num_resources
=
1
,
};
/****************************************************************************
****************
/****************************************************************************
* DAVICOM DM9000 Ethernet
****************************************************************************
****************
/
****************************************************************************/
static
struct
resource
dm9000_resources
[]
=
{
[
0
]
=
{
.
start
=
TRIZEPS4_ETH_PHYS
+
0x300
,
...
...
@@ -122,67 +228,68 @@ static struct resource dm9000_resources[] = {
[
2
]
=
{
.
start
=
TRIZEPS4_ETH_IRQ
,
.
end
=
TRIZEPS4_ETH_IRQ
,
.
flags
=
(
IORESOURCE_IRQ
|
IRQ_TYPE_EDGE_RISING
)
,
.
flags
=
IORESOURCE_IRQ
|
IORESOURCE_IRQ_HIGHEDGE
,
},
};
static
struct
dm9000_plat_data
tri_dm9000_platdata
=
{
.
flags
=
DM9000_PLATF_32BITONLY
,
};
static
struct
platform_device
dm9000_device
=
{
.
name
=
"dm9000"
,
.
id
=
-
1
,
.
num_resources
=
ARRAY_SIZE
(
dm9000_resources
),
.
resource
=
dm9000_resources
,
.
dev
=
{
.
platform_data
=
&
tri_dm9000_platdata
,
}
};
/********************************************************************************************
* PXA270 serial ports
********************************************************************************************/
static
struct
plat_serial8250_port
tri_serial_ports
[]
=
{
#ifdef CONFIG_SERIAL_PXA
/* this uses the own PXA driver */
/****************************************************************************
* LED's on GPIO pins of PXA
****************************************************************************/
static
struct
gpio_led
trizeps4_led
[]
=
{
#ifdef STATUS_LEDS_ON_STUART_PINS
{
0
,
},
#else
/* this uses the generic 8520 driver */
[
0
]
=
{
.
membase
=
(
void
*
)
&
FFUART
,
.
irq
=
IRQ_FFUART
,
.
flags
=
UPF_BOOT_AUTOCONF
,
.
iotype
=
UPIO_MEM32
,
.
regshift
=
2
,
.
uartclk
=
(
921600
*
16
),
},
[
1
]
=
{
.
membase
=
(
void
*
)
&
BTUART
,
.
irq
=
IRQ_BTUART
,
.
flags
=
UPF_BOOT_AUTOCONF
,
.
iotype
=
UPIO_MEM32
,
.
regshift
=
2
,
.
uartclk
=
(
921600
*
16
),
.
name
=
"led0:orange:heartbeat"
,
/* */
.
default_trigger
=
"heartbeat"
,
.
gpio
=
GPIO_HEARTBEAT_LED
,
.
active_low
=
1
,
},
{
0
,
.
name
=
"led1:yellow:cpubusy"
,
/* */
.
default_trigger
=
"cpu-busy"
,
.
gpio
=
GPIO_SYS_BUSY_LED
,
.
active_low
=
1
,
},
#endif
};
static
struct
platform_device
uart_devices
=
{
.
name
=
"serial8250"
,
.
id
=
0
,
static
struct
gpio_led_platform_data
trizeps4_led_data
=
{
.
leds
=
trizeps4_led
,
.
num_leds
=
ARRAY_SIZE
(
trizeps4_led
),
};
static
struct
platform_device
leds_devices
=
{
.
name
=
"leds-gpio"
,
.
id
=
-
1
,
.
dev
=
{
.
platform_data
=
tri_serial_ports
,
.
platform_data
=
&
trizeps4_led_data
,
},
.
num_resources
=
0
,
.
resource
=
NULL
,
};
static
struct
platform_device
*
trizeps4_devices
[]
__initdata
=
{
static
struct
platform_device
*
trizeps4_devices
[]
__initdata
=
{
&
flash_device
,
&
uart_devices
,
&
dm9000_device
,
&
leds_devices
,
};
static
struct
platform_device
*
trizeps4wl_devices
[]
__initdata
=
{
&
flash_device
,
&
leds_devices
,
};
#ifdef CONFIG_MACH_TRIZEPS4_CONXS
static
short
trizeps_conxs_bcr
;
/* PCCARD power switching supports only 3,3V */
...
...
@@ -192,108 +299,63 @@ void board_pcmcia_power(int power)
/* switch power on, put in reset and enable buffers */
trizeps_conxs_bcr
|=
power
;
trizeps_conxs_bcr
|=
ConXS_BCR_CF_RESET
;
trizeps_conxs_bcr
&=
~
(
ConXS_BCR_CF_BUF_EN
)
;
ConXS_BCR
=
trizeps_conxs_bcr
;
trizeps_conxs_bcr
&=
~
ConXS_BCR_CF_BUF_EN
;
BCR_writew
(
trizeps_conxs_bcr
)
;
/* wait a little */
udelay
(
2000
);
/* take reset away */
trizeps_conxs_bcr
&=
~
(
ConXS_BCR_CF_RESET
)
;
ConXS_BCR
=
trizeps_conxs_bcr
;
trizeps_conxs_bcr
&=
~
ConXS_BCR_CF_RESET
;
BCR_writew
(
trizeps_conxs_bcr
)
;
udelay
(
2000
);
}
else
{
/* put in reset */
trizeps_conxs_bcr
|=
ConXS_BCR_CF_RESET
;
ConXS_BCR
=
trizeps_conxs_bcr
;
BCR_writew
(
trizeps_conxs_bcr
)
;
udelay
(
1000
);
/* switch power off */
trizeps_conxs_bcr
&=
~
(
0xf
);
ConXS_BCR
=
trizeps_conxs_bcr
;
trizeps_conxs_bcr
&=
~
0xf
;
BCR_writew
(
trizeps_conxs_bcr
);
}
pr_debug
(
"%s: o%s 0x%x
\n
"
,
__func__
,
power
?
"n"
:
"ff"
,
trizeps_conxs_bcr
);
pr_debug
(
"%s: o%s 0x%x
\n
"
,
__func__
,
power
?
"n"
:
"ff"
,
trizeps_conxs_bcr
);
}
EXPORT_SYMBOL
(
board_pcmcia_power
);
/* backlight power switching for LCD panel */
static
void
board_backlight_power
(
int
on
)
{
if
(
on
)
{
if
(
on
)
trizeps_conxs_bcr
|=
ConXS_BCR_L_DISP
;
}
else
{
else
trizeps_conxs_bcr
&=
~
ConXS_BCR_L_DISP
;
}
pr_debug
(
"%s: o%s 0x%x
\n
"
,
__func__
,
on
?
"n"
:
"ff"
,
trizeps_conxs_bcr
);
ConXS_BCR
=
trizeps_conxs_bcr
;
}
/* Powersupply for MMC/SD cardslot */
static
void
board_mci_power
(
struct
device
*
dev
,
unsigned
int
vdd
)
{
struct
pxamci_platform_data
*
p_d
=
dev
->
platform_data
;
if
((
1
<<
vdd
)
&
p_d
->
ocr_mask
)
{
pr_debug
(
"%s: on
\n
"
,
__func__
);
/* FIXME fill in values here */
}
else
{
pr_debug
(
"%s: off
\n
"
,
__func__
);
/* FIXME fill in values here */
}
pr_debug
(
"%s: o%s 0x%x
\n
"
,
__func__
,
on
?
"n"
:
"ff"
,
trizeps_conxs_bcr
);
BCR_writew
(
trizeps_conxs_bcr
);
}
static
short
trizeps_conxs_ircr
;
/* Switch modes and Power for IRDA receiver */
static
void
board_irda_mode
(
struct
device
*
dev
,
int
mode
)
{
unsigned
long
flags
;
local_irq_save
(
flags
);
if
(
mode
&
IR_SIRMODE
)
{
/* Slow mode */
trizeps_conxs_ircr
&=
~
ConXS_IRCR_MODE
;
}
else
if
(
mode
&
IR_FIRMODE
)
{
/* Fast mode */
trizeps_conxs_ircr
|=
ConXS_IRCR_MODE
;
}
pxa2xx_transceiver_mode
(
dev
,
mode
);
if
(
mode
&
IR_OFF
)
{
trizeps_conxs_ircr
|=
ConXS_IRCR_SD
;
}
else
{
trizeps_conxs_ircr
&=
~
ConXS_IRCR_SD
;
}
/* FIXME write values to register */
local_irq_restore
(
flags
);
}
#else
/* for other baseboards define dummies */
void
board_pcmcia_power
(
int
power
)
{;}
#define board_backlight_power NULL
#define board_mci_power NULL
#define board_irda_mode NULL
#endif
/* CONFIG_MACH_TRIZEPS4_CONXS */
EXPORT_SYMBOL
(
board_pcmcia_power
);
/* a I2C based RTC is known on CONXS board */
static
struct
i2c_board_info
trizeps4_i2c_devices
[]
__initdata
=
{
{
I2C_BOARD_INFO
(
"rtc-pcf8593"
,
0x51
)
}
};
static
int
trizeps4_mci_init
(
struct
device
*
dev
,
irq_handler_t
mci_detect_int
,
void
*
data
)
/****************************************************************************
* MMC card slot external to module
****************************************************************************/
static
int
trizeps4_mci_init
(
struct
device
*
dev
,
irq_handler_t
mci_detect_int
,
void
*
data
)
{
int
err
;
/* setup GPIO for PXA27x MMC controller */
pxa_gpio_mode
(
GPIO32_MMCCLK_MD
);
pxa_gpio_mode
(
GPIO112_MMCCMD_MD
);
pxa_gpio_mode
(
GPIO92_MMCDAT0_MD
);
pxa_gpio_mode
(
GPIO109_MMCDAT1_MD
);
pxa_gpio_mode
(
GPIO110_MMCDAT2_MD
);
pxa_gpio_mode
(
GPIO111_MMCDAT3_MD
);
pxa_gpio_mode
(
GPIO_MMC_DET
|
GPIO_IN
);
err
=
request_irq
(
TRIZEPS4_MMC_IRQ
,
mci_detect_int
,
IRQF_DISABLED
|
IRQF_TRIGGER_RISING
,
"MMC card detect"
,
data
);
if
(
err
)
printk
(
KERN_ERR
"trizeps4_mci_init: MMC/SD: can't request MMC card detect IRQ
\n
"
);
return
err
;
IRQF_DISABLED
|
IRQF_TRIGGER_RISING
|
IRQF_SAMPLE_RANDOM
,
"MMC card detect"
,
data
);
if
(
err
)
{
printk
(
KERN_ERR
"trizeps4_mci_init: MMC/SD: can't request"
"MMC card detect IRQ
\n
"
);
return
-
1
;
}
return
0
;
}
static
void
trizeps4_mci_exit
(
struct
device
*
dev
,
void
*
data
)
...
...
@@ -303,22 +365,68 @@ static void trizeps4_mci_exit(struct device *dev, void *data)
static
struct
pxamci_platform_data
trizeps4_mci_platform_data
=
{
.
ocr_mask
=
MMC_VDD_32_33
|
MMC_VDD_33_34
,
.
detect_delay
=
1
,
.
init
=
trizeps4_mci_init
,
.
exit
=
trizeps4_mci_exit
,
.
setpower
=
board_mci_power
,
.
get_ro
=
NULL
,
/* write-protection not supported */
.
setpower
=
NULL
,
/* power-switching not supported */
};
/****************************************************************************
* IRDA mode switching on stuart
****************************************************************************/
#ifndef STATUS_LEDS_ON_STUART_PINS
static
short
trizeps_conxs_ircr
;
static
int
trizeps4_irda_startup
(
struct
device
*
dev
)
{
trizeps_conxs_ircr
&=
~
ConXS_IRCR_SD
;
IRCR_writew
(
trizeps_conxs_ircr
);
return
0
;
}
static
void
trizeps4_irda_shutdown
(
struct
device
*
dev
)
{
trizeps_conxs_ircr
|=
ConXS_IRCR_SD
;
IRCR_writew
(
trizeps_conxs_ircr
);
}
static
void
trizeps4_irda_transceiver_mode
(
struct
device
*
dev
,
int
mode
)
{
unsigned
long
flags
;
local_irq_save
(
flags
);
/* Switch mode */
if
(
mode
&
IR_SIRMODE
)
trizeps_conxs_ircr
&=
~
ConXS_IRCR_MODE
;
/* Slow mode */
else
if
(
mode
&
IR_FIRMODE
)
{
trizeps_conxs_ircr
|=
ConXS_IRCR_MODE
;
/* Fast mode */
/* Switch power */
if
(
mode
&
IR_OFF
)
trizeps_conxs_ircr
|=
ConXS_IRCR_SD
;
else
trizeps_conxs_ircr
&=
~
ConXS_IRCR_SD
;
IRCR_writew
(
trizeps_conxs_ircr
);
local_irq_restore
(
flags
);
pxa2xx_transceiver_mode
(
dev
,
mode
);
}
static
struct
pxaficp_platform_data
trizeps4_ficp_platform_data
=
{
.
transceiver_cap
=
IR_SIRMODE
|
IR_FIRMODE
|
IR_OFF
,
.
transceiver_mode
=
board_irda_mode
,
.
transceiver_cap
=
IR_SIRMODE
|
IR_FIRMODE
|
IR_OFF
,
.
transceiver_mode
=
trizeps4_irda_transceiver_mode
,
.
startup
=
trizeps4_irda_startup
,
.
shutdown
=
trizeps4_irda_shutdown
,
};
#endif
/****************************************************************************
* OHCI USB port
****************************************************************************/
static
int
trizeps4_ohci_init
(
struct
device
*
dev
)
{
/* setup Port1 GPIO pin. */
pxa_gpio_mode
(
88
|
GPIO_ALT_FN_1_IN
);
/* USBHPWR1 */
pxa_gpio_mode
(
89
|
GPIO_ALT_FN_2_OUT
);
/* USBHPEN1 */
/* Set the Power Control Polarity Low and Power Sense
Polarity Low to active low. */
UHCHR
=
(
UHCHR
|
UHCHR_PCPL
|
UHCHR_PSPL
)
&
...
...
@@ -327,15 +435,9 @@ static int trizeps4_ohci_init(struct device *dev)
return
0
;
}
static
void
trizeps4_ohci_exit
(
struct
device
*
dev
)
{
;
}
static
struct
pxaohci_platform_data
trizeps4_ohci_platform_data
=
{
.
port_mode
=
PMM_PERPORT_MODE
,
.
init
=
trizeps4_ohci_init
,
.
exit
=
trizeps4_ohci_exit
,
};
static
struct
map_desc
trizeps4_io_desc
[]
__initdata
=
{
...
...
@@ -372,105 +474,80 @@ static struct map_desc trizeps4_io_desc[] __initdata = {
};
static
struct
pxafb_mode_info
sharp_lcd_mode
=
{
.
pixclock
=
78000
,
.
xres
=
640
,
.
yres
=
480
,
.
bpp
=
8
,
.
hsync_len
=
4
,
.
left_margin
=
4
,
.
right_margin
=
4
,
.
vsync_len
=
2
,
.
upper_margin
=
0
,
.
lower_margin
=
0
,
.
sync
=
FB_SYNC_HOR_HIGH_ACT
|
FB_SYNC_VERT_HIGH_ACT
,
.
cmap_greyscale
=
0
,
.
pixclock
=
78000
,
.
xres
=
640
,
.
yres
=
480
,
.
bpp
=
8
,
.
hsync_len
=
4
,
.
left_margin
=
4
,
.
right_margin
=
4
,
.
vsync_len
=
2
,
.
upper_margin
=
0
,
.
lower_margin
=
0
,
.
sync
=
FB_SYNC_HOR_HIGH_ACT
|
FB_SYNC_VERT_HIGH_ACT
,
.
cmap_greyscale
=
0
,
};
static
struct
pxafb_mach_info
sharp_lcd
=
{
.
modes
=
&
sharp_lcd_mode
,
.
num_modes
=
1
,
.
cmap_inverse
=
0
,
.
cmap_static
=
0
,
.
lccr0
=
LCCR0_Color
|
LCCR0_Pas
|
LCCR0_Dual
,
.
lccr3
=
0x0340ff02
,
.
pxafb_backlight_power
=
board_backlight_power
,
.
modes
=
&
sharp_lcd_mode
,
.
num_modes
=
1
,
.
lcd_conn
=
LCD_COLOR_DSTN_16BPP
|
LCD_PCLK_EDGE_FALL
,
.
cmap_inverse
=
0
,
.
cmap_static
=
0
,
.
pxafb_backlight_power
=
board_backlight_power
,
};
static
struct
pxafb_mode_info
toshiba_lcd_mode
=
{
.
pixclock
=
39720
,
.
xres
=
640
,
.
yres
=
480
,
.
bpp
=
8
,
.
hsync_len
=
63
,
.
left_margin
=
12
,
.
right_margin
=
12
,
.
vsync_len
=
4
,
.
upper_margin
=
32
,
.
lower_margin
=
10
,
.
sync
=
0
,
.
cmap_greyscale
=
0
,
.
pixclock
=
39720
,
.
xres
=
640
,
.
yres
=
480
,
.
bpp
=
8
,
.
hsync_len
=
63
,
.
left_margin
=
12
,
.
right_margin
=
12
,
.
vsync_len
=
4
,
.
upper_margin
=
32
,
.
lower_margin
=
10
,
.
sync
=
0
,
.
cmap_greyscale
=
0
,
};
static
struct
pxafb_mach_info
toshiba_lcd
=
{
.
modes
=
&
toshiba_lcd_mode
,
.
num_modes
=
1
,
.
cmap_inverse
=
0
,
.
cmap_static
=
0
,
.
lccr0
=
LCCR0_Color
|
LCCR0_Act
,
.
lccr3
=
0x03400002
,
.
pxafb_backlight_power
=
board_backlight_power
,
.
modes
=
&
toshiba_lcd_mode
,
.
num_modes
=
1
,
.
lcd_conn
=
(
LCD_COLOR_TFT_16BPP
|
LCD_PCLK_EDGE_FALL
),
.
cmap_inverse
=
0
,
.
cmap_static
=
0
,
.
pxafb_backlight_power
=
board_backlight_power
,
};
static
void
__init
trizeps4_init
(
void
)
{
platform_add_devices
(
trizeps4_devices
,
ARRAY_SIZE
(
trizeps4_devices
));
pxa2xx_mfp_config
(
ARRAY_AND_SIZE
(
trizeps4_pin_config
));
if
(
machine_is_trizeps4wl
())
{
pxa2xx_mfp_config
(
ARRAY_AND_SIZE
(
trizeps4wl_pin_config
));
platform_add_devices
(
trizeps4wl_devices
,
ARRAY_SIZE
(
trizeps4wl_devices
));
}
else
{
platform_add_devices
(
trizeps4_devices
,
ARRAY_SIZE
(
trizeps4_devices
));
}
/* set_pxa_fb_info(&sharp_lcd); */
set_pxa_fb_info
(
&
toshiba_lcd
);
if
(
0
)
/* dont know how to determine LCD */
set_pxa_fb_info
(
&
sharp_lcd
);
else
set_pxa_fb_info
(
&
toshiba_lcd
);
pxa_set_mci_info
(
&
trizeps4_mci_platform_data
);
#ifndef STATUS_LEDS_ON_STUART_PINS
pxa_set_ficp_info
(
&
trizeps4_ficp_platform_data
);
#endif
pxa_set_ohci_info
(
&
trizeps4_ohci_platform_data
);
pxa_set_ac97_info
(
NULL
);
}
pxa_set_i2c_info
(
NULL
);
i2c_register_board_info
(
0
,
trizeps4_i2c_devices
,
ARRAY_SIZE
(
trizeps4_i2c_devices
));
static
void
__init
trizeps4_map_io
(
void
)
{
pxa_map_io
();
iotable_init
(
trizeps4_io_desc
,
ARRAY_SIZE
(
trizeps4_io_desc
));
/* for DiskOnChip */
pxa_gpio_mode
(
GPIO15_nCS_1_MD
);
/* for off-module PIC on ConXS board */
pxa_gpio_mode
(
GPIO_PIC
|
GPIO_IN
);
/* UCB1400 irq */
pxa_gpio_mode
(
GPIO_UCB1400
|
GPIO_IN
);
/* for DM9000 LAN */
pxa_gpio_mode
(
GPIO78_nCS_2_MD
);
pxa_gpio_mode
(
GPIO_DM9000
|
GPIO_IN
);
/* for PCMCIA device */
pxa_gpio_mode
(
GPIO_PCD
|
GPIO_IN
);
pxa_gpio_mode
(
GPIO_PRDY
|
GPIO_IN
);
/* for I2C adapter */
pxa_gpio_mode
(
GPIO117_I2CSCL_MD
);
pxa_gpio_mode
(
GPIO118_I2CSDA_MD
);
/* MMC_DET s.o. */
pxa_gpio_mode
(
GPIO_MMC_DET
|
GPIO_IN
);
/* whats that for ??? */
pxa_gpio_mode
(
GPIO79_nCS_3_MD
);
#ifdef CONFIG_LEDS
pxa_gpio_mode
(
GPIO_SYS_BUSY_LED
|
GPIO_OUT
);
/* LED1 */
pxa_gpio_mode
(
GPIO_HEARTBEAT_LED
|
GPIO_OUT
);
/* LED2 */
#endif
#ifdef CONFIG_MACH_TRIZEPS4_CONXS
#ifdef CONFIG_IDE_PXA_CF
/* if boot direct from compact flash dont disable power */
trizeps_conxs_bcr
=
0x0009
;
...
...
@@ -478,18 +555,24 @@ static void __init trizeps4_map_io(void)
/* this is the reset value */
trizeps_conxs_bcr
=
0x00A0
;
#endif
ConXS_BCR
=
trizeps_conxs_bcr
;
#endif
BCR_writew
(
trizeps_conxs_bcr
);
board_backlight_power
(
1
);
}
#warning FIXME - accessing PM registers directly is deprecated
PWER
=
0x00000002
;
PFER
=
0x00000000
;
PRER
=
0x00000002
;
PGSR0
=
0x0158C000
;
PGSR1
=
0x00FF0080
;
PGSR2
=
0x0001C004
;
/* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
PCFR
|=
PCFR_OPDE
;
static
void
__init
trizeps4_map_io
(
void
)
{
pxa_map_io
();
iotable_init
(
trizeps4_io_desc
,
ARRAY_SIZE
(
trizeps4_io_desc
));
if
((
MSC0
&
0x8
)
&&
(
BOOT_DEF
&
0x1
))
{
/* if flash is 16 bit wide its a Trizeps4 WL */
__machine_arch_type
=
MACH_TYPE_TRIZEPS4WL
;
trizeps4_flash_data
[
0
].
width
=
2
;
}
else
{
/* if flash is 32 bit wide its a Trizeps4 */
__machine_arch_type
=
MACH_TYPE_TRIZEPS4
;
trizeps4_flash_data
[
0
].
width
=
4
;
}
}
MACHINE_START
(
TRIZEPS4
,
"Keith und Koep Trizeps IV module"
)
...
...
@@ -503,3 +586,13 @@ MACHINE_START(TRIZEPS4, "Keith und Koep Trizeps IV module")
.
timer
=
&
pxa_timer
,
MACHINE_END
MACHINE_START
(
TRIZEPS4WL
,
"Keith und Koep Trizeps IV-WL module"
)
/* MAINTAINER("Jürgen Schindele") */
.
phys_io
=
0x40000000
,
.
io_pg_offst
=
(
io_p2v
(
0x40000000
)
>>
18
)
&
0xfffc
,
.
boot_params
=
TRIZEPS4_SDRAM_BASE
+
0x100
,
.
init_machine
=
trizeps4_init
,
.
map_io
=
trizeps4_map_io
,
.
init_irq
=
pxa27x_init_irq
,
.
timer
=
&
pxa_timer
,
MACHINE_END
drivers/pcmcia/Kconfig
View file @
5ff7f78a
...
...
@@ -220,7 +220,7 @@ config PCMCIA_PXA2XX
tristate "PXA2xx support"
depends on ARM && ARCH_PXA && PCMCIA
depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \
|| MACH_ARMCORE || ARCH_PXA_PALM)
|| MACH_ARMCORE || ARCH_PXA_PALM
|| TRIZEPS_PCMCIA
)
help
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
pxa2xx_cs-$(CONFIG_MACH_MAINSTONE)
+=
pxa2xx_mainstone.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_TRIZEPS_PCMCIA)
+=
pxa2xx_trizeps.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