Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/powerpc/platforms/512x/pdm360ng.c
10820 views
1
/*
2
* Copyright (C) 2010 DENX Software Engineering
3
*
4
* Anatolij Gustschin, <[email protected]>
5
*
6
* PDM360NG board setup
7
*
8
* This is free software; you can redistribute it and/or modify it
9
* under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version.
12
*
13
*/
14
15
#include <linux/kernel.h>
16
#include <linux/io.h>
17
#include <linux/of_platform.h>
18
19
#include <asm/machdep.h>
20
#include <asm/ipic.h>
21
22
#include "mpc512x.h"
23
24
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
25
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
26
#include <linux/interrupt.h>
27
#include <linux/spi/ads7846.h>
28
#include <linux/spi/spi.h>
29
#include <linux/notifier.h>
30
31
static void *pdm360ng_gpio_base;
32
33
static int pdm360ng_get_pendown_state(void)
34
{
35
u32 reg;
36
37
reg = in_be32(pdm360ng_gpio_base + 0xc);
38
if (reg & 0x40)
39
setbits32(pdm360ng_gpio_base + 0xc, 0x40);
40
41
reg = in_be32(pdm360ng_gpio_base + 0x8);
42
43
/* return 1 if pen is down */
44
return (reg & 0x40) == 0;
45
}
46
47
static struct ads7846_platform_data pdm360ng_ads7846_pdata = {
48
.model = 7845,
49
.get_pendown_state = pdm360ng_get_pendown_state,
50
.irq_flags = IRQF_TRIGGER_LOW,
51
};
52
53
static int __init pdm360ng_penirq_init(void)
54
{
55
struct device_node *np;
56
57
np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-gpio");
58
if (!np) {
59
pr_err("%s: Can't find 'mpc5121-gpio' node\n", __func__);
60
return -ENODEV;
61
}
62
63
pdm360ng_gpio_base = of_iomap(np, 0);
64
of_node_put(np);
65
if (!pdm360ng_gpio_base) {
66
pr_err("%s: Can't map gpio regs.\n", __func__);
67
return -ENODEV;
68
}
69
out_be32(pdm360ng_gpio_base + 0xc, 0xffffffff);
70
setbits32(pdm360ng_gpio_base + 0x18, 0x2000);
71
setbits32(pdm360ng_gpio_base + 0x10, 0x40);
72
73
return 0;
74
}
75
76
static int pdm360ng_touchscreen_notifier_call(struct notifier_block *nb,
77
unsigned long event, void *__dev)
78
{
79
struct device *dev = __dev;
80
81
if ((event == BUS_NOTIFY_ADD_DEVICE) &&
82
of_device_is_compatible(dev->of_node, "ti,ads7846")) {
83
dev->platform_data = &pdm360ng_ads7846_pdata;
84
return NOTIFY_OK;
85
}
86
return NOTIFY_DONE;
87
}
88
89
static struct notifier_block pdm360ng_touchscreen_nb = {
90
.notifier_call = pdm360ng_touchscreen_notifier_call,
91
};
92
93
static void __init pdm360ng_touchscreen_init(void)
94
{
95
if (pdm360ng_penirq_init())
96
return;
97
98
bus_register_notifier(&spi_bus_type, &pdm360ng_touchscreen_nb);
99
}
100
#else
101
static inline void __init pdm360ng_touchscreen_init(void)
102
{
103
}
104
#endif /* CONFIG_TOUCHSCREEN_ADS7846 */
105
106
void __init pdm360ng_init(void)
107
{
108
mpc512x_init();
109
pdm360ng_touchscreen_init();
110
}
111
112
static int __init pdm360ng_probe(void)
113
{
114
unsigned long root = of_get_flat_dt_root();
115
116
return of_flat_dt_is_compatible(root, "ifm,pdm360ng");
117
}
118
119
define_machine(pdm360ng) {
120
.name = "PDM360NG",
121
.probe = pdm360ng_probe,
122
.setup_arch = mpc512x_setup_diu,
123
.init = pdm360ng_init,
124
.init_early = mpc512x_init_diu,
125
.init_IRQ = mpc512x_init_IRQ,
126
.get_irq = ipic_get_irq,
127
.calibrate_decr = generic_calibrate_decr,
128
.restart = mpc512x_restart,
129
};
130
131