mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-26 00:21:17 +00:00
ARM: device tree work
Most of these patches convert code from using static platform data to describing the hardware in the device tree. This is only the first half of the changes for v3.4 because a lot of patches for this topic came in the last week before the merge window. Signed-off-by: Arnd Bergmann <arnd@arndb.de> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIVAwUAT24/a2CrR//JCVInAQKYdxAAn+fs7yv+P4OWG/nIhGdnPw8MQ2u9fvqA pmNL3Jy0eVowbENDcRRZgfhZ3ZlWBGUYym7J1uiFSrmHyJPoMtMvVg0miPYxLlpE vr8bzuSfGOUOa7+Fk6kFVGxS3ZHZTsDvuhMQUIt/2jHgOaesqPvZ1FYFAj1bZ1fm 2CnQoF3OfnWAngHtoBXtgJxp/1r7+pHlGVbPYpmtHtikl45NmhqWza58aSQBilr+ S90cVeZs91gyveoxz5N+YrO8+Dx05te3mF+dwWuKC6aDC6d76fjLak54AvYv2Pzr I6iaQPV8GIsXi5R4wptmVQAc5mbk5oktxJ7hCIHrmaBiAXygoVAYoqcuumoO3QDb QKz10ga1yBYcKYrKvBzKxQrChw53IPU6po+Dd66ALJvLlc3KONksiJs5T/5Wma7P v3VPcmZwPrJQbz+fQu6FysHeYQY+wfiR5E9Yz2OXs+PtkSy9OYsFFirdhJeWUPgA ASjNLs1y5rxqrJBt7cjyQiBbIf1awGWyzF0yUNrlYHxmhJ6vcxHfrGoW38VRRCTM 8+JcxOHPRYrPfY7we6zsOn7ZeTWJduoUEeTxDnVS3w3zUIKCvkvkpHaJDvHvYcui T/yJnXdUD2O3E5+5k/5cCyde8RbSB9gKsNpIMNkK5BLSmbux3C72dE0sMQFysahI hS8aDCDUQUU= =fMC+ -----END PGP SIGNATURE----- Merge tag 'dt' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc Pull "ARM: device tree work" from Arnd Bergmann: "Most of these patches convert code from using static platform data to describing the hardware in the device tree. This is only the first half of the changes for v3.4 because a lot of patches for this topic came in the last week before the merge window. Signed-off-by: Arnd Bergmann <arnd@arndb.de>" Fix up trivial conflicts in arch/arm/mach-vexpress/{Kconfig,core.h} * tag 'dt' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (86 commits) Document: devicetree: add OF documents for arch-mmp ARM: dts: append DTS file of pxa168 ARM: mmp: append OF support on pxa168 ARM: mmp: enable rtc clk in pxa168 i2c: pxa: add OF support serial: pxa: add OF support arm/dts: mt_ventoux: very basic support for TeeJet Mt.Ventoux board ARM: OMAP2+: Remove extra ifdefs for board-generic ARM: OMAP2+: Fix build error when only ARCH_OMAP2/3 or 4 is selected ASoC: DT: Add digital microphone binding to PAZ00 board. ARM: dt: Add ARM PMU to tegra*.dtsi ARM: at91: at91sam9x5cm/dt: add leds support ARM: at91: usb_a9g20/dt: add gpio-keys support ARM: at91: at91sam9m10g45ek/dt: add gpio-keys support ARM: at91: at91sam9m10g45ek/dt: add leds support ARM: at91: usb_a9g20/dt: add leds support ARM: at91/pio: add new PIO3 features ARM: at91: add sam9_smc.o to at91sam9x5 build ARM: at91/tc/clocksource: Add 32 bit variant to Timer Counter ARM: at91/tc: add device tree support to atmel_tclib ...
This commit is contained in:
commit
66f03c614c
147 changed files with 5060 additions and 1080 deletions
|
@ -57,6 +57,7 @@ struct sam9_rtc {
|
|||
void __iomem *rtt;
|
||||
struct rtc_device *rtcdev;
|
||||
u32 imr;
|
||||
void __iomem *gpbr;
|
||||
};
|
||||
|
||||
#define rtt_readl(rtc, field) \
|
||||
|
@ -65,9 +66,9 @@ struct sam9_rtc {
|
|||
__raw_writel((val), (rtc)->rtt + AT91_RTT_ ## field)
|
||||
|
||||
#define gpbr_readl(rtc) \
|
||||
at91_sys_read(AT91_GPBR + 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR)
|
||||
__raw_readl((rtc)->gpbr)
|
||||
#define gpbr_writel(rtc, val) \
|
||||
at91_sys_write(AT91_GPBR + 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR, (val))
|
||||
__raw_writel((val), (rtc)->gpbr)
|
||||
|
||||
/*
|
||||
* Read current time and date in RTC
|
||||
|
@ -287,16 +288,19 @@ static const struct rtc_class_ops at91_rtc_ops = {
|
|||
/*
|
||||
* Initialize and install RTC driver
|
||||
*/
|
||||
static int __init at91_rtc_probe(struct platform_device *pdev)
|
||||
static int __devinit at91_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *r;
|
||||
struct resource *r, *r_gpbr;
|
||||
struct sam9_rtc *rtc;
|
||||
int ret;
|
||||
u32 mr;
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!r)
|
||||
r_gpbr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
if (!r || !r_gpbr) {
|
||||
dev_err(&pdev->dev, "need 2 ressources\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
rtc = kzalloc(sizeof *rtc, GFP_KERNEL);
|
||||
if (!rtc)
|
||||
|
@ -314,6 +318,13 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
rtc->gpbr = ioremap(r_gpbr->start, resource_size(r_gpbr));
|
||||
if (!rtc->gpbr) {
|
||||
dev_err(&pdev->dev, "failed to map gpbr registers, aborting.\n");
|
||||
ret = -ENOMEM;
|
||||
goto fail_gpbr;
|
||||
}
|
||||
|
||||
mr = rtt_readl(rtc, MR);
|
||||
|
||||
/* unless RTT is counting at 1 Hz, re-initialize it */
|
||||
|
@ -340,7 +351,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
|
|||
if (ret) {
|
||||
dev_dbg(&pdev->dev, "can't share IRQ %d?\n", AT91_ID_SYS);
|
||||
rtc_device_unregister(rtc->rtcdev);
|
||||
goto fail;
|
||||
goto fail_register;
|
||||
}
|
||||
|
||||
/* NOTE: sam9260 rev A silicon has a ROM bug which resets the
|
||||
|
@ -356,6 +367,8 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
|
||||
fail_register:
|
||||
iounmap(rtc->gpbr);
|
||||
fail_gpbr:
|
||||
iounmap(rtc->rtt);
|
||||
fail:
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
@ -366,7 +379,7 @@ fail:
|
|||
/*
|
||||
* Disable and remove the RTC driver
|
||||
*/
|
||||
static int __exit at91_rtc_remove(struct platform_device *pdev)
|
||||
static int __devexit at91_rtc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct sam9_rtc *rtc = platform_get_drvdata(pdev);
|
||||
u32 mr = rtt_readl(rtc, MR);
|
||||
|
@ -377,6 +390,7 @@ static int __exit at91_rtc_remove(struct platform_device *pdev)
|
|||
|
||||
rtc_device_unregister(rtc->rtcdev);
|
||||
|
||||
iounmap(rtc->gpbr);
|
||||
iounmap(rtc->rtt);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
kfree(rtc);
|
||||
|
@ -440,63 +454,20 @@ static int at91_rtc_resume(struct platform_device *pdev)
|
|||
#endif
|
||||
|
||||
static struct platform_driver at91_rtc_driver = {
|
||||
.driver.name = "rtc-at91sam9",
|
||||
.driver.owner = THIS_MODULE,
|
||||
.remove = __exit_p(at91_rtc_remove),
|
||||
.probe = at91_rtc_probe,
|
||||
.remove = __devexit_p(at91_rtc_remove),
|
||||
.shutdown = at91_rtc_shutdown,
|
||||
.suspend = at91_rtc_suspend,
|
||||
.resume = at91_rtc_resume,
|
||||
.driver = {
|
||||
.name = "rtc-at91sam9",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
/* Chips can have more than one RTT module, and they can be used for more
|
||||
* than just RTCs. So we can't just register as "the" RTT driver.
|
||||
*
|
||||
* A normal approach in such cases is to create a library to allocate and
|
||||
* free the modules. Here we just use bus_find_device() as like such a
|
||||
* library, binding directly ... no runtime "library" footprint is needed.
|
||||
*/
|
||||
static int __init at91_rtc_match(struct device *dev, void *v)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
int ret;
|
||||
|
||||
/* continue searching if this isn't the RTT we need */
|
||||
if (strcmp("at91_rtt", pdev->name) != 0
|
||||
|| pdev->id != CONFIG_RTC_DRV_AT91SAM9_RTT)
|
||||
goto fail;
|
||||
|
||||
/* else we found it ... but fail unless we can bind to the RTC driver */
|
||||
if (dev->driver) {
|
||||
dev_dbg(dev, "busy, can't use as RTC!\n");
|
||||
goto fail;
|
||||
}
|
||||
dev->driver = &at91_rtc_driver.driver;
|
||||
if (device_attach(dev) == 0) {
|
||||
dev_dbg(dev, "can't attach RTC!\n");
|
||||
goto fail;
|
||||
}
|
||||
ret = at91_rtc_probe(pdev);
|
||||
if (ret == 0)
|
||||
return true;
|
||||
|
||||
dev_dbg(dev, "RTC probe err %d!\n", ret);
|
||||
fail:
|
||||
return false;
|
||||
}
|
||||
|
||||
static int __init at91_rtc_init(void)
|
||||
{
|
||||
int status;
|
||||
struct device *rtc;
|
||||
|
||||
status = platform_driver_register(&at91_rtc_driver);
|
||||
if (status)
|
||||
return status;
|
||||
rtc = bus_find_device(&platform_bus_type, NULL,
|
||||
NULL, at91_rtc_match);
|
||||
if (!rtc)
|
||||
platform_driver_unregister(&at91_rtc_driver);
|
||||
return rtc ? 0 : -ENODEV;
|
||||
return platform_driver_register(&at91_rtc_driver);
|
||||
}
|
||||
module_init(at91_rtc_init);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue