-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 42592 b: refs/heads/master c: 9daa0c2 h: refs/heads/master v: v3
- Loading branch information
Paul Mundt
committed
Dec 6, 2006
1 parent
884998a
commit 9610e08
Showing
3 changed files
with
126 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 9f5e8eee5cfe1328660c71812d87c2a67bda389f | ||
refs/heads/master: 9daa0c257d6c200b58092e0bfc32b77c4618a8af |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
/* | ||
* arch/sh/boards/renesas/r7780rp/psw.c | ||
* | ||
* push switch support for RDBRP-1/RDBREVRP-1 debug boards. | ||
* | ||
* Copyright (C) 2006 Paul Mundt | ||
* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
*/ | ||
#include <linux/io.h> | ||
#include <linux/init.h> | ||
#include <linux/interrupt.h> | ||
#include <linux/platform_device.h> | ||
#include <asm/mach/r7780rp.h> | ||
#include <asm/push-switch.h> | ||
|
||
static irqreturn_t psw_irq_handler(int irq, void *arg) | ||
{ | ||
struct platform_device *pdev = arg; | ||
struct push_switch *psw = platform_get_drvdata(pdev); | ||
struct push_switch_platform_info *psw_info = pdev->dev.platform_data; | ||
unsigned int l, mask; | ||
int ret = 0; | ||
|
||
l = ctrl_inw(PA_DBSW); | ||
|
||
/* Nothing to do if there's no state change */ | ||
if (psw->state) { | ||
ret = 1; | ||
goto out; | ||
} | ||
|
||
mask = l & 0x70; | ||
/* Figure out who raised it */ | ||
if (mask & (1 << psw_info->bit)) { | ||
psw->state = !!(mask & (1 << psw_info->bit)); | ||
if (psw->state) /* debounce */ | ||
mod_timer(&psw->debounce, jiffies + 50); | ||
|
||
ret = 1; | ||
} | ||
|
||
out: | ||
/* Clear the switch IRQs */ | ||
l |= (0x7 << 12); | ||
ctrl_outw(l, PA_DBSW); | ||
|
||
return IRQ_RETVAL(ret); | ||
} | ||
|
||
static struct resource psw_resources[] = { | ||
[0] = { | ||
.start = IRQ_PSW, | ||
.flags = IORESOURCE_IRQ, | ||
}, | ||
}; | ||
|
||
static struct push_switch_platform_info s2_platform_data = { | ||
.name = "s2", | ||
.bit = 6, | ||
.irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | | ||
IRQF_SHARED, | ||
.irq_handler = psw_irq_handler, | ||
}; | ||
|
||
static struct platform_device s2_switch_device = { | ||
.name = "push-switch", | ||
.id = 0, | ||
.num_resources = ARRAY_SIZE(psw_resources), | ||
.resource = psw_resources, | ||
.dev = { | ||
.platform_data = &s2_platform_data, | ||
}, | ||
}; | ||
|
||
static struct push_switch_platform_info s3_platform_data = { | ||
.name = "s3", | ||
.bit = 5, | ||
.irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | | ||
IRQF_SHARED, | ||
.irq_handler = psw_irq_handler, | ||
}; | ||
|
||
static struct platform_device s3_switch_device = { | ||
.name = "push-switch", | ||
.id = 1, | ||
.num_resources = ARRAY_SIZE(psw_resources), | ||
.resource = psw_resources, | ||
.dev = { | ||
.platform_data = &s3_platform_data, | ||
}, | ||
}; | ||
|
||
static struct push_switch_platform_info s4_platform_data = { | ||
.name = "s4", | ||
.bit = 4, | ||
.irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | | ||
IRQF_SHARED, | ||
.irq_handler = psw_irq_handler, | ||
}; | ||
|
||
static struct platform_device s4_switch_device = { | ||
.name = "push-switch", | ||
.id = 2, | ||
.num_resources = ARRAY_SIZE(psw_resources), | ||
.resource = psw_resources, | ||
.dev = { | ||
.platform_data = &s4_platform_data, | ||
}, | ||
}; | ||
|
||
static struct platform_device *psw_devices[] = { | ||
&s2_switch_device, &s3_switch_device, &s4_switch_device, | ||
}; | ||
|
||
static int __init psw_init(void) | ||
{ | ||
return platform_add_devices(psw_devices, ARRAY_SIZE(psw_devices)); | ||
} | ||
module_init(psw_init); |