diff options
Diffstat (limited to 'arch/arm/mach-davinci')
-rw-r--r-- | arch/arm/mach-davinci/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-davinci/common.c | 29 | ||||
-rw-r--r-- | arch/arm/mach-davinci/dm355.c | 14 | ||||
-rw-r--r-- | arch/arm/mach-davinci/dm644x.c | 15 | ||||
-rw-r--r-- | arch/arm/mach-davinci/dm646x.c | 14 | ||||
-rw-r--r-- | arch/arm/mach-davinci/id.c | 116 | ||||
-rw-r--r-- | arch/arm/mach-davinci/include/mach/common.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-davinci/include/mach/cputype.h | 29 |
8 files changed, 97 insertions, 128 deletions
diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile index 74d25f69934e..a65d03bb4679 100644 --- a/arch/arm/mach-davinci/Makefile +++ b/arch/arm/mach-davinci/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | # | 4 | # |
5 | 5 | ||
6 | # Common objects | 6 | # Common objects |
7 | obj-y := time.o irq.o clock.o serial.o io.o id.o psc.o \ | 7 | obj-y := time.o irq.o clock.o serial.o io.o psc.o \ |
8 | gpio.o devices.o dma.o usb.o common.o | 8 | gpio.o devices.o dma.o usb.o common.o |
9 | 9 | ||
10 | obj-$(CONFIG_DAVINCI_MUX) += mux.o | 10 | obj-$(CONFIG_DAVINCI_MUX) += mux.o |
diff --git a/arch/arm/mach-davinci/common.c b/arch/arm/mach-davinci/common.c index 9a5486f5519c..29b3a8d51211 100644 --- a/arch/arm/mach-davinci/common.c +++ b/arch/arm/mach-davinci/common.c | |||
@@ -15,13 +15,31 @@ | |||
15 | #include <asm/mach/map.h> | 15 | #include <asm/mach/map.h> |
16 | 16 | ||
17 | #include <mach/common.h> | 17 | #include <mach/common.h> |
18 | #include <mach/cputype.h> | ||
18 | 19 | ||
19 | struct davinci_soc_info davinci_soc_info; | 20 | struct davinci_soc_info davinci_soc_info; |
20 | EXPORT_SYMBOL(davinci_soc_info); | 21 | EXPORT_SYMBOL(davinci_soc_info); |
21 | 22 | ||
23 | static struct davinci_id * __init davinci_get_id(u32 jtag_id) | ||
24 | { | ||
25 | int i; | ||
26 | struct davinci_id *dip; | ||
27 | u8 variant = (jtag_id & 0xf0000000) >> 28; | ||
28 | u16 part_no = (jtag_id & 0x0ffff000) >> 12; | ||
29 | |||
30 | for (i = 0, dip = davinci_soc_info.ids; i < davinci_soc_info.ids_num; | ||
31 | i++, dip++) | ||
32 | /* Don't care about the manufacturer right now */ | ||
33 | if ((dip->part_no == part_no) && (dip->variant == variant)) | ||
34 | return dip; | ||
35 | |||
36 | return NULL; | ||
37 | } | ||
38 | |||
22 | void __init davinci_common_init(struct davinci_soc_info *soc_info) | 39 | void __init davinci_common_init(struct davinci_soc_info *soc_info) |
23 | { | 40 | { |
24 | int ret; | 41 | int ret; |
42 | struct davinci_id *dip; | ||
25 | 43 | ||
26 | if (!soc_info) { | 44 | if (!soc_info) { |
27 | ret = -EINVAL; | 45 | ret = -EINVAL; |
@@ -46,7 +64,16 @@ void __init davinci_common_init(struct davinci_soc_info *soc_info) | |||
46 | * We want to check CPU revision early for cpu_is_xxxx() macros. | 64 | * We want to check CPU revision early for cpu_is_xxxx() macros. |
47 | * IO space mapping must be initialized before we can do that. | 65 | * IO space mapping must be initialized before we can do that. |
48 | */ | 66 | */ |
49 | davinci_check_revision(); | 67 | davinci_soc_info.jtag_id = __raw_readl(davinci_soc_info.jtag_id_base); |
68 | |||
69 | dip = davinci_get_id(davinci_soc_info.jtag_id); | ||
70 | if (!dip) { | ||
71 | ret = -EINVAL; | ||
72 | goto err; | ||
73 | } | ||
74 | |||
75 | davinci_soc_info.cpu_id = dip->cpu_id; | ||
76 | pr_info("DaVinci %s variant 0x%x\n", dip->name, dip->variant); | ||
50 | 77 | ||
51 | return; | 78 | return; |
52 | 79 | ||
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index 6d1abfdcfb72..0f724c060084 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c | |||
@@ -534,9 +534,23 @@ static struct map_desc dm355_io_desc[] = { | |||
534 | }, | 534 | }, |
535 | }; | 535 | }; |
536 | 536 | ||
537 | /* Contents of JTAG ID register used to identify exact cpu type */ | ||
538 | static struct davinci_id dm355_ids[] = { | ||
539 | { | ||
540 | .variant = 0x0, | ||
541 | .part_no = 0xb73b, | ||
542 | .manufacturer = 0x00f, | ||
543 | .cpu_id = DAVINCI_CPU_ID_DM355, | ||
544 | .name = "dm355", | ||
545 | }, | ||
546 | }; | ||
547 | |||
537 | static struct davinci_soc_info davinci_soc_info_dm355 = { | 548 | static struct davinci_soc_info davinci_soc_info_dm355 = { |
538 | .io_desc = dm355_io_desc, | 549 | .io_desc = dm355_io_desc, |
539 | .io_desc_num = ARRAY_SIZE(dm355_io_desc), | 550 | .io_desc_num = ARRAY_SIZE(dm355_io_desc), |
551 | .jtag_id_base = IO_ADDRESS(0x01c40028), | ||
552 | .ids = dm355_ids, | ||
553 | .ids_num = ARRAY_SIZE(dm355_ids), | ||
540 | }; | 554 | }; |
541 | 555 | ||
542 | void __init dm355_init(void) | 556 | void __init dm355_init(void) |
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index 79f113698b0b..9bcd98c6820b 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c | |||
@@ -388,7 +388,6 @@ MUX_CFG(DM644X, LOEEN, 0, 24, 1, 1, true) | |||
388 | MUX_CFG(DM644X, LFLDEN, 0, 25, 1, 1, false) | 388 | MUX_CFG(DM644X, LFLDEN, 0, 25, 1, 1, false) |
389 | }; | 389 | }; |
390 | 390 | ||
391 | |||
392 | /*----------------------------------------------------------------------*/ | 391 | /*----------------------------------------------------------------------*/ |
393 | 392 | ||
394 | static const s8 dma_chan_dm644x_no_event[] = { | 393 | static const s8 dma_chan_dm644x_no_event[] = { |
@@ -475,9 +474,23 @@ static struct map_desc dm644x_io_desc[] = { | |||
475 | }, | 474 | }, |
476 | }; | 475 | }; |
477 | 476 | ||
477 | /* Contents of JTAG ID register used to identify exact cpu type */ | ||
478 | static struct davinci_id dm644x_ids[] = { | ||
479 | { | ||
480 | .variant = 0x0, | ||
481 | .part_no = 0xb700, | ||
482 | .manufacturer = 0x017, | ||
483 | .cpu_id = DAVINCI_CPU_ID_DM6446, | ||
484 | .name = "dm6446", | ||
485 | }, | ||
486 | }; | ||
487 | |||
478 | static struct davinci_soc_info davinci_soc_info_dm644x = { | 488 | static struct davinci_soc_info davinci_soc_info_dm644x = { |
479 | .io_desc = dm644x_io_desc, | 489 | .io_desc = dm644x_io_desc, |
480 | .io_desc_num = ARRAY_SIZE(dm644x_io_desc), | 490 | .io_desc_num = ARRAY_SIZE(dm644x_io_desc), |
491 | .jtag_id_base = IO_ADDRESS(0x01c40028), | ||
492 | .ids = dm644x_ids, | ||
493 | .ids_num = ARRAY_SIZE(dm644x_ids), | ||
481 | }; | 494 | }; |
482 | 495 | ||
483 | void __init dm644x_init(void) | 496 | void __init dm644x_init(void) |
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c index 8547ec02c9e1..cd86bb78e0c1 100644 --- a/arch/arm/mach-davinci/dm646x.c +++ b/arch/arm/mach-davinci/dm646x.c | |||
@@ -454,9 +454,23 @@ static struct map_desc dm646x_io_desc[] = { | |||
454 | }, | 454 | }, |
455 | }; | 455 | }; |
456 | 456 | ||
457 | /* Contents of JTAG ID register used to identify exact cpu type */ | ||
458 | static struct davinci_id dm646x_ids[] = { | ||
459 | { | ||
460 | .variant = 0x0, | ||
461 | .part_no = 0xb770, | ||
462 | .manufacturer = 0x017, | ||
463 | .cpu_id = DAVINCI_CPU_ID_DM6467, | ||
464 | .name = "dm6467", | ||
465 | }, | ||
466 | }; | ||
467 | |||
457 | static struct davinci_soc_info davinci_soc_info_dm646x = { | 468 | static struct davinci_soc_info davinci_soc_info_dm646x = { |
458 | .io_desc = dm646x_io_desc, | 469 | .io_desc = dm646x_io_desc, |
459 | .io_desc_num = ARRAY_SIZE(dm646x_io_desc), | 470 | .io_desc_num = ARRAY_SIZE(dm646x_io_desc), |
471 | .jtag_id_base = IO_ADDRESS(0x01c40028), | ||
472 | .ids = dm646x_ids, | ||
473 | .ids_num = ARRAY_SIZE(dm646x_ids), | ||
460 | }; | 474 | }; |
461 | 475 | ||
462 | void __init dm646x_init(void) | 476 | void __init dm646x_init(void) |
diff --git a/arch/arm/mach-davinci/id.c b/arch/arm/mach-davinci/id.c deleted file mode 100644 index 018b994cd794..000000000000 --- a/arch/arm/mach-davinci/id.c +++ /dev/null | |||
@@ -1,116 +0,0 @@ | |||
1 | /* | ||
2 | * Davinci CPU identification code | ||
3 | * | ||
4 | * Copyright (C) 2006 Komal Shah <komal_shah802003@yahoo.com> | ||
5 | * | ||
6 | * Derived from OMAP1 CPU identification code. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/module.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/io.h> | ||
17 | |||
18 | #define JTAG_ID_BASE IO_ADDRESS(0x01c40028) | ||
19 | |||
20 | static unsigned int davinci_revision; | ||
21 | |||
22 | struct davinci_id { | ||
23 | u8 variant; /* JTAG ID bits 31:28 */ | ||
24 | u16 part_no; /* JTAG ID bits 27:12 */ | ||
25 | u32 manufacturer; /* JTAG ID bits 11:1 */ | ||
26 | u32 type; /* Cpu id bits [31:8], cpu class bits [7:0] */ | ||
27 | }; | ||
28 | |||
29 | /* Register values to detect the DaVinci version */ | ||
30 | static struct davinci_id davinci_ids[] __initdata = { | ||
31 | { | ||
32 | /* DM6446 */ | ||
33 | .part_no = 0xb700, | ||
34 | .variant = 0x0, | ||
35 | .manufacturer = 0x017, | ||
36 | .type = 0x64460000, | ||
37 | }, | ||
38 | { | ||
39 | /* DM646X */ | ||
40 | .part_no = 0xb770, | ||
41 | .variant = 0x0, | ||
42 | .manufacturer = 0x017, | ||
43 | .type = 0x64670000, | ||
44 | }, | ||
45 | { | ||
46 | /* DM355 */ | ||
47 | .part_no = 0xb73b, | ||
48 | .variant = 0x0, | ||
49 | .manufacturer = 0x00f, | ||
50 | .type = 0x03550000, | ||
51 | }, | ||
52 | }; | ||
53 | |||
54 | /* | ||
55 | * Get Device Part No. from JTAG ID register | ||
56 | */ | ||
57 | static u16 __init davinci_get_part_no(void) | ||
58 | { | ||
59 | u32 dev_id, part_no; | ||
60 | |||
61 | dev_id = __raw_readl(JTAG_ID_BASE); | ||
62 | |||
63 | part_no = ((dev_id >> 12) & 0xffff); | ||
64 | |||
65 | return part_no; | ||
66 | } | ||
67 | |||
68 | /* | ||
69 | * Get Device Revision from JTAG ID register | ||
70 | */ | ||
71 | static u8 __init davinci_get_variant(void) | ||
72 | { | ||
73 | u32 variant; | ||
74 | |||
75 | variant = __raw_readl(JTAG_ID_BASE); | ||
76 | |||
77 | variant = (variant >> 28) & 0xf; | ||
78 | |||
79 | return variant; | ||
80 | } | ||
81 | |||
82 | unsigned int davinci_rev(void) | ||
83 | { | ||
84 | return davinci_revision >> 16; | ||
85 | } | ||
86 | EXPORT_SYMBOL(davinci_rev); | ||
87 | |||
88 | void __init davinci_check_revision(void) | ||
89 | { | ||
90 | int i; | ||
91 | u16 part_no; | ||
92 | u8 variant; | ||
93 | |||
94 | part_no = davinci_get_part_no(); | ||
95 | variant = davinci_get_variant(); | ||
96 | |||
97 | /* First check only the major version in a safe way */ | ||
98 | for (i = 0; i < ARRAY_SIZE(davinci_ids); i++) { | ||
99 | if (part_no == (davinci_ids[i].part_no)) { | ||
100 | davinci_revision = davinci_ids[i].type; | ||
101 | break; | ||
102 | } | ||
103 | } | ||
104 | |||
105 | /* Check if we can find the dev revision */ | ||
106 | for (i = 0; i < ARRAY_SIZE(davinci_ids); i++) { | ||
107 | if (part_no == davinci_ids[i].part_no && | ||
108 | variant == davinci_ids[i].variant) { | ||
109 | davinci_revision = davinci_ids[i].type; | ||
110 | break; | ||
111 | } | ||
112 | } | ||
113 | |||
114 | printk(KERN_INFO "DaVinci DM%04x variant 0x%x\n", | ||
115 | davinci_rev(), variant); | ||
116 | } | ||
diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h index 770a1baa97dc..ece1cd42738f 100644 --- a/arch/arm/mach-davinci/include/mach/common.h +++ b/arch/arm/mach-davinci/include/mach/common.h | |||
@@ -28,11 +28,15 @@ extern void setup_usb(unsigned mA, unsigned potpgt_msec); | |||
28 | struct davinci_soc_info { | 28 | struct davinci_soc_info { |
29 | struct map_desc *io_desc; | 29 | struct map_desc *io_desc; |
30 | unsigned long io_desc_num; | 30 | unsigned long io_desc_num; |
31 | u32 cpu_id; | ||
32 | u32 jtag_id; | ||
33 | void __iomem *jtag_id_base; | ||
34 | struct davinci_id *ids; | ||
35 | unsigned long ids_num; | ||
31 | }; | 36 | }; |
32 | 37 | ||
33 | extern struct davinci_soc_info davinci_soc_info; | 38 | extern struct davinci_soc_info davinci_soc_info; |
34 | 39 | ||
35 | extern void davinci_common_init(struct davinci_soc_info *soc_info); | 40 | extern void davinci_common_init(struct davinci_soc_info *soc_info); |
36 | extern void davinci_check_revision(void); | ||
37 | 41 | ||
38 | #endif /* __ARCH_ARM_MACH_DAVINCI_COMMON_H */ | 42 | #endif /* __ARCH_ARM_MACH_DAVINCI_COMMON_H */ |
diff --git a/arch/arm/mach-davinci/include/mach/cputype.h b/arch/arm/mach-davinci/include/mach/cputype.h index 27cfb1b3a662..d12a5ed2959a 100644 --- a/arch/arm/mach-davinci/include/mach/cputype.h +++ b/arch/arm/mach-davinci/include/mach/cputype.h | |||
@@ -16,17 +16,30 @@ | |||
16 | #ifndef _ASM_ARCH_CPU_H | 16 | #ifndef _ASM_ARCH_CPU_H |
17 | #define _ASM_ARCH_CPU_H | 17 | #define _ASM_ARCH_CPU_H |
18 | 18 | ||
19 | extern unsigned int davinci_rev(void); | 19 | #include <mach/common.h> |
20 | 20 | ||
21 | #define IS_DAVINCI_CPU(type, id) \ | 21 | struct davinci_id { |
22 | static inline int is_davinci_dm ##type(void) \ | 22 | u8 variant; /* JTAG ID bits 31:28 */ |
23 | { \ | 23 | u16 part_no; /* JTAG ID bits 27:12 */ |
24 | return (davinci_rev() == (id)) ? 1 : 0; \ | 24 | u16 manufacturer; /* JTAG ID bits 11:1 */ |
25 | u32 cpu_id; | ||
26 | char *name; | ||
27 | }; | ||
28 | |||
29 | /* Can use lower 16 bits of cpu id for a variant when required */ | ||
30 | #define DAVINCI_CPU_ID_DM6446 0x64460000 | ||
31 | #define DAVINCI_CPU_ID_DM6467 0x64670000 | ||
32 | #define DAVINCI_CPU_ID_DM355 0x03550000 | ||
33 | |||
34 | #define IS_DAVINCI_CPU(type, id) \ | ||
35 | static inline int is_davinci_ ##type(void) \ | ||
36 | { \ | ||
37 | return (davinci_soc_info.cpu_id == (id)); \ | ||
25 | } | 38 | } |
26 | 39 | ||
27 | IS_DAVINCI_CPU(644x, 0x6446) | 40 | IS_DAVINCI_CPU(dm644x, DAVINCI_CPU_ID_DM6446) |
28 | IS_DAVINCI_CPU(646x, 0x6467) | 41 | IS_DAVINCI_CPU(dm646x, DAVINCI_CPU_ID_DM6467) |
29 | IS_DAVINCI_CPU(355, 0x355) | 42 | IS_DAVINCI_CPU(dm355, DAVINCI_CPU_ID_DM355) |
30 | 43 | ||
31 | #ifdef CONFIG_ARCH_DAVINCI_DM644x | 44 | #ifdef CONFIG_ARCH_DAVINCI_DM644x |
32 | #define cpu_is_davinci_dm644x() is_davinci_dm644x() | 45 | #define cpu_is_davinci_dm644x() is_davinci_dm644x() |