diff options
| author | Andres Salomon <dilinger@collabora.co.uk> | 2009-12-14 21:00:37 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-15 11:53:28 -0500 |
| commit | 82dca611bb516ec5fb7d04077733d6a4b70f52d1 (patch) | |
| tree | 67e085277bcc06e0aa7bf305e586ce856ef11078 /include/linux | |
| parent | 3c55494670745e523f69b56edb66ca0b50a470c2 (diff) | |
cs5535: add a generic MFGPT driver
This is based on the old code on arch/x86/kernel/mfgpt_32.c, except it's
not x86 specific, it's modular, and it makes use of a PCI BAR rather than
a random MSR. Currently module unloading is not supported; it's uncertain
whether or not it can be made work with the hardware.
[akpm@linux-foundation.org: add X86 dependency]
Signed-off-by: Andres Salomon <dilinger@collabora.co.uk>
Cc: Jordan Crouse <jordan@cosmicpenguin.net>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: john stultz <johnstul@us.ibm.com>
Cc: Chris Ball <cjb@laptop.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/cs5535.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/include/linux/cs5535.h b/include/linux/cs5535.h index cfea689dfa34..30ecb04fa570 100644 --- a/include/linux/cs5535.h +++ b/include/linux/cs5535.h | |||
| @@ -18,6 +18,16 @@ | |||
| 18 | #define MSR_LBAR_ACPI 0x5140000E | 18 | #define MSR_LBAR_ACPI 0x5140000E |
| 19 | #define MSR_LBAR_PMS 0x5140000F | 19 | #define MSR_LBAR_PMS 0x5140000F |
| 20 | 20 | ||
| 21 | #define MSR_PIC_YSEL_LOW 0x51400020 | ||
| 22 | #define MSR_PIC_YSEL_HIGH 0x51400021 | ||
| 23 | #define MSR_PIC_ZSEL_LOW 0x51400022 | ||
| 24 | #define MSR_PIC_ZSEL_HIGH 0x51400023 | ||
| 25 | #define MSR_PIC_IRQM_LPC 0x51400025 | ||
| 26 | |||
| 27 | #define MSR_MFGPT_IRQ 0x51400028 | ||
| 28 | #define MSR_MFGPT_NR 0x51400029 | ||
| 29 | #define MSR_MFGPT_SETUP 0x5140002B | ||
| 30 | |||
| 21 | /* resource sizes */ | 31 | /* resource sizes */ |
| 22 | #define LBAR_GPIO_SIZE 0xFF | 32 | #define LBAR_GPIO_SIZE 0xFF |
| 23 | #define LBAR_MFGPT_SIZE 0x40 | 33 | #define LBAR_MFGPT_SIZE 0x40 |
| @@ -55,4 +65,61 @@ void cs5535_gpio_set(unsigned offset, unsigned int reg); | |||
| 55 | void cs5535_gpio_clear(unsigned offset, unsigned int reg); | 65 | void cs5535_gpio_clear(unsigned offset, unsigned int reg); |
| 56 | int cs5535_gpio_isset(unsigned offset, unsigned int reg); | 66 | int cs5535_gpio_isset(unsigned offset, unsigned int reg); |
| 57 | 67 | ||
| 68 | /* MFGPTs */ | ||
| 69 | |||
| 70 | #define MFGPT_MAX_TIMERS 8 | ||
| 71 | #define MFGPT_TIMER_ANY (-1) | ||
| 72 | |||
| 73 | #define MFGPT_DOMAIN_WORKING 1 | ||
| 74 | #define MFGPT_DOMAIN_STANDBY 2 | ||
| 75 | #define MFGPT_DOMAIN_ANY (MFGPT_DOMAIN_WORKING | MFGPT_DOMAIN_STANDBY) | ||
| 76 | |||
| 77 | #define MFGPT_CMP1 0 | ||
| 78 | #define MFGPT_CMP2 1 | ||
| 79 | |||
| 80 | #define MFGPT_EVENT_IRQ 0 | ||
| 81 | #define MFGPT_EVENT_NMI 1 | ||
| 82 | #define MFGPT_EVENT_RESET 3 | ||
| 83 | |||
| 84 | #define MFGPT_REG_CMP1 0 | ||
| 85 | #define MFGPT_REG_CMP2 2 | ||
| 86 | #define MFGPT_REG_COUNTER 4 | ||
| 87 | #define MFGPT_REG_SETUP 6 | ||
| 88 | |||
| 89 | #define MFGPT_SETUP_CNTEN (1 << 15) | ||
| 90 | #define MFGPT_SETUP_CMP2 (1 << 14) | ||
| 91 | #define MFGPT_SETUP_CMP1 (1 << 13) | ||
| 92 | #define MFGPT_SETUP_SETUP (1 << 12) | ||
| 93 | #define MFGPT_SETUP_STOPEN (1 << 11) | ||
| 94 | #define MFGPT_SETUP_EXTEN (1 << 10) | ||
| 95 | #define MFGPT_SETUP_REVEN (1 << 5) | ||
| 96 | #define MFGPT_SETUP_CLKSEL (1 << 4) | ||
| 97 | |||
| 98 | struct cs5535_mfgpt_timer; | ||
| 99 | |||
| 100 | extern uint16_t cs5535_mfgpt_read(struct cs5535_mfgpt_timer *timer, | ||
| 101 | uint16_t reg); | ||
| 102 | extern void cs5535_mfgpt_write(struct cs5535_mfgpt_timer *timer, uint16_t reg, | ||
| 103 | uint16_t value); | ||
| 104 | |||
| 105 | extern int cs5535_mfgpt_toggle_event(struct cs5535_mfgpt_timer *timer, int cmp, | ||
| 106 | int event, int enable); | ||
| 107 | extern int cs5535_mfgpt_set_irq(struct cs5535_mfgpt_timer *timer, int cmp, | ||
| 108 | int *irq, int enable); | ||
| 109 | extern struct cs5535_mfgpt_timer *cs5535_mfgpt_alloc_timer(int timer, | ||
| 110 | int domain); | ||
| 111 | extern void cs5535_mfgpt_free_timer(struct cs5535_mfgpt_timer *timer); | ||
| 112 | |||
| 113 | static inline int cs5535_mfgpt_setup_irq(struct cs5535_mfgpt_timer *timer, | ||
| 114 | int cmp, int *irq) | ||
| 115 | { | ||
| 116 | return cs5535_mfgpt_set_irq(timer, cmp, irq, 1); | ||
| 117 | } | ||
| 118 | |||
| 119 | static inline int cs5535_mfgpt_release_irq(struct cs5535_mfgpt_timer *timer, | ||
| 120 | int cmp, int *irq) | ||
| 121 | { | ||
| 122 | return cs5535_mfgpt_set_irq(timer, cmp, irq, 0); | ||
| 123 | } | ||
| 124 | |||
| 58 | #endif | 125 | #endif |
