aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-samsung/dev-pwm.c
blob: cda8e47fb275e310d051356f04550fefd38a4a27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* linux/arch/arm/plat-samsung/dev-pwm.c
 *
 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
 *		http://www.samsung.com
 *
 * Copyright (c) 2007 Ben Dooks
 * Copyright (c) 2008 Simtec Electronics
 *	Ben Dooks <ben@simtec.co.uk>, <ben-linux@fluff.org>
 *
 * S3C series device definition for the PWM timer
 *
 * 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.
 */

#include <linux/kernel.h>
#include <linux/platform_device.h>

#include <mach/irqs.h>

#include <plat/devs.h>
#include <mach/gpio.h>

#define TIMER_RESOURCE_SIZE (1)

#define TIMER_RESOURCE(_tmr, _irq)			\
	(struct resource [TIMER_RESOURCE_SIZE]) {	\
		[0] = {					\
			.start	= _irq,			\
			.end	= _irq,			\
			.flags	= IORESOURCE_IRQ	\
		}					\
	}

#define DEFINE_S3C_TIMER(_tmr_no, _irq, _plat_data)		\
	.name       = "s3c24xx-pwm",				\
	.id     = _tmr_no,				\
	.num_resources  = TIMER_RESOURCE_SIZE,		\
	.resource   = TIMER_RESOURCE(_tmr_no, _irq),    \
	.dev        = {					\
		.platform_data  = _plat_data,			\
	}

#define GPD0_0_TOUT		(0x2 << 0)
#ifdef CONFIG_FB_MDNIE_PWM
#define GPD0_1_TOUT		(0x3 << 4)
#else
#define GPD0_1_TOUT		(0x2 << 4)
#endif
#define GPD0_2_TOUT		(0x2 << 8)
#define GPD0_3_TOUT		(0x2 << 12)

/* since we already have an static mapping for the timer, we do not
 * bother setting any IO resource for the base.
 */

struct s3c_pwm_pdata {
	/* PWM output port */
	int gpio_no;
	const char  *gpio_name;
	int gpio_set_value;
};

struct s3c_pwm_pdata pwm_data[] = {
#ifdef CONFIG_ARCH_EXYNOS5
	{
		.gpio_no = EXYNOS5_GPB2(0),
		.gpio_name = "GPB",
		.gpio_set_value = GPD0_0_TOUT,
	}, {
		.gpio_no = EXYNOS5_GPB2(1),
		.gpio_name = "GPB",
		.gpio_set_value = GPD0_1_TOUT,
	}, {
		.gpio_no = EXYNOS5_GPB2(2),
		.gpio_name = "GPB",
		.gpio_set_value = GPD0_2_TOUT,
	}, {
		.gpio_no = EXYNOS5_GPB2(3),
		.gpio_name = "GPB",
		.gpio_set_value = GPD0_3_TOUT,
	}, {
		.gpio_no = 0,
		.gpio_name = NULL,
		.gpio_set_value = 0,
	}
#else
	{
		.gpio_no = EXYNOS4_GPD0(0),
		.gpio_name = "GPD",
		.gpio_set_value = GPD0_0_TOUT,
	}, {
		.gpio_no = EXYNOS4_GPD0(1),
		.gpio_name = "GPD",
		.gpio_set_value = GPD0_1_TOUT,
	}, {
		.gpio_no = EXYNOS4_GPD0(2),
		.gpio_name = "GPD",
		.gpio_set_value = GPD0_2_TOUT,
	}, {
		.gpio_no = EXYNOS4_GPD0(3),
		.gpio_name = "GPD",
		.gpio_set_value = GPD0_3_TOUT,
	}, {
		.gpio_no = 0,
		.gpio_name = NULL,
		.gpio_set_value = 0,
	}
#endif
};

struct platform_device s3c_device_timer[] = {
	[0] = { DEFINE_S3C_TIMER(0, IRQ_TIMER0, &pwm_data[0]) },
	[1] = { DEFINE_S3C_TIMER(1, IRQ_TIMER1, &pwm_data[1]) },
	[2] = { DEFINE_S3C_TIMER(2, IRQ_TIMER2, &pwm_data[2]) },
	[3] = { DEFINE_S3C_TIMER(3, IRQ_TIMER3, &pwm_data[3]) },
	[4] = { DEFINE_S3C_TIMER(4, IRQ_TIMER4, &pwm_data[4]) },
};
EXPORT_SYMBOL(s3c_device_timer);