Skip to content

Commit 1f6db18

Browse files
author
Russell King
committed
Merge branch 'sa1100-for-next'; commit 'riscpc^{/ARM: riscpc: enable chained scatterlist support}' into for-arm-soc
2 parents d6c8204 + 0b40dee commit 1f6db18

File tree

12 files changed

+161
-173
lines changed

12 files changed

+161
-173
lines changed

MAINTAINERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1229,7 +1229,7 @@ F: include/uapi/drm/panfrost_drm.h
12291229
ARM MFM AND FLOPPY DRIVERS
12301230
M: Ian Molton <[email protected]>
12311231
S: Maintained
1232-
F: arch/arm/lib/floppydma.S
1232+
F: arch/arm/mach-rpc/floppydma.S
12331233
F: arch/arm/include/asm/floppy.h
12341234

12351235
ARM PMU PROFILING AND DEBUGGING

arch/arm/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ config ARCH_RPC
528528
select ARCH_ACORN
529529
select ARCH_MAY_HAVE_PC_FDC
530530
select ARCH_SPARSEMEM_ENABLE
531-
select ARCH_USES_GETTIMEOFFSET
531+
select ARM_HAS_SG_CHAIN
532532
select CPU_SA110
533533
select FIQ
534534
select HAVE_IDE

arch/arm/lib/Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ else
3131
endif
3232

3333
ifeq ($(CONFIG_ARCH_RPC),y)
34-
lib-y += ecard.o io-acorn.o floppydma.o
3534
AFLAGS_delay-loop.o += -march=armv4
3635
endif
3736

arch/arm/mach-rpc/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55

66
# Object file lists.
77

8-
obj-y := dma.o ecard.o fiq.o irq.o riscpc.o time.o
8+
obj-y :=dma.o ecard.o ecard-loader.o fiq.o floppydma.o io-acorn.o irq.o \
9+
riscpc.o time.o

arch/arm/mach-rpc/dma.c

Lines changed: 49 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@
2727

2828
struct iomd_dma {
2929
struct dma_struct dma;
30-
unsigned int state;
31-
unsigned long base; /* Controller base address */
30+
void __iomem *base; /* Controller base address */
3231
int irq; /* Controller IRQ */
33-
struct scatterlist cur_sg; /* Current controller buffer */
32+
unsigned int state;
33+
dma_addr_t cur_addr;
34+
unsigned int cur_len;
3435
dma_addr_t dma_addr;
3536
unsigned int dma_len;
3637
};
@@ -53,13 +54,13 @@ typedef enum {
5354
#define CR (IOMD_IO0CR - IOMD_IO0CURA)
5455
#define ST (IOMD_IO0ST - IOMD_IO0CURA)
5556

56-
static void iomd_get_next_sg(struct scatterlist *sg, struct iomd_dma *idma)
57+
static void iomd_get_next_sg(struct iomd_dma *idma)
5758
{
5859
unsigned long end, offset, flags = 0;
5960

6061
if (idma->dma.sg) {
61-
sg->dma_address = idma->dma_addr;
62-
offset = sg->dma_address & ~PAGE_MASK;
62+
idma->cur_addr = idma->dma_addr;
63+
offset = idma->cur_addr & ~PAGE_MASK;
6364

6465
end = offset + idma->dma_len;
6566

@@ -69,7 +70,7 @@ static void iomd_get_next_sg(struct scatterlist *sg, struct iomd_dma *idma)
6970
if (offset + TRANSFER_SIZE >= end)
7071
flags |= DMA_END_L;
7172

72-
sg->length = end - TRANSFER_SIZE;
73+
idma->cur_len = end - TRANSFER_SIZE;
7374

7475
idma->dma_len -= end - offset;
7576
idma->dma_addr += end - offset;
@@ -87,52 +88,49 @@ static void iomd_get_next_sg(struct scatterlist *sg, struct iomd_dma *idma)
8788
}
8889
} else {
8990
flags = DMA_END_S | DMA_END_L;
90-
sg->dma_address = 0;
91-
sg->length = 0;
91+
idma->cur_addr = 0;
92+
idma->cur_len = 0;
9293
}
9394

94-
sg->length |= flags;
95+
idma->cur_len |= flags;
9596
}
9697

9798
static irqreturn_t iomd_dma_handle(int irq, void *dev_id)
9899
{
99100
struct iomd_dma *idma = dev_id;
100-
unsigned long base = idma->base;
101+
void __iomem *base = idma->base;
102+
unsigned int state = idma->state;
103+
unsigned int status, cur, end;
101104

102105
do {
103-
unsigned int status;
104-
105-
status = iomd_readb(base + ST);
106+
status = readb(base + ST);
106107
if (!(status & DMA_ST_INT))
107-
return IRQ_HANDLED;
108-
109-
if ((idma->state ^ status) & DMA_ST_AB)
110-
iomd_get_next_sg(&idma->cur_sg, idma);
111-
112-
switch (status & (DMA_ST_OFL | DMA_ST_AB)) {
113-
case DMA_ST_OFL: /* OIA */
114-
case DMA_ST_AB: /* .IB */
115-
iomd_writel(idma->cur_sg.dma_address, base + CURA);
116-
iomd_writel(idma->cur_sg.length, base + ENDA);
117-
idma->state = DMA_ST_AB;
118-
break;
119-
120-
case DMA_ST_OFL | DMA_ST_AB: /* OIB */
121-
case 0: /* .IA */
122-
iomd_writel(idma->cur_sg.dma_address, base + CURB);
123-
iomd_writel(idma->cur_sg.length, base + ENDB);
124-
idma->state = 0;
125-
break;
108+
goto out;
109+
110+
if ((state ^ status) & DMA_ST_AB)
111+
iomd_get_next_sg(idma);
112+
113+
// This efficiently implements state = OFL != AB ? AB : 0
114+
state = ((status >> 2) ^ status) & DMA_ST_AB;
115+
if (state) {
116+
cur = CURA;
117+
end = ENDA;
118+
} else {
119+
cur = CURB;
120+
end = ENDB;
126121
}
122+
writel(idma->cur_addr, base + cur);
123+
writel(idma->cur_len, base + end);
127124

128125
if (status & DMA_ST_OFL &&
129-
idma->cur_sg.length == (DMA_END_S|DMA_END_L))
126+
idma->cur_len == (DMA_END_S|DMA_END_L))
130127
break;
131128
} while (1);
132129

133-
idma->state = ~DMA_ST_AB;
134-
disable_irq(irq);
135-
130+
state = ~DMA_ST_AB;
131+
disable_irq_nosync(irq);
132+
out:
133+
idma->state = state;
136134
return IRQ_HANDLED;
137135
}
138136

@@ -160,7 +158,7 @@ static struct device isa_dma_dev = {
160158
static void iomd_enable_dma(unsigned int chan, dma_t *dma)
161159
{
162160
struct iomd_dma *idma = container_of(dma, struct iomd_dma, dma);
163-
unsigned long dma_base = idma->base;
161+
void __iomem *base = idma->base;
164162
unsigned int ctrl = TRANSFER_SIZE | DMA_CR_E;
165163

166164
if (idma->dma.invalid) {
@@ -180,27 +178,30 @@ static void iomd_enable_dma(unsigned int chan, dma_t *dma)
180178
DMA_FROM_DEVICE : DMA_TO_DEVICE);
181179
}
182180

183-
iomd_writeb(DMA_CR_C, dma_base + CR);
181+
idma->dma_addr = idma->dma.sg->dma_address;
182+
idma->dma_len = idma->dma.sg->length;
183+
184+
writeb(DMA_CR_C, base + CR);
184185
idma->state = DMA_ST_AB;
185186
}
186187

187188
if (idma->dma.dma_mode == DMA_MODE_READ)
188189
ctrl |= DMA_CR_D;
189190

190-
iomd_writeb(ctrl, dma_base + CR);
191+
writeb(ctrl, base + CR);
191192
enable_irq(idma->irq);
192193
}
193194

194195
static void iomd_disable_dma(unsigned int chan, dma_t *dma)
195196
{
196197
struct iomd_dma *idma = container_of(dma, struct iomd_dma, dma);
197-
unsigned long dma_base = idma->base;
198+
void __iomem *base = idma->base;
198199
unsigned long flags;
199200

200201
local_irq_save(flags);
201202
if (idma->state != ~DMA_ST_AB)
202203
disable_irq(idma->irq);
203-
iomd_writeb(0, dma_base + CR);
204+
writeb(0, base + CR);
204205
local_irq_restore(flags);
205206
}
206207

@@ -363,17 +364,17 @@ static int __init rpc_dma_init(void)
363364
*/
364365
iomd_writeb(DMA_EXT_IO3|DMA_EXT_IO2, IOMD_DMAEXT);
365366

366-
iomd_dma[DMA_0].base = IOMD_IO0CURA;
367+
iomd_dma[DMA_0].base = IOMD_BASE + IOMD_IO0CURA;
367368
iomd_dma[DMA_0].irq = IRQ_DMA0;
368-
iomd_dma[DMA_1].base = IOMD_IO1CURA;
369+
iomd_dma[DMA_1].base = IOMD_BASE + IOMD_IO1CURA;
369370
iomd_dma[DMA_1].irq = IRQ_DMA1;
370-
iomd_dma[DMA_2].base = IOMD_IO2CURA;
371+
iomd_dma[DMA_2].base = IOMD_BASE + IOMD_IO2CURA;
371372
iomd_dma[DMA_2].irq = IRQ_DMA2;
372-
iomd_dma[DMA_3].base = IOMD_IO3CURA;
373+
iomd_dma[DMA_3].base = IOMD_BASE + IOMD_IO3CURA;
373374
iomd_dma[DMA_3].irq = IRQ_DMA3;
374-
iomd_dma[DMA_S0].base = IOMD_SD0CURA;
375+
iomd_dma[DMA_S0].base = IOMD_BASE + IOMD_SD0CURA;
375376
iomd_dma[DMA_S0].irq = IRQ_DMAS0;
376-
iomd_dma[DMA_S1].base = IOMD_SD1CURA;
377+
iomd_dma[DMA_S1].base = IOMD_BASE + IOMD_SD1CURA;
377378
iomd_dma[DMA_S1].irq = IRQ_DMAS1;
378379

379380
for (i = DMA_0; i <= DMA_S1; i++) {
File renamed without changes.

arch/arm/mach-rpc/ecard.c

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,21 @@ struct expcard_blacklist {
7070
unsigned short manufacturer;
7171
unsigned short product;
7272
const char *type;
73+
void (*init)(ecard_t *ec);
7374
};
7475

7576
static ecard_t *cards;
7677
static ecard_t *slot_to_expcard[MAX_ECARDS];
7778
static unsigned int ectcr;
7879

80+
static void atomwide_3p_quirk(ecard_t *ec);
81+
7982
/* List of descriptions of cards which don't have an extended
8083
* identification, or chunk directories containing a description.
8184
*/
8285
static struct expcard_blacklist __initdata blacklist[] = {
83-
{ MANU_ACORN, PROD_ACORN_ETHER1, "Acorn Ether1" }
86+
{ MANU_ACORN, PROD_ACORN_ETHER1, "Acorn Ether1" },
87+
{ MANU_ATOMWIDE, PROD_ATOMWIDE_3PSERIAL, NULL, atomwide_3p_quirk },
8488
};
8589

8690
asmlinkage extern int
@@ -496,18 +500,21 @@ static void ecard_dump_irq_state(void)
496500
printk("Expansion card IRQ state:\n");
497501

498502
for (ec = cards; ec; ec = ec->next) {
503+
const char *claimed;
504+
499505
if (ec->slot_no == 8)
500506
continue;
501507

502-
printk(" %d: %sclaimed, ",
503-
ec->slot_no, ec->claimed ? "" : "not ");
508+
claimed = ec->claimed ? "" : "not ";
504509

505510
if (ec->ops && ec->ops->irqpending &&
506511
ec->ops != &ecard_default_ops)
507-
printk("irq %spending\n",
512+
printk(" %d: %sclaimed irq %spending\n",
513+
ec->slot_no, claimed,
508514
ec->ops->irqpending(ec) ? "" : "not ");
509515
else
510-
printk("irqaddr %p, mask = %02X, status = %02X\n",
516+
printk(" %d: %sclaimed irqaddr %p, mask = %02X, status = %02X\n",
517+
ec->slot_no, claimed,
511518
ec->irqaddr, ec->irqmask, readb(ec->irqaddr));
512519
}
513520
}
@@ -868,6 +875,16 @@ void __iomem *ecardm_iomap(struct expansion_card *ec, unsigned int res,
868875
}
869876
EXPORT_SYMBOL(ecardm_iomap);
870877

878+
static void atomwide_3p_quirk(ecard_t *ec)
879+
{
880+
void __iomem *addr = __ecard_address(ec, ECARD_IOC, ECARD_SYNC);
881+
unsigned int i;
882+
883+
/* Disable interrupts on each port */
884+
for (i = 0x2000; i <= 0x2800; i += 0x0400)
885+
writeb(0, addr + i + 4);
886+
}
887+
871888
/*
872889
* Probe for an expansion card.
873890
*
@@ -924,7 +941,10 @@ static int __init ecard_probe(int slot, unsigned irq, card_type_t type)
924941
for (i = 0; i < ARRAY_SIZE(blacklist); i++)
925942
if (blacklist[i].manufacturer == ec->cid.manufacturer &&
926943
blacklist[i].product == ec->cid.product) {
927-
ec->card_desc = blacklist[i].type;
944+
if (blacklist[i].type)
945+
ec->card_desc = blacklist[i].type;
946+
if (blacklist[i].init)
947+
blacklist[i].init(ec);
928948
break;
929949
}
930950

File renamed without changes.

arch/arm/mach-rpc/include/mach/uncompress.h

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -118,29 +118,22 @@ static void arch_decomp_setup(void)
118118
struct tag *t = (struct tag *)params;
119119
unsigned int nr_pages = 0, page_size = PAGE_SIZE;
120120

121-
if (t->hdr.tag == ATAG_CORE)
122-
{
123-
for (; t->hdr.size; t = tag_next(t))
124-
{
125-
if (t->hdr.tag == ATAG_VIDEOTEXT)
126-
{
121+
if (t->hdr.tag == ATAG_CORE) {
122+
for (; t->hdr.size; t = tag_next(t)) {
123+
if (t->hdr.tag == ATAG_VIDEOTEXT) {
127124
video_num_rows = t->u.videotext.video_lines;
128125
video_num_cols = t->u.videotext.video_cols;
129-
bytes_per_char_h = t->u.videotext.video_points;
130-
bytes_per_char_v = t->u.videotext.video_points;
131126
video_x = t->u.videotext.x;
132127
video_y = t->u.videotext.y;
133-
}
134-
135-
if (t->hdr.tag == ATAG_MEM)
136-
{
128+
} else if (t->hdr.tag == ATAG_VIDEOLFB) {
129+
bytes_per_char_h = t->u.videolfb.lfb_depth;
130+
bytes_per_char_v = 8;
131+
} else if (t->hdr.tag == ATAG_MEM) {
137132
page_size = PAGE_SIZE;
138133
nr_pages += (t->u.mem.size / PAGE_SIZE);
139134
}
140135
}
141-
}
142-
else
143-
{
136+
} else {
144137
nr_pages = params->nr_pages;
145138
page_size = params->page_size;
146139
video_num_rows = params->video_num_rows;
File renamed without changes.

0 commit comments

Comments
 (0)