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
299c2e86
Commit
299c2e86
authored
Jan 26, 2003
by
Russell King
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[ARM] Convert ecard to allow use of ioremap + {read,write}[bwl]
parent
a7c4fb64
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
124 additions
and
8 deletions
+124
-8
arch/arm/kernel/ecard.c
arch/arm/kernel/ecard.c
+97
-7
include/asm-arm/arch-rpc/hardware.h
include/asm-arm/arch-rpc/hardware.h
+11
-0
include/asm-arm/ecard.h
include/asm-arm/ecard.h
+16
-1
No files found.
arch/arm/kernel/ecard.c
View file @
299c2e86
...
...
@@ -881,6 +881,90 @@ static void ecard_proc_init(void)
get_ecard_dev_info
);
}
#define ec_set_resource(ec,nr,st,sz,flg) \
do { \
(ec)->resource[nr].name = ec->dev.name; \
(ec)->resource[nr].start = st; \
(ec)->resource[nr].end = (st) + (sz) - 1; \
(ec)->resource[nr].flags = flg; \
} while (0)
static
void
__init
ecard_init_resources
(
struct
expansion_card
*
ec
)
{
unsigned
long
base
=
PODSLOT_IOC4_BASE
;
unsigned
int
slot
=
ec
->
slot_no
;
int
i
;
if
(
slot
<
4
)
{
ec_set_resource
(
ec
,
ECARD_RES_MEMC
,
PODSLOT_MEMC_BASE
+
(
slot
<<
14
),
PODSLOT_MEMC_SIZE
,
IORESOURCE_MEM
);
base
=
PODSLOT_IOC0_BASE
;
}
#ifdef CONFIG_ARCH_RPC
if
(
slot
<
8
)
{
ec_set_resource
(
ec
,
ECARD_RES_EASI
,
PODSLOT_EASI_BASE
+
(
slot
<<
24
),
PODSLOT_EASI_SIZE
,
IORESOURCE_MEM
);
}
if
(
slot
==
8
)
{
ec_set_resource
(
ec
,
ECARD_RES_MEMC
,
NETSLOT_BASE
,
NETSLOT_SIZE
,
IORESOURCE_MEM
);
}
else
#endif
for
(
i
=
0
;
i
<
ECARD_RES_IOCSYNC
-
ECARD_RES_IOCSLOW
;
i
++
)
{
ec_set_resource
(
ec
,
i
+
ECARD_RES_IOCSLOW
,
base
+
(
slot
<<
14
)
+
(
i
<<
19
),
PODSLOT_IOC_SIZE
,
IORESOURCE_MEM
);
}
for
(
i
=
0
;
i
<
ECARD_NUM_RESOURCES
;
i
++
)
{
if
(
ec
->
resource
[
i
].
start
&&
request_resource
(
&
iomem_resource
,
&
ec
->
resource
[
i
]))
{
printk
(
KERN_ERR
"%s: resource(s) not available
\n
"
,
ec
->
dev
.
bus_id
);
ec
->
resource
[
i
].
end
-=
ec
->
resource
[
i
].
start
;
ec
->
resource
[
i
].
start
=
0
;
}
}
}
static
ssize_t
ecard_show_irq
(
struct
device
*
dev
,
char
*
buf
)
{
struct
expansion_card
*
ec
=
ECARD_DEV
(
dev
);
return
sprintf
(
buf
,
"%u
\n
"
,
ec
->
irq
);
}
static
DEVICE_ATTR
(
irq
,
S_IRUGO
,
ecard_show_irq
,
NULL
);
static
ssize_t
ecard_show_dma
(
struct
device
*
dev
,
char
*
buf
)
{
struct
expansion_card
*
ec
=
ECARD_DEV
(
dev
);
return
sprintf
(
buf
,
"%u
\n
"
,
ec
->
dma
);
}
static
DEVICE_ATTR
(
dma
,
S_IRUGO
,
ecard_show_dma
,
NULL
);
static
ssize_t
ecard_show_resources
(
struct
device
*
dev
,
char
*
buf
)
{
struct
expansion_card
*
ec
=
ECARD_DEV
(
dev
);
char
*
str
=
buf
;
int
i
;
for
(
i
=
0
;
i
<
ECARD_NUM_RESOURCES
;
i
++
)
str
+=
sprintf
(
str
,
"%08lx %08lx %08lx
\n
"
,
ec
->
resource
[
i
].
start
,
ec
->
resource
[
i
].
end
,
ec
->
resource
[
i
].
flags
);
return
str
-
buf
;
}
static
DEVICE_ATTR
(
resource
,
S_IRUGO
,
ecard_show_resources
,
NULL
);
/*
* Probe for an expansion card.
*
...
...
@@ -949,6 +1033,16 @@ ecard_probe(int slot, card_type_t type)
break
;
}
snprintf
(
ec
->
dev
.
bus_id
,
sizeof
(
ec
->
dev
.
bus_id
),
"ecard%d"
,
slot
);
snprintf
(
ec
->
dev
.
name
,
sizeof
(
ec
->
dev
.
name
),
"ecard %04x:%04x"
,
ec
->
cid
.
manufacturer
,
ec
->
cid
.
product
);
ec
->
dev
.
parent
=
NULL
;
ec
->
dev
.
bus
=
&
ecard_bus_type
;
ec
->
dev
.
dma_mask
=
&
ec
->
dma_mask
;
ec
->
dma_mask
=
(
u64
)
0xffffffff
;
ecard_init_resources
(
ec
);
/*
* hook the interrupt handlers
*/
...
...
@@ -974,14 +1068,10 @@ ecard_probe(int slot, card_type_t type)
*
ecp
=
ec
;
slot_to_expcard
[
slot
]
=
ec
;
snprintf
(
ec
->
dev
.
bus_id
,
sizeof
(
ec
->
dev
.
bus_id
),
"ecard%d"
,
slot
);
strcpy
(
ec
->
dev
.
name
,
"fixme!"
);
ec
->
dev
.
parent
=
NULL
;
ec
->
dev
.
bus
=
&
ecard_bus_type
;
ec
->
dev
.
dma_mask
=
&
ec
->
dma_mask
;
ec
->
dma_mask
=
(
u64
)
0xffffffff
;
device_register
(
&
ec
->
dev
);
device_create_file
(
&
ec
->
dev
,
&
dev_attr_dma
);
device_create_file
(
&
ec
->
dev
,
&
dev_attr_irq
);
device_create_file
(
&
ec
->
dev
,
&
dev_attr_resource
);
return
0
;
...
...
include/asm-arm/arch-rpc/hardware.h
View file @
299c2e86
...
...
@@ -63,6 +63,17 @@
#define IO_EC_MEMC8_BASE 0x8000ac00
#define IO_EC_MEMC_BASE 0x80000000
#define NETSLOT_BASE 0x0302b000
#define NETSLOT_SIZE 0x00001000
#define PODSLOT_IOC0_BASE 0x03240000
#define PODSLOT_IOC4_BASE 0x03270000
#define PODSLOT_IOC_SIZE (1 << 14)
#define PODSLOT_MEMC_BASE 0x03000000
#define PODSLOT_MEMC_SIZE (1 << 14)
#define PODSLOT_EASI_BASE 0x08000000
#define PODSLOT_EASI_SIZE (1 << 24)
#define EXPMASK_STATUS (EXPMASK_BASE + 0x00)
#define EXPMASK_ENABLE (EXPMASK_BASE + 0x04)
...
...
include/asm-arm/ecard.h
View file @
299c2e86
...
...
@@ -130,6 +130,20 @@ typedef struct { /* Card handler routines */
int
(
*
fiqpending
)(
ecard_t
*
ec
);
}
expansioncard_ops_t
;
#define ECARD_NUM_RESOURCES (6)
#define ECARD_RES_IOCSLOW (0)
#define ECARD_RES_IOCMEDIUM (1)
#define ECARD_RES_IOCFAST (2)
#define ECARD_RES_IOCSYNC (3)
#define ECARD_RES_MEMC (4)
#define ECARD_RES_EASI (5)
#define ecard_resource_start(ec,nr) ((ec)->resource[nr].start)
#define ecard_resource_end(ec,nr) ((ec)->resource[nr].end)
#define ecard_resource_len(ec,nr) ((ec)->resource[nr].end - \
(ec)->resource[nr].start + 1)
/*
* This contains all the info needed on an expansion card
*/
...
...
@@ -137,6 +151,7 @@ struct expansion_card {
struct
expansion_card
*
next
;
struct
device
dev
;
struct
resource
resource
[
ECARD_NUM_RESOURCES
];
/* Public data */
volatile
unsigned
char
*
irqaddr
;
/* address of IRQ register */
...
...
@@ -147,7 +162,7 @@ struct expansion_card {
void
*
irq_data
;
/* Data for use for IRQ by card */
void
*
fiq_data
;
/* Data for use for FIQ by card */
expansioncard_ops_t
*
ops
;
/* Enable/Disable Ops for card */
const
expansioncard_ops_t
*
ops
;
/* Enable/Disable Ops for card */
CONST
unsigned
int
slot_no
;
/* Slot number */
CONST
unsigned
int
dma
;
/* DMA number (for request_dma) */
...
...
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