static int mpc5121_rtc_probe()

in rtc-mpc5121.c [307:386]


static int mpc5121_rtc_probe(struct platform_device *op)
{
	struct mpc5121_rtc_data *rtc;
	int err = 0;

	rtc = devm_kzalloc(&op->dev, sizeof(*rtc), GFP_KERNEL);
	if (!rtc)
		return -ENOMEM;

	rtc->regs = devm_platform_ioremap_resource(op, 0);
	if (IS_ERR(rtc->regs)) {
		dev_err(&op->dev, "%s: couldn't map io space\n", __func__);
		return PTR_ERR(rtc->regs);
	}

	device_init_wakeup(&op->dev, 1);

	platform_set_drvdata(op, rtc);

	rtc->irq = irq_of_parse_and_map(op->dev.of_node, 1);
	err = devm_request_irq(&op->dev, rtc->irq, mpc5121_rtc_handler, 0,
			       "mpc5121-rtc", &op->dev);
	if (err) {
		dev_err(&op->dev, "%s: could not request irq: %i\n",
							__func__, rtc->irq);
		goto out_dispose;
	}

	rtc->irq_periodic = irq_of_parse_and_map(op->dev.of_node, 0);
	err = devm_request_irq(&op->dev, rtc->irq_periodic,
			       mpc5121_rtc_handler_upd, 0, "mpc5121-rtc_upd",
			       &op->dev);
	if (err) {
		dev_err(&op->dev, "%s: could not request irq: %i\n",
						__func__, rtc->irq_periodic);
		goto out_dispose2;
	}

	rtc->rtc = devm_rtc_allocate_device(&op->dev);
	if (IS_ERR(rtc->rtc)) {
		err = PTR_ERR(rtc->rtc);
		goto out_dispose2;
	}

	rtc->rtc->ops = &mpc5200_rtc_ops;
	rtc->rtc->uie_unsupported = 1;
	rtc->rtc->range_min = RTC_TIMESTAMP_BEGIN_0000;
	rtc->rtc->range_max = 65733206399ULL; /* 4052-12-31 23:59:59 */

	if (of_device_is_compatible(op->dev.of_node, "fsl,mpc5121-rtc")) {
		u32 ka;
		ka = in_be32(&rtc->regs->keep_alive);
		if (ka & 0x02) {
			dev_warn(&op->dev,
				"mpc5121-rtc: Battery or oscillator failure!\n");
			out_be32(&rtc->regs->keep_alive, ka);
		}
		rtc->rtc->ops = &mpc5121_rtc_ops;
		/*
		 * This is a limitation of the driver that abuses the target
		 * time register, the actual maximum year for the mpc5121 is
		 * also 4052.
		 */
		rtc->rtc->range_min = 0;
		rtc->rtc->range_max = U32_MAX;
	}

	err = devm_rtc_register_device(rtc->rtc);
	if (err)
		goto out_dispose2;

	return 0;

out_dispose2:
	irq_dispose_mapping(rtc->irq_periodic);
out_dispose:
	irq_dispose_mapping(rtc->irq);

	return err;
}