arch/powerpc/sysdev/rtc_cmos_setup.c

Source file repositories/reference/linux-study-clean/arch/powerpc/sysdev/rtc_cmos_setup.c

File Facts

System
Linux kernel
Corpus path
arch/powerpc/sysdev/rtc_cmos_setup.c
Extension
.c
Size
1645 bytes
Lines
71
Domain
Architecture Layer
Bucket
arch/powerpc
Inferred role
Architecture Layer: implementation source
Status
source implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

#include <linux/platform_device.h>
#include <linux/err.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mc146818rtc.h>
#include <linux/of_address.h>


static int  __init add_rtc(void)
{
	struct device_node *np;
	struct platform_device *pd;
	struct resource res[2];
	unsigned int num_res = 1;
	int ret;

	memset(&res, 0, sizeof(res));

	np = of_find_compatible_node(NULL, NULL, "pnpPNP,b00");
	if (!np)
		return -ENODEV;

	ret = of_address_to_resource(np, 0, &res[0]);
	of_node_put(np);
	if (ret)
		return ret;

	/*
	 * RTC_PORT(x) is hardcoded in asm/mc146818rtc.h.  Verify that the
	 * address provided by the device node matches.
	 */
	if (res[0].start != RTC_PORT(0))
		return -EINVAL;

	np = of_find_compatible_node(NULL, NULL, "chrp,iic");
	if (!np)
		np = of_find_compatible_node(NULL, NULL, "pnpPNP,000");
	if (np) {
		of_node_put(np);
		/*
		 * Use a fixed interrupt value of 8 since on PPC if we are
		 * using this its off an i8259 which we ensure has interrupt
		 * numbers 0..15.
		 */
		res[1].start = 8;
		res[1].end = 8;
		res[1].flags = IORESOURCE_IRQ;
		num_res++;
	}

	pd = platform_device_register_simple("rtc_cmos", -1,
					     &res[0], num_res);

	return PTR_ERR_OR_ZERO(pd);
}
fs_initcall(add_rtc);

MODULE_DESCRIPTION("PPC RTC CMOS driver");
MODULE_LICENSE("GPL");

Annotation

Implementation Notes