Message ID | 1364573029-19346-1-git-send-email-jhovold@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Mar 29, 2013 at 05:03:46PM +0100, Johan Hovold wrote: > Add device tree support. > --- > drivers/rtc/rtc-at91rm9200.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c > index 5bae0a1..67260f9 100644 > --- a/drivers/rtc/rtc-at91rm9200.c > +++ b/drivers/rtc/rtc-at91rm9200.c > @@ -28,6 +28,7 @@ > #include <linux/ioctl.h> > #include <linux/completion.h> > #include <linux/io.h> > +#include <linux/of.h> > > #include <asm/uaccess.h> > > @@ -255,9 +256,30 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id) > static const struct at91_rtc_config at91rm9200_config = { > }; > > +#if defined(CONFIG_OF) > +static const struct of_device_id at91_rtc_dt_ids[] = { > + { > + .compatible = "atmel,at91rm9200-rtc", > + .data = &at91rm9200_config, >+ }, There's a missing brace here. Will fix after any further feedback. > + /* terminator */ > + } > +}; > +MODULE_DEVICE_TABLE(of, at91_rtc_dt_ids); > +#endif
On 13-03-29 12:03 PM, Johan Hovold wrote: > Add support for the at91sam9x5-family which must use the shadow > interrupt mask due to a hardware issue. > --- > drivers/rtc/rtc-at91rm9200.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c > index 2921866..f3e351f 100644 > --- a/drivers/rtc/rtc-at91rm9200.c > +++ b/drivers/rtc/rtc-at91rm9200.c > @@ -318,12 +318,20 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id) > static const struct at91_rtc_config at91rm9200_config = { > }; > > +static const struct at91_rtc_config at91sam9x5_config = { > + .use_shadow_imr = true, > +}; > + > #if defined(CONFIG_OF) > static const struct of_device_id at91_rtc_dt_ids[] = { > { > .compatible = "atmel,at91rm9200-rtc", > .data = &at91rm9200_config, > }, > + { > + .compatible = "atmel,at91sam9x5-rtc", > + .data = &at91sam9x5_config, > + }, > /* terminator */ > } > }; > Johan, Looks good. Plus add something like this to at91sam9x5.dtsi after the i2c@2 entry (at the end): rtc { compatible = "atmel,at91sam9x5-rtc"; reg = <0xfffffeb0 0x40>; interrupts = <1 4 7>; status = "disabled"; }; and an "enabler" in ariag25.dts (and perhaps other members of the 9x5 sub-family), also at the end: rtc { status = "okay"; }; My patches are in Robert Nelson's tree at: http://www.eewiki.net/display/linuxonarm/AT91SAM9x5 in the Linux kernel section. My RTC code amounts to the same thing as you are proposing, without the safety code around the IMR shadow. I provide binaries based on that work to Aria G25 users via a google group. No-one has complained about RTC not working. SPI and I2C problems are on-going but gradually being sorted. Hence I know people are using and testing this code, other than me. Doug Gilbert
diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c index 434ebc3..5bae0a1 100644 --- a/drivers/rtc/rtc-at91rm9200.c +++ b/drivers/rtc/rtc-at91rm9200.c @@ -40,6 +40,10 @@ #define AT91_RTC_EPOCH 1900UL /* just like arch/arm/common/rtctime.c */ +struct at91_rtc_config { +}; + +static const struct at91_rtc_config *at91_rtc_config; static DECLARE_COMPLETION(at91_rtc_updated); static unsigned int at91_alarm_year = AT91_RTC_EPOCH; static void __iomem *at91_rtc_regs; @@ -248,6 +252,15 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id) return IRQ_NONE; /* not handled */ } +static const struct at91_rtc_config at91rm9200_config = { +}; + +static const struct at91_rtc_config * +at91_rtc_get_config(struct platform_device *pdev) +{ + return &at91rm9200_config; +} + static const struct rtc_class_ops at91_rtc_ops = { .read_time = at91_rtc_readtime, .set_time = at91_rtc_settime, @@ -266,6 +279,10 @@ static int __init at91_rtc_probe(struct platform_device *pdev) struct resource *regs; int ret = 0; + at91_rtc_config = at91_rtc_get_config(pdev); + if (!at91_rtc_config) + return -ENODEV; + regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!regs) { dev_err(&pdev->dev, "no mmio resource defined\n");