126 lines
4.7 KiB
C
126 lines
4.7 KiB
C
|
/*======================================================================
|
||
|
|
||
|
Device driver for the PCMCIA control functionality of StrongARM
|
||
|
SA-1100 microprocessors.
|
||
|
|
||
|
The contents of this file are subject to the Mozilla Public
|
||
|
License Version 1.1 (the "License"); you may not use this file
|
||
|
except in compliance with the License. You may obtain a copy of
|
||
|
the License at http://www.mozilla.org/MPL/
|
||
|
|
||
|
Software distributed under the License is distributed on an "AS
|
||
|
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||
|
implied. See the License for the specific language governing
|
||
|
rights and limitations under the License.
|
||
|
|
||
|
The initial developer of the original code is John G. Dorsey
|
||
|
<john+@cs.cmu.edu>. Portions created by John G. Dorsey are
|
||
|
Copyright (C) 1999 John G. Dorsey. All Rights Reserved.
|
||
|
|
||
|
Alternatively, the contents of this file may be used under the
|
||
|
terms of the GNU Public License version 2 (the "GPL"), in which
|
||
|
case the provisions of the GPL are applicable instead of the
|
||
|
above. If you wish to allow the use of your version of this file
|
||
|
only under the terms of the GPL and not to allow others to use
|
||
|
your version of this file under the MPL, indicate your decision
|
||
|
by deleting the provisions above and replace them with the notice
|
||
|
and other provisions required by the GPL. If you do not delete
|
||
|
the provisions above, a recipient may use your version of this
|
||
|
file under either the MPL or the GPL.
|
||
|
|
||
|
======================================================================*/
|
||
|
|
||
|
#if !defined(_PCMCIA_SA1100_H)
|
||
|
# define _PCMCIA_SA1100_H
|
||
|
|
||
|
/* SA-1100 PCMCIA Memory and I/O timing
|
||
|
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
|
* The SA-1110 Developer's Manual, section 10.2.5, says the following:
|
||
|
*
|
||
|
* "To calculate the recommended BS_xx value for each address space:
|
||
|
* divide the command width time (the greater of twIOWR and twIORD,
|
||
|
* or the greater of twWE and twOE) by processor cycle time; divide
|
||
|
* by 2; divide again by 3 (number of BCLK's per command assertion);
|
||
|
* round up to the next whole number; and subtract 1."
|
||
|
*/
|
||
|
|
||
|
/* MECR: Expansion Memory Configuration Register
|
||
|
* (SA-1100 Developers Manual, p.10-13; SA-1110 Developers Manual, p.10-24)
|
||
|
*
|
||
|
* MECR layout is:
|
||
|
*
|
||
|
* FAST1 BSM1<4:0> BSA1<4:0> BSIO1<4:0> FAST0 BSM0<4:0> BSA0<4:0> BSIO0<4:0>
|
||
|
*
|
||
|
* (This layout is actually true only for the SA-1110; the FASTn bits are
|
||
|
* reserved on the SA-1100.)
|
||
|
*/
|
||
|
|
||
|
#define MECR_SOCKET_0_SHIFT (0)
|
||
|
#define MECR_SOCKET_1_SHIFT (16)
|
||
|
|
||
|
#define MECR_BS_MASK (0x1f)
|
||
|
#define MECR_FAST_MODE_MASK (0x01)
|
||
|
|
||
|
#define MECR_BSIO_SHIFT (0)
|
||
|
#define MECR_BSA_SHIFT (5)
|
||
|
#define MECR_BSM_SHIFT (10)
|
||
|
#define MECR_FAST_SHIFT (15)
|
||
|
|
||
|
#define MECR_SET(mecr, sock, shift, mask, bs) \
|
||
|
((mecr)=((mecr)&~(((mask)<<(shift))<<\
|
||
|
((sock)==0?MECR_SOCKET_0_SHIFT:MECR_SOCKET_1_SHIFT)))|\
|
||
|
(((bs)<<(shift))<<((sock)==0?MECR_SOCKET_0_SHIFT:MECR_SOCKET_1_SHIFT)))
|
||
|
|
||
|
#define MECR_GET(mecr, sock, shift, mask) \
|
||
|
((((mecr)>>(((sock)==0)?MECR_SOCKET_0_SHIFT:MECR_SOCKET_1_SHIFT))>>\
|
||
|
(shift))&(mask))
|
||
|
|
||
|
#define MECR_BSIO_SET(mecr, sock, bs) \
|
||
|
MECR_SET((mecr), (sock), MECR_BSIO_SHIFT, MECR_BS_MASK, (bs))
|
||
|
|
||
|
#define MECR_BSIO_GET(mecr, sock) \
|
||
|
MECR_GET((mecr), (sock), MECR_BSIO_SHIFT, MECR_BS_MASK)
|
||
|
|
||
|
#define MECR_BSA_SET(mecr, sock, bs) \
|
||
|
MECR_SET((mecr), (sock), MECR_BSA_SHIFT, MECR_BS_MASK, (bs))
|
||
|
|
||
|
#define MECR_BSA_GET(mecr, sock) \
|
||
|
MECR_GET((mecr), (sock), MECR_BSA_SHIFT, MECR_BS_MASK)
|
||
|
|
||
|
#define MECR_BSM_SET(mecr, sock, bs) \
|
||
|
MECR_SET((mecr), (sock), MECR_BSM_SHIFT, MECR_BS_MASK, (bs))
|
||
|
|
||
|
#define MECR_BSM_GET(mecr, sock) \
|
||
|
MECR_GET((mecr), (sock), MECR_BSM_SHIFT, MECR_BS_MASK)
|
||
|
|
||
|
#define MECR_FAST_SET(mecr, sock, fast) \
|
||
|
MECR_SET((mecr), (sock), MECR_FAST_SHIFT, MECR_FAST_MODE_MASK, (fast))
|
||
|
|
||
|
#define MECR_FAST_GET(mecr, sock) \
|
||
|
MECR_GET((mecr), (sock), MECR_FAST_SHIFT, MECR_FAST_MODE_MASK)
|
||
|
|
||
|
|
||
|
/* This function implements the BS value calculation for setting the MECR
|
||
|
* using integer arithmetic:
|
||
|
*/
|
||
|
static inline unsigned int sa1100_pcmcia_mecr_bs(unsigned int pcmcia_cycle_ns,
|
||
|
unsigned int cpu_clock_khz){
|
||
|
unsigned int t = ((pcmcia_cycle_ns * cpu_clock_khz) / 6) - 1000000;
|
||
|
return (t / 1000000) + (((t % 1000000) == 0) ? 0 : 1);
|
||
|
}
|
||
|
|
||
|
/* This function returns the (approximate) command assertion period, in
|
||
|
* nanoseconds, for a given CPU clock frequency and MECR BS value:
|
||
|
*/
|
||
|
static inline unsigned int sa1100_pcmcia_cmd_time(unsigned int cpu_clock_khz,
|
||
|
unsigned int pcmcia_mecr_bs){
|
||
|
return (((10000000 * 2) / cpu_clock_khz) * (3 * (pcmcia_mecr_bs + 1))) / 10;
|
||
|
}
|
||
|
|
||
|
|
||
|
int sa11xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt);
|
||
|
void sa11xx_drv_pcmcia_ops(struct pcmcia_low_level *ops);
|
||
|
extern int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr);
|
||
|
|
||
|
#endif /* !defined(_PCMCIA_SA1100_H) */
|