aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2010-10-29 06:34:13 -0400
committerPaul Mundt <lethal@linux-sh.org>2010-10-29 06:34:13 -0400
commitc1cfed3c3a190b4ce1d5a4510d9dfd3d42176fba (patch)
treeb683f2a7023faecc09f7130ad71aeaaff7e8f4f7 /arch/sh
parentdb2d0373fd1fe4db94587d52767388d811ee201f (diff)
sh: mach-edosk7705: update for this century, kill off PIO trapping.
The only reason this board needs to do PIO trapping is for ethernet, which happens to follow the same scheme as its bigger brother the edosk7760. With ethernet properly supported through the platform device, we can kill off the left over PIO abortion. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh')
-rw-r--r--arch/sh/boards/mach-edosk7705/Makefile2
-rw-r--r--arch/sh/boards/mach-edosk7705/io.c71
-rw-r--r--arch/sh/boards/mach-edosk7705/setup.c63
3 files changed, 54 insertions, 82 deletions
diff --git a/arch/sh/boards/mach-edosk7705/Makefile b/arch/sh/boards/mach-edosk7705/Makefile
index cd54acb51499..0cf5715a78b3 100644
--- a/arch/sh/boards/mach-edosk7705/Makefile
+++ b/arch/sh/boards/mach-edosk7705/Makefile
@@ -2,4 +2,4 @@
2# Makefile for the EDOSK7705 specific parts of the kernel 2# Makefile for the EDOSK7705 specific parts of the kernel
3# 3#
4 4
5obj-y := setup.o io.o 5obj-y := setup.o
diff --git a/arch/sh/boards/mach-edosk7705/io.c b/arch/sh/boards/mach-edosk7705/io.c
deleted file mode 100644
index 5b9c57c43241..000000000000
--- a/arch/sh/boards/mach-edosk7705/io.c
+++ /dev/null
@@ -1,71 +0,0 @@
1/*
2 * arch/sh/boards/renesas/edosk7705/io.c
3 *
4 * Copyright (C) 2001 Ian da Silva, Jeremy Siegel
5 * Based largely on io_se.c.
6 *
7 * I/O routines for Hitachi EDOSK7705 board.
8 *
9 */
10
11#include <linux/kernel.h>
12#include <linux/types.h>
13#include <linux/io.h>
14#include <mach/edosk7705.h>
15#include <asm/addrspace.h>
16
17#define SMC_IOADDR 0xA2000000
18
19/* Map the Ethernet addresses as if it is at 0x300 - 0x320 */
20static unsigned long sh_edosk7705_isa_port2addr(unsigned long port)
21{
22 /*
23 * SMC91C96 registers are 4 byte aligned rather than the
24 * usual 2 byte!
25 */
26 if (port >= 0x300 && port < 0x320)
27 return SMC_IOADDR + ((port - 0x300) * 2);
28
29 maybebadio(port);
30 return port;
31}
32
33/* Trying to read / write bytes on odd-byte boundaries to the Ethernet
34 * registers causes problems. So we bit-shift the value and read / write
35 * in 2 byte chunks. Setting the low byte to 0 does not cause problems
36 * now as odd byte writes are only made on the bit mask / interrupt
37 * register. This may not be the case in future Mar-2003 SJD
38 */
39unsigned char sh_edosk7705_inb(unsigned long port)
40{
41 if (port >= 0x300 && port < 0x320 && port & 0x01)
42 return __raw_readw(port - 1) >> 8;
43
44 return __raw_readb(sh_edosk7705_isa_port2addr(port));
45}
46
47void sh_edosk7705_outb(unsigned char value, unsigned long port)
48{
49 if (port >= 0x300 && port < 0x320 && port & 0x01) {
50 __raw_writew(((unsigned short)value << 8), port - 1);
51 return;
52 }
53
54 __raw_writeb(value, sh_edosk7705_isa_port2addr(port));
55}
56
57void sh_edosk7705_insb(unsigned long port, void *addr, unsigned long count)
58{
59 unsigned char *p = addr;
60
61 while (count--)
62 *p++ = sh_edosk7705_inb(port);
63}
64
65void sh_edosk7705_outsb(unsigned long port, const void *addr, unsigned long count)
66{
67 unsigned char *p = (unsigned char *)addr;
68
69 while (count--)
70 sh_edosk7705_outb(*p++, port);
71}
diff --git a/arch/sh/boards/mach-edosk7705/setup.c b/arch/sh/boards/mach-edosk7705/setup.c
index d59225e26fb9..8f93b6636900 100644
--- a/arch/sh/boards/mach-edosk7705/setup.c
+++ b/arch/sh/boards/mach-edosk7705/setup.c
@@ -10,27 +10,70 @@
10 */ 10 */
11#include <linux/init.h> 11#include <linux/init.h>
12#include <linux/irq.h> 12#include <linux/irq.h>
13#include <asm/machvec.h> 13#include <linux/platform_device.h>
14#include <linux/interrupt.h>
15#include <linux/smc91x.h>
14#include <mach/edosk7705.h> 16#include <mach/edosk7705.h>
17#include <asm/machvec.h>
18#include <asm/sizes.h>
19
20#define SMC_IOBASE 0xA2000000
21#define SMC_IO_OFFSET 0x300
22#define SMC_IOADDR (SMC_IOBASE + SMC_IO_OFFSET)
23
24#define ETHERNET_IRQ 0x09
15 25
16static void __init sh_edosk7705_init_irq(void) 26static void __init sh_edosk7705_init_irq(void)
17{ 27{
18 /* This is the Ethernet interrupt */ 28 make_imask_irq(ETHERNET_IRQ);
19 make_imask_irq(0x09);
20} 29}
21 30
31/* eth initialization functions */
32static struct smc91x_platdata smc91x_info = {
33 .flags = SMC91X_USE_16BIT | SMC91X_IO_SHIFT_1 | IORESOURCE_IRQ_LOWLEVEL,
34};
35
36static struct resource smc91x_res[] = {
37 [0] = {
38 .start = SMC_IOADDR,
39 .end = SMC_IOADDR + SZ_32 - 1,
40 .flags = IORESOURCE_MEM,
41 },
42 [1] = {
43 .start = ETHERNET_IRQ,
44 .end = ETHERNET_IRQ,
45 .flags = IORESOURCE_IRQ ,
46 }
47};
48
49static struct platform_device smc91x_dev = {
50 .name = "smc91x",
51 .id = -1,
52 .num_resources = ARRAY_SIZE(smc91x_res),
53 .resource = smc91x_res,
54
55 .dev = {
56 .platform_data = &smc91x_info,
57 },
58};
59
60/* platform init code */
61static struct platform_device *edosk7705_devices[] __initdata = {
62 &smc91x_dev,
63};
64
65static int __init init_edosk7705_devices(void)
66{
67 return platform_add_devices(edosk7705_devices,
68 ARRAY_SIZE(edosk7705_devices));
69}
70__initcall(init_edosk7705_devices);
71
22/* 72/*
23 * The Machine Vector 73 * The Machine Vector
24 */ 74 */
25static struct sh_machine_vector mv_edosk7705 __initmv = { 75static struct sh_machine_vector mv_edosk7705 __initmv = {
26 .mv_name = "EDOSK7705", 76 .mv_name = "EDOSK7705",
27 .mv_nr_irqs = 80, 77 .mv_nr_irqs = 80,
28
29 .mv_inb = sh_edosk7705_inb,
30 .mv_outb = sh_edosk7705_outb,
31
32 .mv_insb = sh_edosk7705_insb,
33 .mv_outsb = sh_edosk7705_outsb,
34
35 .mv_init_irq = sh_edosk7705_init_irq, 78 .mv_init_irq = sh_edosk7705_init_irq,
36}; 79};