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
32a55b11
Commit
32a55b11
authored
Aug 16, 2003
by
Russell King
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[ARM] Add Integrator IM/PD-1 module support for Integrator PP/2.
parent
906e045d
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
281 additions
and
0 deletions
+281
-0
arch/arm/Kconfig
arch/arm/Kconfig
+2
-0
arch/arm/mach-integrator/Kconfig
arch/arm/mach-integrator/Kconfig
+16
-0
arch/arm/mach-integrator/Makefile
arch/arm/mach-integrator/Makefile
+1
-0
arch/arm/mach-integrator/impd1.c
arch/arm/mach-integrator/impd1.c
+262
-0
No files found.
arch/arm/Kconfig
View file @
32a55b11
...
...
@@ -165,6 +165,8 @@ source "arch/arm/mach-epxa10db/Kconfig"
source "arch/arm/mach-footbridge/Kconfig"
source "arch/arm/mach-integrator/Kconfig"
source "arch/arm/mach-iop3xx/Kconfig"
source "arch/arm/mach-pxa/Kconfig"
...
...
arch/arm/mach-integrator/Kconfig
0 → 100644
View file @
32a55b11
menu "Integrator Options"
depends on ARCH_INTEGRATOR
config INTEGRATOR_IMPD1
tristate "Include support for Integrator/IM-PD1"
help
The IM-PD1 is an add-on logic module for the Integrator which
allows ARM(R) Ltd PrimeCells to be developed and evaluated.
The IM-PD1 can be found on the Integrator/PP2 platform.
If you want to compile this as a module (=code which can be
inserted into and removed from the running kernel), say M
here and read <file:Documentation/modules.txt>. The module
will be called impd1.
endmenu
arch/arm/mach-integrator/Makefile
View file @
32a55b11
...
...
@@ -9,3 +9,4 @@ obj-y := core.o time.o
obj-$(CONFIG_LEDS)
+=
leds.o
obj-$(CONFIG_PCI)
+=
pci_v3.o pci.o
obj-$(CONFIG_CPU_FREQ_INTEGRATOR)
+=
cpu.o
obj-$(CONFIG_INTEGRATOR_IMPD1)
+=
impd1.o
arch/arm/mach-integrator/impd1.c
0 → 100644
View file @
32a55b11
/*
* linux/arch/arm/mach-integrator/impd1.c
*
* Copyright (C) 2003 Deep Blue Solutions Ltd, All Rights Reserved.
*
* 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.
*
* This file provides the core support for the IM-PD1 module.
*
* Module / boot parameters.
* id=n impd1.id=n - set the logic module position in stack to 'n'
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <asm/io.h>
#include <asm/hardware/icst525.h>
#include <asm/hardware/amba.h>
#include <asm/arch/impd1.h>
#include <asm/sizes.h>
static
int
module_id
;
module_param_named
(
lmid
,
module_id
,
int
,
0
);
MODULE_PARM_DESC
(
lmid
,
"logic module stack position"
);
#define ROM_OFFSET 0x0fffff00
#define ROM_SIZE 256
struct
impd1_module
{
void
*
base
;
};
static
const
struct
icst525_params
impd1_vco_params
=
{
.
ref
=
24000
,
/* 24 MHz */
.
vco_max
=
200000
,
/* 200 MHz */
.
vd_min
=
12
,
.
vd_max
=
519
,
.
rd_min
=
3
,
.
rd_max
=
120
,
};
void
impd1_set_vco
(
struct
device
*
dev
,
int
vconr
,
unsigned
long
period
)
{
struct
impd1_module
*
impd1
=
dev_get_drvdata
(
dev
);
struct
icst525_vco
vco
;
u32
val
;
vco
=
icst525_ps_to_vco
(
&
impd1_vco_params
,
period
);
pr_debug
(
"Guessed VCO reg params: S=%d R=%d V=%d
\n
"
,
vco
.
s
,
vco
.
r
,
vco
.
v
);
val
=
vco
.
v
|
(
vco
.
r
<<
9
)
|
(
vco
.
s
<<
16
);
writel
(
0xa05f
,
impd1
->
base
+
IMPD1_LOCK
);
switch
(
vconr
)
{
case
1
:
writel
(
val
,
impd1
->
base
+
IMPD1_OSC1
);
break
;
case
2
:
writel
(
val
,
impd1
->
base
+
IMPD1_OSC2
);
break
;
}
writel
(
0
,
impd1
->
base
+
IMPD1_LOCK
);
#if DEBUG
vco
.
v
=
val
&
0x1ff
;
vco
.
r
=
(
val
>>
9
)
&
0x7f
;
vco
.
s
=
(
val
>>
16
)
&
7
;
pr_debug
(
"IM-PD1: VCO%d clock is %ld kHz
\n
"
,
vconr
,
icst525_khz
(
&
impd1_vco_params
,
vco
));
#endif
}
EXPORT_SYMBOL
(
impd1_set_vco
);
void
impd1_tweak_control
(
struct
device
*
dev
,
u32
mask
,
u32
val
)
{
struct
impd1_module
*
impd1
=
dev_get_drvdata
(
dev
);
u32
cur
;
val
&=
mask
;
cur
=
readl
(
impd1
->
base
+
IMPD1_CTRL
)
&
~
mask
;
writel
(
cur
|
val
,
impd1
->
base
+
IMPD1_CTRL
);
}
EXPORT_SYMBOL
(
impd1_tweak_control
);
struct
impd1_device
{
unsigned
long
offset
;
unsigned
int
irq
[
2
];
unsigned
int
id
;
};
static
struct
impd1_device
impd1_devs
[]
=
{
{
.
offset
=
0x03000000
,
.
id
=
0x00041190
,
},
{
.
offset
=
0x00100000
,
.
irq
=
{
1
},
.
id
=
0x00141011
,
},
{
.
offset
=
0x00200000
,
.
irq
=
{
2
},
.
id
=
0x00141011
,
},
{
.
offset
=
0x00300000
,
.
irq
=
{
3
},
.
id
=
0x00041022
,
},
{
.
offset
=
0x00400000
,
.
irq
=
{
4
},
.
id
=
0x00041061
,
},
{
.
offset
=
0x00500000
,
.
irq
=
{
5
},
.
id
=
0x00041061
,
},
{
.
offset
=
0x00600000
,
.
irq
=
{
6
},
.
id
=
0x00041130
,
},
{
.
offset
=
0x00700000
,
.
irq
=
{
7
,
8
},
.
id
=
0x00041181
,
},
{
.
offset
=
0x00800000
,
.
irq
=
{
9
},
.
id
=
0x00041041
,
},
{
.
offset
=
0x01000000
,
.
irq
=
{
11
},
.
id
=
0x00041110
,
}
};
static
int
impd1_probe
(
struct
device
*
dev
)
{
struct
platform_device
*
pdev
=
to_platform_device
(
dev
);
struct
resource
*
res
=
&
pdev
->
resource
[
0
];
struct
impd1_module
*
impd1
;
int
i
,
ret
;
if
(
pdev
->
id
!=
module_id
)
return
-
EINVAL
;
if
(
!
request_mem_region
(
res
->
start
,
SZ_4K
,
"LM registers"
))
return
-
EBUSY
;
impd1
=
kmalloc
(
sizeof
(
struct
impd1_module
),
GFP_KERNEL
);
if
(
!
impd1
)
{
ret
=
-
ENOMEM
;
goto
release_lm
;
}
memset
(
impd1
,
0
,
sizeof
(
struct
impd1_module
));
impd1
->
base
=
ioremap
(
res
->
start
,
SZ_4K
);
if
(
!
impd1
->
base
)
{
ret
=
-
ENOMEM
;
goto
free_impd1
;
}
dev_set_drvdata
(
dev
,
impd1
);
printk
(
"IM-PD1 found at 0x%08lx
\n
"
,
res
->
start
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
impd1_devs
);
i
++
)
{
struct
impd1_device
*
idev
=
impd1_devs
+
i
;
struct
amba_device
*
d
;
unsigned
long
pc_base
;
pc_base
=
res
->
start
+
idev
->
offset
;
d
=
kmalloc
(
sizeof
(
struct
amba_device
),
GFP_KERNEL
);
if
(
!
d
)
continue
;
memset
(
d
,
0
,
sizeof
(
struct
amba_device
));
snprintf
(
d
->
dev
.
bus_id
,
sizeof
(
d
->
dev
.
bus_id
),
"lm%x:%5.5x"
,
pdev
->
id
,
idev
->
offset
>>
12
);
d
->
dev
.
parent
=
&
pdev
->
dev
;
d
->
res
.
start
=
res
->
start
+
idev
->
offset
;
d
->
res
.
end
=
d
->
res
.
start
+
SZ_4K
-
1
;
d
->
res
.
flags
=
IORESOURCE_MEM
;
d
->
irq
=
pdev
->
resource
[
1
].
start
;
d
->
periphid
=
idev
->
id
;
ret
=
amba_device_register
(
d
,
res
);
if
(
ret
)
{
printk
(
"unable to register device %s: %d
\n
"
,
d
->
dev
.
bus_id
,
ret
);
kfree
(
d
);
}
}
return
0
;
free_impd1:
if
(
impd1
&&
impd1
->
base
)
iounmap
(
impd1
->
base
);
if
(
impd1
)
kfree
(
impd1
);
release_lm:
release_mem_region
(
res
->
start
,
SZ_4K
);
return
ret
;
}
static
int
impd1_remove
(
struct
device
*
dev
)
{
struct
platform_device
*
pdev
=
to_platform_device
(
dev
);
struct
resource
*
res
=
&
pdev
->
resource
[
0
];
struct
impd1_module
*
impd1
=
dev_get_drvdata
(
dev
);
struct
list_head
*
l
,
*
n
;
list_for_each_safe
(
l
,
n
,
&
dev
->
children
)
{
struct
device
*
d
=
list_to_dev
(
l
);
device_unregister
(
d
);
}
dev_set_drvdata
(
dev
,
NULL
);
iounmap
(
impd1
->
base
);
kfree
(
impd1
);
release_mem_region
(
res
->
start
,
SZ_4K
);
return
0
;
}
static
struct
device_driver
impd1_driver
=
{
.
name
=
"lm"
,
.
bus
=
&
platform_bus_type
,
.
probe
=
impd1_probe
,
.
remove
=
impd1_remove
,
};
static
int
__init
impd1_init
(
void
)
{
return
driver_register
(
&
impd1_driver
);
}
static
void
__exit
impd1_exit
(
void
)
{
driver_unregister
(
&
impd1_driver
);
}
module_init
(
impd1_init
);
module_exit
(
impd1_exit
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"Integrator/IM-PD1 logic module core driver"
);
MODULE_AUTHOR
(
"Deep Blue Solutions Ltd"
);
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