Commit 82dca611 authored by Andres Salomon's avatar Andres Salomon Committed by Linus Torvalds

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: default avatarAndres 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 3c554946
...@@ -47,16 +47,6 @@ extern int geode_get_dev_base(unsigned int dev); ...@@ -47,16 +47,6 @@ extern int geode_get_dev_base(unsigned int dev);
#define MSR_DIVIL_SOFT_RESET 0x51400017 #define MSR_DIVIL_SOFT_RESET 0x51400017
#define MSR_PIC_YSEL_LOW 0x51400020
#define MSR_PIC_YSEL_HIGH 0x51400021
#define MSR_PIC_ZSEL_LOW 0x51400022
#define MSR_PIC_ZSEL_HIGH 0x51400023
#define MSR_PIC_IRQM_LPC 0x51400025
#define MSR_MFGPT_IRQ 0x51400028
#define MSR_MFGPT_NR 0x51400029
#define MSR_MFGPT_SETUP 0x5140002B
#define MSR_LX_SPARE_MSR 0x80000011 /* DC-specific */ #define MSR_LX_SPARE_MSR 0x80000011 /* DC-specific */
#define MSR_GX_GLD_MSR_CONFIG 0xC0002001 #define MSR_GX_GLD_MSR_CONFIG 0xC0002001
...@@ -169,36 +159,6 @@ static inline int geode_has_vsa2(void) ...@@ -169,36 +159,6 @@ static inline int geode_has_vsa2(void)
} }
#endif #endif
/* MFGPTs */
#define MFGPT_MAX_TIMERS 8
#define MFGPT_TIMER_ANY (-1)
#define MFGPT_DOMAIN_WORKING 1
#define MFGPT_DOMAIN_STANDBY 2
#define MFGPT_DOMAIN_ANY (MFGPT_DOMAIN_WORKING | MFGPT_DOMAIN_STANDBY)
#define MFGPT_CMP1 0
#define MFGPT_CMP2 1
#define MFGPT_EVENT_IRQ 0
#define MFGPT_EVENT_NMI 1
#define MFGPT_EVENT_RESET 3
#define MFGPT_REG_CMP1 0
#define MFGPT_REG_CMP2 2
#define MFGPT_REG_COUNTER 4
#define MFGPT_REG_SETUP 6
#define MFGPT_SETUP_CNTEN (1 << 15)
#define MFGPT_SETUP_CMP2 (1 << 14)
#define MFGPT_SETUP_CMP1 (1 << 13)
#define MFGPT_SETUP_SETUP (1 << 12)
#define MFGPT_SETUP_STOPEN (1 << 11)
#define MFGPT_SETUP_EXTEN (1 << 10)
#define MFGPT_SETUP_REVEN (1 << 5)
#define MFGPT_SETUP_CLKSEL (1 << 4)
static inline void geode_mfgpt_write(int timer, u16 reg, u16 value) static inline void geode_mfgpt_write(int timer, u16 reg, u16 value)
{ {
u32 base = geode_get_dev_base(GEODE_DEV_MFGPT); u32 base = geode_get_dev_base(GEODE_DEV_MFGPT);
......
...@@ -187,6 +187,30 @@ config SGI_XP ...@@ -187,6 +187,30 @@ config SGI_XP
this feature will allow for direct communication between SSIs this feature will allow for direct communication between SSIs
based on a network adapter and DMA messaging. based on a network adapter and DMA messaging.
config CS5535_MFGPT
tristate "CS5535/CS5536 Geode Multi-Function General Purpose Timer (MFGPT) support"
depends on PCI && !MGEODE_LX
depends on X86
default n
help
This driver provides access to MFGPT functionality for other
drivers that need timers. MFGPTs are available in the CS5535 and
CS5536 companion chips that are found in AMD Geode and several
other platforms. They have a better resolution and max interval
than the generic PIT, and are suitable for use as high-res timers.
You probably don't want to enable this manually; other drivers that
make use of it should enable it.
config CS5535_MFGPT_DEFAULT_IRQ
int
default 7
help
MFGPTs on the CS5535 require an interrupt. The selected IRQ
can be overridden as a module option as well as by driver that
use the cs5535_mfgpt_ API; however, different architectures might
want to use a different IRQ by default. This is here for
architectures to set as necessary.
config HP_ILO config HP_ILO
tristate "Channel interface driver for HP iLO/iLO2 processor" tristate "Channel interface driver for HP iLO/iLO2 processor"
depends on PCI depends on PCI
......
...@@ -18,6 +18,7 @@ obj-$(CONFIG_ENCLOSURE_SERVICES) += enclosure.o ...@@ -18,6 +18,7 @@ obj-$(CONFIG_ENCLOSURE_SERVICES) += enclosure.o
obj-$(CONFIG_KGDB_TESTS) += kgdbts.o obj-$(CONFIG_KGDB_TESTS) += kgdbts.o
obj-$(CONFIG_SGI_XP) += sgi-xp/ obj-$(CONFIG_SGI_XP) += sgi-xp/
obj-$(CONFIG_SGI_GRU) += sgi-gru/ obj-$(CONFIG_SGI_GRU) += sgi-gru/
obj-$(CONFIG_CS5535_MFGPT) += cs5535-mfgpt.o
obj-$(CONFIG_HP_ILO) += hpilo.o obj-$(CONFIG_HP_ILO) += hpilo.o
obj-$(CONFIG_ISL29003) += isl29003.o obj-$(CONFIG_ISL29003) += isl29003.o
obj-$(CONFIG_EP93XX_PWM) += ep93xx_pwm.o obj-$(CONFIG_EP93XX_PWM) += ep93xx_pwm.o
......
This diff is collapsed.
...@@ -18,6 +18,16 @@ ...@@ -18,6 +18,16 @@
#define MSR_LBAR_ACPI 0x5140000E #define MSR_LBAR_ACPI 0x5140000E
#define MSR_LBAR_PMS 0x5140000F #define MSR_LBAR_PMS 0x5140000F
#define MSR_PIC_YSEL_LOW 0x51400020
#define MSR_PIC_YSEL_HIGH 0x51400021
#define MSR_PIC_ZSEL_LOW 0x51400022
#define MSR_PIC_ZSEL_HIGH 0x51400023
#define MSR_PIC_IRQM_LPC 0x51400025
#define MSR_MFGPT_IRQ 0x51400028
#define MSR_MFGPT_NR 0x51400029
#define MSR_MFGPT_SETUP 0x5140002B
/* resource sizes */ /* resource sizes */
#define LBAR_GPIO_SIZE 0xFF #define LBAR_GPIO_SIZE 0xFF
#define LBAR_MFGPT_SIZE 0x40 #define LBAR_MFGPT_SIZE 0x40
...@@ -55,4 +65,61 @@ void cs5535_gpio_set(unsigned offset, unsigned int reg); ...@@ -55,4 +65,61 @@ void cs5535_gpio_set(unsigned offset, unsigned int reg);
void cs5535_gpio_clear(unsigned offset, unsigned int reg); void cs5535_gpio_clear(unsigned offset, unsigned int reg);
int cs5535_gpio_isset(unsigned offset, unsigned int reg); int cs5535_gpio_isset(unsigned offset, unsigned int reg);
/* MFGPTs */
#define MFGPT_MAX_TIMERS 8
#define MFGPT_TIMER_ANY (-1)
#define MFGPT_DOMAIN_WORKING 1
#define MFGPT_DOMAIN_STANDBY 2
#define MFGPT_DOMAIN_ANY (MFGPT_DOMAIN_WORKING | MFGPT_DOMAIN_STANDBY)
#define MFGPT_CMP1 0
#define MFGPT_CMP2 1
#define MFGPT_EVENT_IRQ 0
#define MFGPT_EVENT_NMI 1
#define MFGPT_EVENT_RESET 3
#define MFGPT_REG_CMP1 0
#define MFGPT_REG_CMP2 2
#define MFGPT_REG_COUNTER 4
#define MFGPT_REG_SETUP 6
#define MFGPT_SETUP_CNTEN (1 << 15)
#define MFGPT_SETUP_CMP2 (1 << 14)
#define MFGPT_SETUP_CMP1 (1 << 13)
#define MFGPT_SETUP_SETUP (1 << 12)
#define MFGPT_SETUP_STOPEN (1 << 11)
#define MFGPT_SETUP_EXTEN (1 << 10)
#define MFGPT_SETUP_REVEN (1 << 5)
#define MFGPT_SETUP_CLKSEL (1 << 4)
struct cs5535_mfgpt_timer;
extern uint16_t cs5535_mfgpt_read(struct cs5535_mfgpt_timer *timer,
uint16_t reg);
extern void cs5535_mfgpt_write(struct cs5535_mfgpt_timer *timer, uint16_t reg,
uint16_t value);
extern int cs5535_mfgpt_toggle_event(struct cs5535_mfgpt_timer *timer, int cmp,
int event, int enable);
extern int cs5535_mfgpt_set_irq(struct cs5535_mfgpt_timer *timer, int cmp,
int *irq, int enable);
extern struct cs5535_mfgpt_timer *cs5535_mfgpt_alloc_timer(int timer,
int domain);
extern void cs5535_mfgpt_free_timer(struct cs5535_mfgpt_timer *timer);
static inline int cs5535_mfgpt_setup_irq(struct cs5535_mfgpt_timer *timer,
int cmp, int *irq)
{
return cs5535_mfgpt_set_irq(timer, cmp, irq, 1);
}
static inline int cs5535_mfgpt_release_irq(struct cs5535_mfgpt_timer *timer,
int cmp, int *irq)
{
return cs5535_mfgpt_set_irq(timer, cmp, irq, 0);
}
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment