Merge branch 'perf/urgent' into perf/core, to pick up fixes
[linux-2.6-microblaze.git] / arch / arm / mach-pxa / mp900.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  linux/arch/arm/mach-pxa/mp900.c
4  *
5  *  Support for the NEC MobilePro900/C platform
6  *
7  *  Based on mach-pxa/gumstix.c
8  *
9  *  2007, 2008 Kristoffer Ericson <kristoffer.ericson@gmail.com>
10  *  2007, 2008 Michael Petchkovsky <mkpetch@internode.on.net>
11  */
12
13 #include <linux/init.h>
14 #include <linux/device.h>
15 #include <linux/platform_device.h>
16 #include <linux/types.h>
17 #include <linux/usb/isp116x.h>
18
19 #include <asm/mach-types.h>
20 #include <asm/mach/arch.h>
21
22 #include "pxa25x.h"
23 #include "generic.h"
24
25 static void isp116x_pfm_delay(struct device *dev, int delay)
26 {
27
28         /* 400MHz PXA2 = 2.5ns / instruction */
29
30         int cyc = delay / 10;
31
32         /* 4 Instructions = 4 x 2.5ns = 10ns */
33         __asm__ volatile ("0:\n"
34                 "subs %0, %1, #1\n"
35                 "bge 0b\n"
36                 :"=r" (cyc)
37                 :"0"(cyc)
38         );
39 }
40
41 static struct isp116x_platform_data isp116x_pfm_data = {
42         .remote_wakeup_enable = 1,
43         .delay = isp116x_pfm_delay,
44 };
45
46 static struct resource isp116x_pfm_resources[] = {
47         [0] =   {
48                 .start  = 0x0d000000,
49                 .end    = 0x0d000000 + 1,
50                 .flags  = IORESOURCE_MEM,
51                 },
52         [1] =   {
53                 .start  = 0x0d000000 + 4,
54                 .end    = 0x0d000000 + 5,
55                 .flags  = IORESOURCE_MEM,
56                 },
57         [2] =   {
58                 .start  = 61,
59                 .end    = 61,
60                 .flags  = IORESOURCE_IRQ,
61                 },
62 };
63
64 static struct platform_device mp900c_dummy_device = {
65         .name           = "mp900c_dummy",
66         .id             = -1,
67 };
68
69 static struct platform_device mp900c_usb = {
70         .name           = "isp116x-hcd",
71         .num_resources  = ARRAY_SIZE(isp116x_pfm_resources),
72         .resource       = isp116x_pfm_resources,
73         .dev.platform_data = &isp116x_pfm_data,
74 };
75
76 static struct platform_device *devices[] __initdata = {
77         &mp900c_dummy_device,
78         &mp900c_usb,
79 };
80
81 static void __init mp900c_init(void)
82 {
83         printk(KERN_INFO "MobilePro 900/C machine init\n");
84         pxa_set_ffuart_info(NULL);
85         pxa_set_btuart_info(NULL);
86         pxa_set_stuart_info(NULL);
87         platform_add_devices(devices, ARRAY_SIZE(devices));
88 }
89
90 /* Maintainer - Michael Petchkovsky <mkpetch@internode.on.net> */
91 MACHINE_START(NEC_MP900, "MobilePro900/C")
92         .atag_offset    = 0x220100,
93         .init_time      = pxa_timer_init,
94         .map_io         = pxa25x_map_io,
95         .nr_irqs        = PXA_NR_IRQS,
96         .init_irq       = pxa25x_init_irq,
97         .handle_irq     = pxa25x_handle_irq,
98         .init_machine   = mp900c_init,
99         .restart        = pxa_restart,
100 MACHINE_END
101