diff --git a/arch/arm/boot/dts/at91-foxg20.dts b/arch/arm/boot/dts/at91-foxg20.dts index cbe9673..29e9dd3 100644 --- a/arch/arm/boot/dts/at91-foxg20.dts +++ b/arch/arm/boot/dts/at91-foxg20.dts @@ -43,13 +43,14 @@ mmc0: mmc@fffa8000 { pinctrl-0 = < &pinctrl_mmc0_clk - &pinctrl_mmc0_slot1_cmd_dat0 + /* &pinctrl_mmc0_slot1_cmd_dat0 */ &pinctrl_mmc0_slot1_dat1_3>; status = "okay"; slot@1 { reg = <1>; bus-width = <4>; + non-removable; }; }; @@ -84,7 +85,7 @@ }; uart1: serial@fffd8000 { - status = "okay"; + /* status = "okay"; */ }; dbgu: serial@fffff200 { @@ -99,6 +100,7 @@ }; }; + /* rubbish. There is no such CD on the FoxG20 */ mmc0_slot1 { pinctrl_board_mmc0_slot1: mmc0_slot1-board { atmel,pins = @@ -115,6 +117,21 @@ }; }; + i2c0: i2c@fffac000 { + /* i2c-at91 driver (silicon based) */ + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_i2c0>; + status = "okay"; + }; + + rtc { + compatible = "atmel,at91sam9260-rtt-rtc"; + /* RTTC followed by GPBR (backup registers) */ + reg = <0xfffffd20 0x10>, <0xfffffd50 0x10>; + interrupts = <1 4 7>; + status = "okay"; + }; + watchdog@fffffd40 { status = "okay"; }; @@ -130,7 +147,7 @@ pinctrl-names = "default"; pinctrl-0 = <&pinctrl_i2c0>; i2c-gpio,delay-us = <5>; /* ~85 kHz */ - status = "okay"; + /* status = "okay"; */ }; leds { diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c index 309b8b3..1d21ea0 100644 --- a/drivers/rtc/rtc-at91sam9.c +++ b/drivers/rtc/rtc-at91sam9.c @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include #include @@ -72,6 +74,18 @@ struct sam9_rtc { #define gpbr_writel(rtc, val) \ __raw_writel((val), (rtc)->gpbr) +#ifdef CONFIG_OF +static const struct of_device_id at91sam9_rtc_dt_ids[] = { + { .compatible = "atmel,at91sam9260-rtt-rtc" }, + /* string above preferred, the following may be taken in the + * future for a more general purpose rtt driver */ + { .compatible = "atmel,at91sam9260-rtt" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, at91sam9_rtc_dt_ids); +#endif /* CONFIG_OF */ + + /* * Read current time and date in RTC */ @@ -324,14 +338,16 @@ static int at91_rtc_probe(struct platform_device *pdev) rtc->rtt = devm_ioremap(&pdev->dev, r->start, resource_size(r)); if (!rtc->rtt) { dev_err(&pdev->dev, "failed to map registers, aborting.\n"); - return -ENOMEM; + ret = -ENOMEM; + goto fail; } rtc->gpbr = devm_ioremap(&pdev->dev, r_gpbr->start, resource_size(r_gpbr)); if (!rtc->gpbr) { dev_err(&pdev->dev, "failed to map gpbr registers, aborting.\n"); - return -ENOMEM; + ret = -ENOMEM; + goto fail; } mr = rtt_readl(rtc, MR); @@ -348,15 +364,17 @@ static int at91_rtc_probe(struct platform_device *pdev) rtc->rtcdev = devm_rtc_device_register(&pdev->dev, pdev->name, &at91_rtc_ops, THIS_MODULE); - if (IS_ERR(rtc->rtcdev)) - return PTR_ERR(rtc->rtcdev); + if (IS_ERR(rtc->rtcdev)) { + ret = PTR_ERR(rtc->rtcdev); + goto fail; + } /* register irq handler after we know what name we'll use */ ret = devm_request_irq(&pdev->dev, rtc->irq, at91_rtc_interrupt, IRQF_SHARED, dev_name(&rtc->rtcdev->dev), rtc); if (ret) { dev_dbg(&pdev->dev, "can't share IRQ %d?\n", rtc->irq); - return ret; + goto fail; } /* NOTE: sam9260 rev A silicon has a ROM bug which resets the @@ -370,6 +388,10 @@ static int at91_rtc_probe(struct platform_device *pdev) dev_name(&rtc->rtcdev->dev)); return 0; + +fail: + platform_set_drvdata(pdev, NULL); + return ret; } /* @@ -383,6 +405,7 @@ static int at91_rtc_remove(struct platform_device *pdev) /* disable all interrupts */ rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN)); + platform_set_drvdata(pdev, NULL); return 0; } @@ -447,6 +470,7 @@ static struct platform_driver at91_rtc_driver = { .driver = { .name = "rtc-at91sam9", .owner = THIS_MODULE, + .of_match_table = of_match_ptr(at91sam9_rtc_dt_ids), .pm = &at91_rtc_pm_ops, }, };