Re: [PATCH 4/11] device driver for DA9052
From: Alessandro Zummo
Date: Thu Jun 24 2010 - 12:28:10 EST
On Thu, 24 Jun 2010 17:39:13 +0200
dd diasemi <dd.diasemi@xxxxxxxxx> wrote:
> Initial submission of RTC control module of the device driver for DA9052
> power management device from Dialog Semiconductor.
>
> Linux Kernel Version: 2.6.34
>
> Signed-off-by: D. Chen <dchen@xxxxxxxxxxx>
Hi.
please read the checklist at http://groups.google.com/group/rtc-linux/web/checklist
you code has wrong style, formatting, an excess of printk,
unuseful comments and the author email is missing from MODULE_AUTHOR.
rtc-lib has some functions that could help you too.
> diff -Naur linux-2.6.34/drivers/mfd/da9052-core.c
> linux-2.6.34_test/drivers/mfd/da9052-core.c
> --- linux-2.6.34/drivers/mfd/da9052-core.c 2010-06-23 19:35:06.000000000
> +0500
> +++ linux-2.6.34_test/drivers/mfd/da9052-core.c 2010-06-23
> 19:48:10.000000000 +0500
> @@ -566,6 +566,9 @@
> if (ret)
> return -EIO;
>
> + /* Add the DA9052 modules */
> + da9052_add_subdevice(da9052, "da9052-rtc");
> +
> /* Initialize ssc cache */
> da9052_init_ssc_cache();
>
> diff -Naur linux-2.6.34/drivers/rtc/Kconfig
> linux-2.6.34_test/drivers/rtc/Kconfig
> --- linux-2.6.34/drivers/rtc/Kconfig 2010-05-17 02:17:36.000000000 +0500
> +++ linux-2.6.34_test/drivers/rtc/Kconfig 2010-06-23 19:46:25.000000000
> +0500
> @@ -888,4 +888,10 @@
> This driver can also be built as a module. If so, the module
> will be called rtc-mpc5121.
>
> +config RTC_DRV_DA9052
> + tristate "Support RTC on Dialog Semiconductor DA9052 PMIC"
> + depends on PMIC_DA9052
> + help
> + Say y here to support the RTC found on
> + Dialog Semiconductor DA9052 PMIC.
> endif # RTC_CLASS
> diff -Naur linux-2.6.34/drivers/rtc/Makefile
> linux-2.6.34_test/drivers/rtc/Makefile
> --- linux-2.6.34/drivers/rtc/Makefile 2010-05-17 02:17:36.000000000
> +0500
> +++ linux-2.6.34_test/drivers/rtc/Makefile 2010-06-23 19:46:15.000000000
> +0500
> @@ -92,3 +92,4 @@
> obj-$(CONFIG_RTC_DRV_WM831X) += rtc-wm831x.o
> obj-$(CONFIG_RTC_DRV_WM8350) += rtc-wm8350.o
> obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o
> +obj-$(CONFIG_RTC_DRV_DA9052) += rtc-da9052.o
> diff -Naur linux-2.6.34/drivers/rtc/rtc-da9052.c
> linux-2.6.34_test/drivers/rtc/rtc-da9052.c
> --- linux-2.6.34/drivers/rtc/rtc-da9052.c 1970-01-01 05:00:00.000000000
> +0500
> +++ linux-2.6.34_test/drivers/rtc/rtc-da9052.c 2010-06-23
> 19:46:39.000000000 +0500
> @@ -0,0 +1,733 @@
> +/*
> + * Copyright(c) 2009 Dialog Semiconductor Ltd.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * rtc-da9052.c: RTC driver for DA9052
> + */
> +
> +#include <linux/platform_device.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/rtc.h>
> +#include <linux/mfd/da9052/da9052.h>
> +#include <linux/mfd/da9052/reg.h>
> +#include <linux/mfd/da9052/rtc.h>
> +
> +#define DRIVER_NAME "da9052-rtc"
> +#define ENABLE 1
> +#define DISABLE 0
> +
> +struct da9052_rtc {
> + struct rtc_device *rtc;
> + struct da9052 *da9052;
> + struct da9052_eh_nb eh_data;
> + unsigned char is_min_alarm; /* Set 1min =1/ 1sec =0 Tick Alarm */
> + unsigned char enable_tick_alarm; /* Tick Alarm enable/disable */
> + unsigned char enable_clk_buffer; /* Clock Buffer enable/disable */
> + unsigned char set_osc_trim_freq; /* Set Oscillator Trim Frequency */
> +};
> +
> +/*
> +* This is needed for doing SSC communication in alarm handler
> +* as we get alarm event notification from DA9052 MFD core
> +*/
> +static struct da9052_rtc *rtc1;
> +
> +void da9052_rtc_alarm_handler(unsigned int event)
> +{
> + struct da9052_ssc_msg msg;
> + unsigned int ret;
> +
> + printk(KERN_INFO "In RTC Event: %d\n", event);
> + /* Alarm event has occured */
> + /* Check the alarm type - TIMER or TICK */
> + msg.addr = DA9052_ALARMMI_REG;
> +
> + da9052_lock(rtc1->da9052);
> + ret = rtc1->da9052->read(rtc1->da9052, &msg);
> + if (ret)
> + return;
> + da9052_unlock(rtc1->da9052);
> +
> + if (msg.data & DA9052_ALARMMI_ALARMTYPE)
> + printk(KERN_INFO "RTC: TIMER ALARM\n");
> + else
> + printk(KERN_INFO "RTC: TICK ALARM\n");
> +}
> +
> +static int da9052_rtc_validate_parameters(struct rtc_time *rtc_tm)
> +{
> + /* Input validation for limits */
> +
> + /*Check for Seconds */
> + if (rtc_tm->tm_sec > DA9052_RTC_SECONDS_LIMIT)
> + return DA9052_RTC_INVALID_SECONDS;
> + /*Check for Minutes */
> + if (rtc_tm->tm_min > DA9052_RTC_MINUTES_LIMIT)
> + return DA9052_RTC_INVALID_MINUTES;
> + /* Check for Hours */
> + if (rtc_tm->tm_hour > DA9052_RTC_HOURS_LIMIT)
> + return DA9052_RTC_INVALID_HOURS;
> + /*Check for Days */
> + if (rtc_tm->tm_mday == 0)
> + return DA9052_RTC_INVALID_DAYS;
> + /*Check for MOnths */
> + if ((rtc_tm->tm_mon > DA9052_RTC_MONTHS_LIMIT) ||
> + (rtc_tm->tm_mon == 0))
> + return DA9052_RTC_INVALID_MONTHS;
> + /*Check for Years */
> + if (rtc_tm->tm_year > DA9052_RTC_YEARS_LIMIT)
> + return DA9052_RTC_INVALID_YEARS;
> +
> + if ((rtc_tm->tm_mon == FEBRUARY)) {
> + /* Check for the leap year */
> + if (((rtc_tm->tm_year % 4 == 0) &&
> + (rtc_tm->tm_year % 100 != 0)) ||
> + (rtc_tm->tm_year % 400 == 0)) {
> + /* Condition satisfying leap year */
> + if (rtc_tm->tm_mday > 29)
> + return DA9052_RTC_INVALID_DAYS;
> + } else if (rtc_tm->tm_mday > 28) {
> + /* Non leap Year Condition */
> + return DA9052_RTC_INVALID_DAYS;
> + }
> + }
> + /* Check for the the months having 30 days */
> + if (((rtc_tm->tm_mon == APRIL) || (rtc_tm->tm_mon == JUNE) ||
> + (rtc_tm->tm_mon == SEPTEMBER) || (rtc_tm->tm_mon == NOVEMBER))
> + && (rtc_tm->tm_mday == 31))
> + return DA9052_RTC_INVALID_DAYS;
> +
> + return 0;
> +}
> +
> +static int da9052_rtc_settime(struct da9052 *da9052, struct rtc_time
> *rtc_tm)
> +{
> +
> + /* SSC data variable for multiple write */
> + struct da9052_ssc_msg msg_arr[6];
> + /* return value of validate param function */
> + int validate_param = 0;
> + /* SSC loop index */
> + unsigned char loop_index = 0;
> + int ret = 0;
> +
> + /* Validate Input Parameters */
> + validate_param = da9052_rtc_validate_parameters(rtc_tm);
> + if (validate_param)
> + return validate_param;
> +
> + /* Set Monitor bit to 1 and seconds value */
> + msg_arr[loop_index].addr = DA9052_COUNTS_REG;
> + msg_arr[loop_index++].data = DA9052_COUNTS_MONITOR | rtc_tm->tm_sec;
> +
> + /* Set the Minutes value */
> + msg_arr[loop_index].addr = DA9052_COUNTMI_REG;
> + msg_arr[loop_index].data = 0;
> + msg_arr[loop_index++].data = rtc_tm->tm_min;
> +
> + /* Form the Hour register value */
> + msg_arr[loop_index].addr = DA9052_COUNTH_REG;
> + msg_arr[loop_index].data = 0;
> + msg_arr[loop_index++].data = rtc_tm->tm_hour;
> +
> + /* Form the Days register value */
> + msg_arr[loop_index].addr = DA9052_COUNTD_REG;
> + msg_arr[loop_index].data = 0;
> + msg_arr[loop_index++].data = rtc_tm->tm_mday;
> +
> + /* Form the Months register value */
> + msg_arr[loop_index].addr = DA9052_COUNTMO_REG;
> + msg_arr[loop_index].data = 0;
> + msg_arr[loop_index++].data = rtc_tm->tm_mon;
> +
> + /* Assign to SSC multi write variable */
> + msg_arr[loop_index].addr = DA9052_COUNTY_REG;
> + msg_arr[loop_index].data = 0;
> + msg_arr[loop_index++].data = rtc_tm->tm_year;
> +
> +
> + /*Perform Multi write Operation */
> + ret = da9052->write_many(da9052, msg_arr, loop_index);
> + if (ret) {
> + printk(KERN_INFO "RTC: SET TIME SSC WRITE FAILED\n");
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +static int da9052_rtc_gettime(struct da9052 *da9052, struct rtc_time
> *rtc_tm)
> +{
> +
> + /* SSC data variable */
> + struct da9052_ssc_msg msg[6];
> + /* SSC array index */
> + unsigned char loop_index = 0;
> +
> + /* Read Seconds value */
> + msg[loop_index].data = 0;
> + msg[loop_index++].addr = DA9052_COUNTS_REG;
> + /* Read Minutes value */
> + msg[loop_index].data = 0;
> + msg[loop_index++].addr = DA9052_COUNTMI_REG;
> + /* Read Hours value */
> + msg[loop_index].data = 0;
> + msg[loop_index++].addr = DA9052_COUNTH_REG;
> + /* Read Days value */
> + msg[loop_index].data = 0;
> + msg[loop_index++].addr = DA9052_COUNTD_REG;
> + /* Read Months value */
> + msg[loop_index].data = 0;
> + msg[loop_index++].addr = DA9052_COUNTMO_REG;
> + /* Read Years value */
> + msg[loop_index].data = 0;
> + msg[loop_index++].addr = DA9052_COUNTY_REG;
> +
> + /* use SSC multi read functionality */
> + if (da9052->read_many(da9052, msg, loop_index))
> + return -EIO;
> +
> + /*Assign Read values */
> + /*Assign Year value */
> + rtc_tm->tm_year = msg[--loop_index].data & DA9052_COUNTY_COUNTYEAR;
> + /*Assign Month value */
> + rtc_tm->tm_mon = msg[--loop_index].data & DA9052_COUNTMO_COUNTMONTH;
> + /*Assign Days value */
> + rtc_tm->tm_mday = msg[--loop_index].data & DA9052_COUNTD_COUNTDAY;
> + /*Assign Hours value */
> + rtc_tm->tm_hour = msg[--loop_index].data & DA9052_COUNTH_COUNTHOUR;
> + /*Assign Minutes value */
> + rtc_tm->tm_min = msg[--loop_index].data & DA9052_COUNTMI_COUNTMIN;
> + /*Assign Seconds value */
> + rtc_tm->tm_sec = msg[--loop_index].data & DA9052_COUNTS_COUNTSEC;
> +
> + return 0;
> +}
> +
> +static int da9052_alarm_gettime(struct da9052 *da9052, struct rtc_time
> *rtc_tm)
> +{
> + struct da9052_ssc_msg msg[5];
> + unsigned char loop_index = 0;
> + int ret = 0;
> +
> + /* Read Minutes value */
> + msg[loop_index].data = 0;
> + msg[loop_index++].addr = DA9052_ALARMMI_REG;
> + /* Read Hours value */
> + msg[loop_index].data = 0;
> + msg[loop_index++].addr = DA9052_ALARMH_REG;
> + /* Read Days value */
> + msg[loop_index].data = 0;
> + msg[loop_index++].addr = DA9052_ALARMD_REG;
> + /* Read Months value */
> + msg[loop_index].data = 0;
> + msg[loop_index++].addr = DA9052_ALARMMO_REG;
> + /* Read Years value */
> + msg[loop_index].data = 0;
> + msg[loop_index++].addr = DA9052_ALARMY_REG;
> +
> + /* use SSC multi read functionality */
> + ret = da9052->read_many(da9052, msg, loop_index);
> + if (ret)
> + return -EIO;
> +
> + /*Assign Read values */
> + /*Assign Year value */
> + rtc_tm->tm_year = msg[--loop_index].data & DA9052_ALARMY_ALARMYEAR;
> + /*Assign Month value */
> + rtc_tm->tm_mon = msg[--loop_index].data & DA9052_ALARMMO_ALARMMONTH;
> + /*Assign Days value */
> + rtc_tm->tm_mday = msg[--loop_index].data & DA9052_ALARMD_ALARMDAY;
> + /*Assign Hours value */
> + rtc_tm->tm_hour = msg[--loop_index].data & DA9052_ALARMH_ALARMHOUR;
> + /*Assign Minutes value */
> + rtc_tm->tm_min = msg[--loop_index].data & DA9052_ALARMMI_ALARMMIN;
> +
> + return 0;
> +}
> +
> +static int da9052_alarm_settime(struct da9052 *da9052, struct rtc_time
> *rtc_tm)
> +{
> + /* SSC data variable for multiple write */
> + struct da9052_ssc_msg msg_arr[5];
> + /* SSC data variable for single read */
> + struct da9052_ssc_msg msg;
> + /* return value of validate param function */
> + int validate_param = 0;
> + /* SSC loop index */
> + unsigned char loop_index = 0;
> + int ret = 0;
> +
> + /* As DA9052 does not support the Seconds Alarm */
> + rtc_tm->tm_sec = 0;
> +
> + /* Validate Input Parameters */
> + validate_param = da9052_rtc_validate_parameters(rtc_tm);
> + if (validate_param)
> + return validate_param;
> +
> + /* Set the Minutes value */
> + /*Read the current register */
> + /* Modify only minute bits */
> + msg.addr = DA9052_ALARMMI_REG;
> + msg.data = 0;
> + ret = da9052->read(da9052, &msg);
> + if (ret)
> + return -EIO;
> +
> + msg.data = msg.data & ~(DA9052_ALARMMI_ALARMMIN);
> + msg.data |= rtc_tm->tm_min;
> + /* Assign the read & updated minutes value to write register arary */
> + msg_arr[loop_index].addr = DA9052_ALARMMI_REG;
> + msg_arr[loop_index].data = 0;
> + msg_arr[loop_index++].data = msg.data;
> +
> + /* Form the Hour register value */
> + msg_arr[loop_index].addr = DA9052_ALARMH_REG;
> + msg_arr[loop_index].data = 0;
> + msg_arr[loop_index++].data = rtc_tm->tm_hour;
> +
> + /* Form the Days register value */
> + msg_arr[loop_index].addr = DA9052_ALARMD_REG;
> + msg_arr[loop_index].data = 0;
> + msg_arr[loop_index++].data = rtc_tm->tm_mday;
> +
> + /* Form the Months register value */
> + msg_arr[loop_index].addr = DA9052_ALARMMO_REG;
> + msg_arr[loop_index].data = 0;
> + msg_arr[loop_index++].data = rtc_tm->tm_mon;
> +
> + /* Form the Year register value */
> + msg.addr = DA9052_ALARMY_REG;
> + msg.data = 0;
> + ret = da9052->read(da9052, &msg);
> + if (ret)
> + return -EIO;
> +
> + msg.data = msg.data & ~(DA9052_ALARMY_ALARMYEAR);
> +
> +
> + msg.data |= rtc_tm->tm_year;
> + /* Assign to SSC multi write variable */
> + msg_arr[loop_index].addr = DA9052_ALARMY_REG;
> + msg_arr[loop_index].data = 0;
> + msg_arr[loop_index++].data = msg.data;
> +
> +
> + /* Perform Multi write Operation */
> + ret = da9052->write_many(da9052, msg_arr, loop_index);
> + if (ret)
> + return -EIO;
> +
> + return 0;
> +}
> +
> +static int da9052_rtc_enable_alarm(struct da9052 *da9052, unsigned char
> flag)
> +{
> + struct da9052_ssc_msg msg;
> + int ret = 0;
> +
> + /* Read ALARM YEAR register */
> + msg.addr = DA9052_ALARMY_REG;
> + da9052_lock(da9052);
> + ret = da9052->read(da9052, &msg);
> + if (ret)
> + return -EIO;
> + da9052_unlock(da9052);
> +
> + if (ENABLE == flag)
> + /* Enable ALARM */
> + msg.data = msg.data | DA9052_ALARMY_ALARMON;
> +
> + else if (DISABLE == flag)
> + /* Disable ALARM */
> + msg.data = msg.data & ~(DA9052_ALARMY_ALARMON);
> +
> + da9052_lock(da9052);
> + ret = da9052->write(da9052, &msg);
> + if (ret)
> + return -EIO;
> + da9052_unlock(da9052);
> +
> + return 0;
> +}
> +
> +
> +static ssize_t da9052_rtc_mask_irq(struct da9052 *da9052)
> + {
> + unsigned char data = 0;
> + ssize_t ret = 0;
> + struct da9052_ssc_msg ssc_msg;
> +
> + /* Populate the SSC message structure */
> + /* range checks on this data shall be performed by SSC */
> + ssc_msg.addr = DA9052_IRQMASKA_REG;
> + ssc_msg.data = 0;
> +
> + da9052_lock(da9052);
> + ret = da9052->read(da9052, &ssc_msg);
> + if (ret) {
> + printk(KERN_INFO "DA9052_RTC:da9052_rtc_mask_irq: \
> + SSC Read failed. \n");
> + da9052_unlock(da9052);
> + return ret;
> + }
> + da9052_unlock(da9052);
> +
> + /*Get the latest IRQ configuration*/
> + data = ret;
> +
> + /* Mask the RTC Alarm interrupt event */
> + ssc_msg.data = data |= DA9052_IRQMASKA_MALRAM;
> + /* Populate the SSC message structure */
> + /* range checks on this data shall be performed by SSC */
> +
> + da9052_lock(da9052);
> + ret = da9052->write(da9052, &ssc_msg);
> + da9052_unlock(da9052);
> +
> + if (ret) {
> + printk(KERN_INFO "DA9052_RTC:da9052_rtc_mask_irq: SSC Write
> failed.\n");
> + da9052_unlock(da9052);
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +
> +static ssize_t da9052_rtc_unmask_irq(struct da9052 *da9052)
> +{
> + unsigned char data = 0;
> + ssize_t ret = 0;
> + struct da9052_ssc_msg ssc_msg;
> +
> + /* Populate the SSC message structure */
> + /* range checks on this data shall be performed by SSC */
> + ssc_msg.addr = DA9052_IRQMASKA_REG;
> + ssc_msg.data = 0;
> +
> + da9052_lock(da9052);
> + ret = da9052->read(da9052, &ssc_msg);
> + if (ret) {
> + printk(KERN_INFO "DA9052_RTC:da9052_rtc_unmask_irq:\
> + SSC Read failed. \n");
> + da9052_unlock(da9052);
> + return ret;
> + }
> + da9052_unlock(da9052);
> +
> + /*Get the latest IRQ configuration*/
> + data = ret;
> +
> + /* UnMask the RTC Alarm interrupt event */
> + ssc_msg.data = data &= ~DA9052_IRQMASKA_MALRAM;
> +
> + da9052_lock(da9052);
> + ret = da9052->write(da9052, &ssc_msg);
> + da9052_unlock(da9052);
> +
> + if (ret) {
> + printk(KERN_INFO "DA9052_RTC:da9052_rtc_unmask_irq: \
> + SSC Write failed. \n");
> + da9052_unlock(da9052);
> + return ret;
> + }
> +
> + return 0;
> +
> +}
> +
> +static int da9052_rtc_class_ops_gettime(struct device *dev, struct
> rtc_time *tm)
> +{
> + int ret;
> + struct da9052_rtc *priv = dev_get_drvdata(dev);
> + ret = da9052_rtc_gettime(priv->da9052, tm);
> + if (ret) {
> + printk(KERN_INFO "RTC Get time operation failed.\n");
> + return -EIO;
> + }
> + return 0;
> +}
> +
> +
> +static int da9052_rtc_class_ops_settime(struct device *dev, struct
> rtc_time *tm)
> +{
> + int ret;
> + struct da9052_rtc *priv = dev_get_drvdata(dev);
> +
> + ret = da9052_rtc_settime(priv->da9052, tm);
> +
> + return ret;
> +}
> +
> +static int da9052_rtc_readalarm(struct device *dev, struct rtc_wkalrm
> *alrm)
> +{
> + int ret;
> + struct rtc_time *tm = &alrm->time;
> + struct da9052_rtc *priv = dev_get_drvdata(dev);
> +
> + ret = da9052_alarm_gettime(priv->da9052, tm);
> + if (ret) {
> + printk(KERN_INFO "RTC Read alarm operation failed.\n");
> + return -EIO;
> + }
> + return 0;
> +
> +}
> +
> +static int da9052_rtc_setalarm(struct device *dev, struct rtc_wkalrm
> *alrm)
> +{
> + int ret;
> + struct rtc_time *tm = &alrm->time;
> + struct da9052_rtc *priv = dev_get_drvdata(dev);
> +
> + ret = da9052_alarm_settime(priv->da9052, tm);
> + if (ret)
> + return -EIO;
> +
> + return 0;
> +}
> +
> +static int da9052_rtc_update_irq_enable(struct device *dev,
> + unsigned int enabled)
> +{
> + struct da9052_rtc *priv = dev_get_drvdata(dev);
> + int ret = -ENODATA;
> +
> + da9052_lock(priv->da9052);
> +
> + ret = (enabled ? da9052_rtc_unmask_irq : da9052_rtc_mask_irq)
> + (priv->da9052);
> +
> + da9052_unlock(priv->da9052);
> +
> + return ret;
> +}
> +
> +static int da9052_rtc_alarm_irq_enable(struct device *dev,
> + unsigned int enabled)
> +{
> + struct da9052_rtc *priv = dev_get_drvdata(dev);
> +
> + if (enabled)
> + return da9052_rtc_enable_alarm(priv->da9052, enabled);
> + else
> + return da9052_rtc_enable_alarm(priv->da9052, enabled);
> +}
> +
> +static const struct rtc_class_ops da9052_rtc_ops = {
> + .read_time = da9052_rtc_class_ops_gettime,
> + .set_time = da9052_rtc_class_ops_settime,
> + .read_alarm = da9052_rtc_readalarm,
> + .set_alarm = da9052_rtc_setalarm,
> + .update_irq_enable = da9052_rtc_update_irq_enable,
> + .alarm_irq_enable = da9052_rtc_alarm_irq_enable,
> +};
> +
> +
> +static int __devinit da9052_rtc_probe(struct platform_device *pdev)
> +{
> + int ret;
> + struct da9052_rtc *priv;
> + struct da9052_ssc_msg ssc_msg;
> +
> + printk(KERN_INFO " DA9052 RTC Driver Probe.\n");
> +
> + priv = kzalloc(sizeof(*priv), GFP_KERNEL);
> + if (!priv)
> + return -ENOMEM;
> +
> + priv->da9052 = dev_get_drvdata(pdev->dev.parent);
> + rtc1 = priv;
> + platform_set_drvdata(pdev, priv);
> +
> + /* Set the EH structure */
> + priv->eh_data.eve_type = ALARM_EVE;
> + priv->eh_data.call_back = &da9052_rtc_alarm_handler;
> + ret = priv->da9052->register_event_notifier(priv->da9052,
> + &priv->eh_data);
> + if (ret) {
> + printk(KERN_INFO "DA9052 RTC Probe: Error in registering alarm
> event.\n");
> + goto err_register_alarm;
> + }
> +
> + /* Enable Timer alarm by default. */
> + priv->is_min_alarm = 1;
> + priv->enable_tick_alarm = 1;
> + priv->enable_clk_buffer = 1;
> + priv->set_osc_trim_freq = 0;
> +
> + /* Register the events with the DA9052 core to receive the events */
> +
> + /* Enable/Disable TICK Alarm */
> + /* Read ALARM YEAR register */
> + ssc_msg.addr = DA9052_ALARMY_REG;
> + ssc_msg.data = 0;
> +
> + da9052_lock(priv->da9052);
> + ret = priv->da9052->read(priv->da9052, &ssc_msg);
> + if (ret) {
> + printk(KERN_INFO "DA9052 RTC Probe: Error in reading SSC register
> \n");
> + da9052_unlock(priv->da9052);
> + goto err_ssc_comm;
> + }
> + da9052_unlock(priv->da9052);
> +
> + if (priv->enable_tick_alarm)
> + ssc_msg.data = (ssc_msg.data | DA9052_ALARMY_TICKON);
> + else
> + ssc_msg.data =
> + ((ssc_msg.data & ~(DA9052_ALARMY_TICKON)));
> +
> + da9052_lock(priv->da9052);
> + ret = priv->da9052->write(priv->da9052, &ssc_msg);
> + if (ret) {
> + printk(KERN_INFO "DA9052 RTC Probe: Error in writing to SSC register
> \n");
> + da9052_unlock(priv->da9052);
> + goto err_ssc_comm;
> + }
> + da9052_unlock(priv->da9052);
> +
> + /* Set TICK Alarm to 1 minute or 1 sec */
> + /* Read ALARM MINUTES register */
> + ssc_msg.addr = DA9052_ALARMMI_REG;
> + ssc_msg.data = 0;
> +
> + da9052_lock(priv->da9052);
> + ret = priv->da9052->read(priv->da9052, &ssc_msg);
> + if (ret) {
> + printk(KERN_INFO "DA9052 RTC Probe: Error in reading SSC register
> \n");
> + da9052_unlock(priv->da9052);
> + goto err_ssc_comm;
> + }
> + da9052_unlock(priv->da9052);
> +
> + if (priv->is_min_alarm)
> + /* Set 1 minute tick type */
> + ssc_msg.data = (ssc_msg.data | DA9052_ALARMMI_TICKTYPE);
> + else
> + /* Set 1 sec tick type */
> + ssc_msg.data = (ssc_msg.data & ~(DA9052_ALARMMI_TICKTYPE));
> +
> + da9052_lock(priv->da9052);
> + ret = priv->da9052->write(priv->da9052, &ssc_msg);
> + if (ret) {
> + printk(KERN_INFO "DA9052 RTC Probe: Error in writing to SSC register
> \n");
> + da9052_unlock(priv->da9052);
> + goto err_ssc_comm;
> + }
> + da9052_unlock(priv->da9052);
> +
> +
> + /* Enable/Disable Clock buffer in Power Down Mode */
> + ssc_msg.addr = DA9052_PDDIS_REG;
> + ssc_msg.data = 0;
> +
> + da9052_lock(priv->da9052);
> + ret = priv->da9052->read(priv->da9052, &ssc_msg);
> + if (ret) {
> + printk(KERN_INFO "DA9052 RTC Probe: Error in reading SSC register
> \n");
> + da9052_unlock(priv->da9052);
> + goto err_ssc_comm;
> + }
> + da9052_unlock(priv->da9052);
> +
> + if (priv->enable_clk_buffer)
> + ssc_msg.data = (ssc_msg.data | DA9052_PDDIS_OUT32KPD);
> + else
> + ssc_msg.data = (ssc_msg.data & ~(DA9052_PDDIS_OUT32KPD));
> +
> + da9052_lock(priv->da9052);
> + ret = priv->da9052->write(priv->da9052, &ssc_msg);
> + if (ret) {
> + printk(KERN_INFO "DA9052 RTC Probe: Error in writing to SSC register
> \n");
> + da9052_unlock(priv->da9052);
> + goto err_ssc_comm;
> + }
> + da9052_unlock(priv->da9052);
> +
> +
> + /* Set clock trim frequency value */
> + ssc_msg.addr = DA9052_OSCTRIM_REG;
> + ssc_msg.data = priv->set_osc_trim_freq;
> +
> + da9052_lock(priv->da9052);
> + ret = priv->da9052->write(priv->da9052, &ssc_msg);
> + if (ret) {
> + printk(KERN_INFO "DA9052 RTC Probe: Error in writing to SSC register
> \n");
> + da9052_unlock(priv->da9052);
> + goto err_ssc_comm;
> + }
> + da9052_unlock(priv->da9052);
> +
> +
> + priv->rtc = rtc_device_register(pdev->name,
> + &pdev->dev, &da9052_rtc_ops, THIS_MODULE);
> + if (IS_ERR(priv->rtc)) {
> + ret = PTR_ERR(priv->rtc);
> + goto err_ssc_comm;
> + }
> +
> +
> +err_ssc_comm:
> + priv->da9052->unregister_event_notifier
> + (priv->da9052, &priv->eh_data);
> +err_register_alarm:
> + platform_set_drvdata(pdev, NULL);
> + kfree(priv);
> +
> +
> + return ret;
> +}
> +
> +static int __devexit da9052_rtc_remove(struct platform_device *pdev)
> +{
> + struct da9052_rtc *priv = platform_get_drvdata(pdev);
> +
> + rtc_device_unregister(priv->rtc);
> +
> + da9052_lock(priv->da9052);
> +
> + priv->da9052->unregister_event_notifier(priv->da9052, &priv->eh_data);
> +
> + da9052_unlock(priv->da9052);
> +
> + platform_set_drvdata(pdev, NULL);
> +
> + kfree(priv);
> +
> + return 0;
> +}
> +
> +static struct platform_driver da9052_rtc_driver = {
> + .probe = da9052_rtc_probe,
> + .remove = __devexit_p(da9052_rtc_remove),
> + .driver = {
> + .name = DRIVER_NAME,
> + .owner = THIS_MODULE,
> + },
> +};
> +
> +
> +static int __init da9052_rtc_init(void)
> +{
> + return platform_driver_probe(&da9052_rtc_driver, &da9052_rtc_probe);
> +}
> +module_init(da9052_rtc_init);
> +
> +static void __exit da9052_rtc_exit(void)
> +{
> + platform_driver_unregister(&da9052_rtc_driver);
> +}
> +module_exit(da9052_rtc_exit);
> +
> +MODULE_AUTHOR("Dialog Semiconductor Ltd");
> +MODULE_DESCRIPTION("RTC driver for Dialog DA9052 PMIC");
> +MODULE_LICENSE("GPL v2");
> +MODULE_ALIAS("platform:" DRIVER_NAME);
> diff -Naur linux-2.6.34/include/linux/mfd/da9052/rtc.h
> linux-2.6.34_test/include/linux/mfd/da9052/rtc.h
> --- linux-2.6.34/include/linux/mfd/da9052/rtc.h 1970-01-01
> 05:00:00.000000000 +0500
> +++ linux-2.6.34_test/include/linux/mfd/da9052/rtc.h 2010-06-23
> 19:48:18.000000000 +0500
> @@ -0,0 +1,313 @@
> +/*
> + * Copyright(c) 2009 Dialog Semiconductor Ltd.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * rtc.h: RTC driver file for DA9052
> +*/
> +
> +
> +#ifndef _RTC_H
> +#define _RTC_H
> +
> +
> +#define DA9052_RTC_DEVICE_NAME "da9052_rtc"
> +
> +/* Limit values */
> +#define DA9052_RTC_SECONDS_LIMIT (59)
> +#define DA9052_RTC_MINUTES_LIMIT (59)
> +#define DA9052_RTC_HOURS_LIMIT (23)
> +#define DA9052_RTC_DAYS_LIMIT (31)
> +#define DA9052_RTC_MONTHS_LIMIT (12)
> +#define DA9052_RTC_YEARS_LIMIT (63)
> +
> +/* Months */
> +#define FEBRUARY (2)
> +#define APRIL (4)
> +#define JUNE (6)
> +#define SEPTEMBER (9)
> +#define NOVEMBER (11)
> +
> +/* BYTE shifts */
> +#define DA9052_RTC_FOURTH_BYTE (24)
> +#define DA9052_RTC_THIRD_BYTE (16)
> +#define DA9052_RTC_SECOND_BYTE (8)
> +#define DA9052_RTC_FIRST_BYTE (0)
> +
> +/* Oscillator trim values */
> +#define DA9052_RTC_OSC_FRQ_0_0ppm (0)
> +#define DA9052_RTC_OSC_FRQ_1_9ppm (1)
> +#define DA9052_RTC_OSC_FRQ_3_8ppm (2)
> +#define DA9052_RTC_OSC_FRQ_5_7ppm (3)
> +#define DA9052_RTC_OSC_FRQ_7_6ppm (4)
> +#define DA9052_RTC_OSC_FRQ_9_5ppm (5)
> +#define DA9052_RTC_OSC_FRQ_11_4ppm (6)
> +#define DA9052_RTC_OSC_FRQ_13_3ppm (7)
> +#define DA9052_RTC_OSC_FRQ_15_2ppm (8)
> +#define DA9052_RTC_OSC_FRQ_17_1ppm (9)
> +#define DA9052_RTC_OSC_FRQ_19_0ppm (10)
> +#define DA9052_RTC_OSC_FRQ_20_9ppm (11)
> +#define DA9052_RTC_OSC_FRQ_22_8ppm (12)
> +#define DA9052_RTC_OSC_FRQ_24_7ppm (13)
> +#define DA9052_RTC_OSC_FRQ_26_7ppm (14)
> +#define DA9052_RTC_OSC_FRQ_28_6ppm (15)
> +#define DA9052_RTC_OSC_FRQ_30_5ppm (16)
> +#define DA9052_RTC_OSC_FRQ_32_4ppm (17)
> +#define DA9052_RTC_OSC_FRQ_34_3ppm (18)
> +#define DA9052_RTC_OSC_FRQ_36_2ppm (19)
> +#define DA9052_RTC_OSC_FRQ_38_1ppm (20)
> +#define DA9052_RTC_OSC_FRQ_40_0ppm (21)
> +#define DA9052_RTC_OSC_FRQ_41_9ppm (22)
> +#define DA9052_RTC_OSC_FRQ_43_8ppm (23)
> +#define DA9052_RTC_OSC_FRQ_45_7ppm (24)
> +#define DA9052_RTC_OSC_FRQ_47_6ppm (25)
> +#define DA9052_RTC_OSC_FRQ_49_5ppm (26)
> +#define DA9052_RTC_OSC_FRQ_51_4ppm (27)
> +#define DA9052_RTC_OSC_FRQ_53_4ppm (28)
> +#define DA9052_RTC_OSC_FRQ_55_3ppm (29)
> +#define DA9052_RTC_OSC_FRQ_57_2ppm (30)
> +#define DA9052_RTC_OSC_FRQ_59_1ppm (31)
> +#define DA9052_RTC_OSC_FRQ_61_0ppm (32)
> +#define DA9052_RTC_OSC_FRQ_62_9ppm (33)
> +#define DA9052_RTC_OSC_FRQ_64_8ppm (34)
> +#define DA9052_RTC_OSC_FRQ_66_7ppm (35)
> +#define DA9052_RTC_OSC_FRQ_68_6ppm (36)
> +#define DA9052_RTC_OSC_FRQ_70_5ppm (37)
> +#define DA9052_RTC_OSC_FRQ_72_4ppm (38)
> +#define DA9052_RTC_OSC_FRQ_74_3ppm (39)
> +#define DA9052_RTC_OSC_FRQ_76_2ppm (40)
> +#define DA9052_RTC_OSC_FRQ_78_2ppm (41)
> +#define DA9052_RTC_OSC_FRQ_80_1ppm (42)
> +#define DA9052_RTC_OSC_FRQ_82_0ppm (43)
> +#define DA9052_RTC_OSC_FRQ_83_9ppm (44)
> +#define DA9052_RTC_OSC_FRQ_85_8ppm (45)
> +#define DA9052_RTC_OSC_FRQ_87_7ppm (46)
> +#define DA9052_RTC_OSC_FRQ_89_6ppm (47)
> +#define DA9052_RTC_OSC_FRQ_91_5ppm (48)
> +#define DA9052_RTC_OSC_FRQ_93_4ppm (49)
> +#define DA9052_RTC_OSC_FRQ_95_3ppm (50)
> +#define DA9052_RTC_OSC_FRQ_97_2ppm (51)
> +#define DA9052_RTC_OSC_FRQ_99_1ppm (52)
> +#define DA9052_RTC_OSC_FRQ_101_0ppm (53)
> +#define DA9052_RTC_OSC_FRQ_102_9ppm (54)
> +#define DA9052_RTC_OSC_FRQ_104_9ppm (55)
> +#define DA9052_RTC_OSC_FRQ_106_8ppm (56)
> +#define DA9052_RTC_OSC_FRQ_108_7ppm (57)
> +#define DA9052_RTC_OSC_FRQ_110_6ppm (58)
> +#define DA9052_RTC_OSC_FRQ_112_5ppm (59)
> +#define DA9052_RTC_OSC_FRQ_114_4ppm (60)
> +#define DA9052_RTC_OSC_FRQ_116_3ppm (61)
> +#define DA9052_RTC_OSC_FRQ_118_2ppm (62)
> +#define DA9052_RTC_OSC_FRQ_120_1ppm (63)
> +#define DA9052_RTC_OSC_FRQ_122_0ppm (64)
> +#define DA9052_RTC_OSC_FRQ_123_9ppm (65)
> +#define DA9052_RTC_OSC_FRQ_125_8ppm (66)
> +#define DA9052_RTC_OSC_FRQ_127_7ppm (67)
> +#define DA9052_RTC_OSC_FRQ_129_6ppm (68)
> +#define DA9052_RTC_OSC_FRQ_131_6ppm (69)
> +#define DA9052_RTC_OSC_FRQ_133_5ppm (70)
> +#define DA9052_RTC_OSC_FRQ_135_4ppm (71)
> +#define DA9052_RTC_OSC_FRQ_137_3ppm (72)
> +#define DA9052_RTC_OSC_FRQ_139_2ppm (73)
> +#define DA9052_RTC_OSC_FRQ_141_1ppm (74)
> +#define DA9052_RTC_OSC_FRQ_143_0ppm (75)
> +#define DA9052_RTC_OSC_FRQ_144_9ppm (76)
> +#define DA9052_RTC_OSC_FRQ_146_8ppm (77)
> +#define DA9052_RTC_OSC_FRQ_148_7ppm (78)
> +#define DA9052_RTC_OSC_FRQ_150_6ppm (79)
> +#define DA9052_RTC_OSC_FRQ_152_5ppm (80)
> +#define DA9052_RTC_OSC_FRQ_154_4ppm (81)
> +#define DA9052_RTC_OSC_FRQ_156_4ppm (82)
> +#define DA9052_RTC_OSC_FRQ_158_3ppm (83)
> +#define DA9052_RTC_OSC_FRQ_160_2ppm (84)
> +#define DA9052_RTC_OSC_FRQ_162_1ppm (85)
> +#define DA9052_RTC_OSC_FRQ_164_0ppm (86)
> +#define DA9052_RTC_OSC_FRQ_165_9ppm (87)
> +#define DA9052_RTC_OSC_FRQ_167_8ppm (88)
> +#define DA9052_RTC_OSC_FRQ_169_7ppm (89)
> +#define DA9052_RTC_OSC_FRQ_171_6ppm (90)
> +#define DA9052_RTC_OSC_FRQ_173_5ppm (91)
> +#define DA9052_RTC_OSC_FRQ_175_4ppm (92)
> +#define DA9052_RTC_OSC_FRQ_177_3ppm (93)
> +#define DA9052_RTC_OSC_FRQ_179_2ppm (94)
> +#define DA9052_RTC_OSC_FRQ_181_1ppm (95)
> +#define DA9052_RTC_OSC_FRQ_183_1ppm (96)
> +#define DA9052_RTC_OSC_FRQ_185_0ppm (97)
> +#define DA9052_RTC_OSC_FRQ_186_9ppm (98)
> +#define DA9052_RTC_OSC_FRQ_188_8ppm (99)
> +#define DA9052_RTC_OSC_FRQ_190_7ppm (100)
> +#define DA9052_RTC_OSC_FRQ_192_6ppm (101)
> +#define DA9052_RTC_OSC_FRQ_194_5ppm (102)
> +#define DA9052_RTC_OSC_FRQ_196_4ppm (103)
> +#define DA9052_RTC_OSC_FRQ_198_3ppm (104)
> +#define DA9052_RTC_OSC_FRQ_200_2ppm (105)
> +#define DA9052_RTC_OSC_FRQ_202_1ppm (106)
> +#define DA9052_RTC_OSC_FRQ_204_0ppm (107)
> +#define DA9052_RTC_OSC_FRQ_205_9ppm (108)
> +#define DA9052_RTC_OSC_FRQ_207_9ppm (109)
> +#define DA9052_RTC_OSC_FRQ_209_8ppm (110)
> +#define DA9052_RTC_OSC_FRQ_211_7ppm (111)
> +#define DA9052_RTC_OSC_FRQ_213_6ppm (112)
> +#define DA9052_RTC_OSC_FRQ_215_5ppm (113)
> +#define DA9052_RTC_OSC_FRQ_217_4ppm (114)
> +#define DA9052_RTC_OSC_FRQ_219_3ppm (115)
> +#define DA9052_RTC_OSC_FRQ_221_2ppm (116)
> +#define DA9052_RTC_OSC_FRQ_223_1ppm (117)
> +#define DA9052_RTC_OSC_FRQ_225_0ppm (118)
> +#define DA9052_RTC_OSC_FRQ_226_9ppm (119)
> +#define DA9052_RTC_OSC_FRQ_228_8ppm (120)
> +#define DA9052_RTC_OSC_FRQ_230_7ppm (121)
> +#define DA9052_RTC_OSC_FRQ_232_6ppm (122)
> +#define DA9052_RTC_OSC_FRQ_234_6ppm (123)
> +#define DA9052_RTC_OSC_FRQ_236_5ppm (124)
> +#define DA9052_RTC_OSC_FRQ_238_4ppm (125)
> +#define DA9052_RTC_OSC_FRQ_240_3ppm (126)
> +#define DA9052_RTC_OSC_FRQ_242_2ppm (127)
> +#define DA9052_RTC_OSC_FRQ_MINUS_244_1ppm (128)
> +#define DA9052_RTC_OSC_FRQ_MINUS_242_2ppm (129)
> +#define DA9052_RTC_OSC_FRQ_MINUS_240_3ppm (130)
> +#define DA9052_RTC_OSC_FRQ_MINUS_238_4ppm (131)
> +#define DA9052_RTC_OSC_FRQ_MINUS_236_5ppm (132)
> +#define DA9052_RTC_OSC_FRQ_MINUS_234_6ppm (133)
> +#define DA9052_RTC_OSC_FRQ_MINUS_232_6ppm (134)
> +#define DA9052_RTC_OSC_FRQ_MINUS_230_7ppm (135)
> +#define DA9052_RTC_OSC_FRQ_MINUS_228_8ppm (136)
> +#define DA9052_RTC_OSC_FRQ_MINUS_226_9ppm (137)
> +#define DA9052_RTC_OSC_FRQ_MINUS_225_0ppm (138)
> +#define DA9052_RTC_OSC_FRQ_MINUS_223_1ppm (139)
> +#define DA9052_RTC_OSC_FRQ_MINUS_221_2ppm (140)
> +#define DA9052_RTC_OSC_FRQ_MINUS_219_3ppm (141)
> +#define DA9052_RTC_OSC_FRQ_MINUS_217_4ppm (142)
> +#define DA9052_RTC_OSC_FRQ_MINUS_215_5ppm (143)
> +#define DA9052_RTC_OSC_FRQ_MINUS_213_6ppm (144)
> +#define DA9052_RTC_OSC_FRQ_MINUS_211_7ppm (145)
> +#define DA9052_RTC_OSC_FRQ_MINUS_209_8ppm (146)
> +#define DA9052_RTC_OSC_FRQ_MINUS_207_9ppm (147)
> +#define DA9052_RTC_OSC_FRQ_MINUS_205_9ppm (148)
> +#define DA9052_RTC_OSC_FRQ_MINUS_204_0ppm (149)
> +#define DA9052_RTC_OSC_FRQ_MINUS_202_1ppm (150)
> +#define DA9052_RTC_OSC_FRQ_MINUS_200_2ppm (151)
> +#define DA9052_RTC_OSC_FRQ_MINUS_198_3ppm (152)
> +#define DA9052_RTC_OSC_FRQ_MINUS_196_4ppm (153)
> +#define DA9052_RTC_OSC_FRQ_MINUS_194_5ppm (154)
> +#define DA9052_RTC_OSC_FRQ_MINUS_192_6ppm (155)
> +#define DA9052_RTC_OSC_FRQ_MINUS_190_7ppm (156)
> +#define DA9052_RTC_OSC_FRQ_MINUS_188_8ppm (157)
> +#define DA9052_RTC_OSC_FRQ_MINUS_186_9ppm (158)
> +#define DA9052_RTC_OSC_FRQ_MINUS_185_0ppm (159)
> +#define DA9052_RTC_OSC_FRQ_MINUS_183_1ppm (160)
> +#define DA9052_RTC_OSC_FRQ_MINUS_181_1ppm (161)
> +#define DA9052_RTC_OSC_FRQ_MINUS_179_2ppm (162)
> +#define DA9052_RTC_OSC_FRQ_MINUS_177_3ppm (163)
> +#define DA9052_RTC_OSC_FRQ_MINUS_175_4ppm (164)
> +#define DA9052_RTC_OSC_FRQ_MINUS_173_5ppm (165)
> +#define DA9052_RTC_OSC_FRQ_MINUS_171_6ppm (166)
> +#define DA9052_RTC_OSC_FRQ_MINUS_169_7ppm (167)
> +#define DA9052_RTC_OSC_FRQ_MINUS_167_8ppm (168)
> +#define DA9052_RTC_OSC_FRQ_MINUS_165_9ppm (169)
> +#define DA9052_RTC_OSC_FRQ_MINUS_164_0ppm (170)
> +#define DA9052_RTC_OSC_FRQ_MINUS_162_1ppm (171)
> +#define DA9052_RTC_OSC_FRQ_MINUS_160_2ppm (172)
> +#define DA9052_RTC_OSC_FRQ_MINUS_158_3ppm (173)
> +#define DA9052_RTC_OSC_FRQ_MINUS_156_4ppm (174)
> +#define DA9052_RTC_OSC_FRQ_MINUS_154_4ppm (175)
> +#define DA9052_RTC_OSC_FRQ_MINUS_152_5ppm (176)
> +#define DA9052_RTC_OSC_FRQ_MINUS_150_6ppm (177)
> +#define DA9052_RTC_OSC_FRQ_MINUS_148_7ppm (178)
> +#define DA9052_RTC_OSC_FRQ_MINUS_146_8ppm (179)
> +#define DA9052_RTC_OSC_FRQ_MINUS_144_9ppm (180)
> +#define DA9052_RTC_OSC_FRQ_MINUS_143_0ppm (181)
> +#define DA9052_RTC_OSC_FRQ_MINUS_141_1ppm (182)
> +#define DA9052_RTC_OSC_FRQ_MINUS_139_2ppm (183)
> +#define DA9052_RTC_OSC_FRQ_MINUS_137_3ppm (184)
> +#define DA9052_RTC_OSC_FRQ_MINUS_135_4ppm (185)
> +#define DA9052_RTC_OSC_FRQ_MINUS_133_5ppm (186)
> +#define DA9052_RTC_OSC_FRQ_MINUS_131_6ppm (187)
> +#define DA9052_RTC_OSC_FRQ_MINUS_129_6ppm (188)
> +#define DA9052_RTC_OSC_FRQ_MINUS_127_7ppm (189)
> +#define DA9052_RTC_OSC_FRQ_MINUS_125_8ppm (190)
> +#define DA9052_RTC_OSC_FRQ_MINUS_123_9ppm (191)
> +#define DA9052_RTC_OSC_FRQ_MINUS_122_0ppm (192)
> +#define DA9052_RTC_OSC_FRQ_MINUS_120_1ppm (193)
> +#define DA9052_RTC_OSC_FRQ_MINUS_118_2ppm (194)
> +#define DA9052_RTC_OSC_FRQ_MINUS_116_3ppm (195)
> +#define DA9052_RTC_OSC_FRQ_MINUS_114_4ppm (196)
> +#define DA9052_RTC_OSC_FRQ_MINUS_112_5ppm (197)
> +#define DA9052_RTC_OSC_FRQ_MINUS_110_6ppm (198)
> +#define DA9052_RTC_OSC_FRQ_MINUS_108_7ppm (199)
> +#define DA9052_RTC_OSC_FRQ_MINUS_106_8ppm (200)
> +#define DA9052_RTC_OSC_FRQ_MINUS_104_9ppm (201)
> +#define DA9052_RTC_OSC_FRQ_MINUS_102_9ppm (202)
> +#define DA9052_RTC_OSC_FRQ_MINUS_101_0ppm (203)
> +#define DA9052_RTC_OSC_FRQ_MINUS_99_1ppm (204)
> +#define DA9052_RTC_OSC_FRQ_MINUS_97_2ppm (205)
> +#define DA9052_RTC_OSC_FRQ_MINUS_95_3ppm (206)
> +#define DA9052_RTC_OSC_FRQ_MINUS_93_4ppm (207)
> +#define DA9052_RTC_OSC_FRQ_MINUS_91_5ppm (208)
> +#define DA9052_RTC_OSC_FRQ_MINUS_89_6ppm (209)
> +#define DA9052_RTC_OSC_FRQ_MINUS_87_7ppm (210)
> +#define DA9052_RTC_OSC_FRQ_MINUS_85_8ppm (211)
> +#define DA9052_RTC_OSC_FRQ_MINUS_83_9ppm (212)
> +#define DA9052_RTC_OSC_FRQ_MINUS_82_0ppm (213)
> +#define DA9052_RTC_OSC_FRQ_MINUS_80_1ppm (214)
> +#define DA9052_RTC_OSC_FRQ_MINUS_78_2ppm (215)
> +#define DA9052_RTC_OSC_FRQ_MINUS_76_2ppm (216)
> +#define DA9052_RTC_OSC_FRQ_MINUS_74_3ppm (217)
> +#define DA9052_RTC_OSC_FRQ_MINUS_72_4ppm (218)
> +#define DA9052_RTC_OSC_FRQ_MINUS_70_5ppm (219)
> +#define DA9052_RTC_OSC_FRQ_MINUS_68_6ppm (220)
> +#define DA9052_RTC_OSC_FRQ_MINUS_66_7ppm (221)
> +#define DA9052_RTC_OSC_FRQ_MINUS_64_8ppm (222)
> +#define DA9052_RTC_OSC_FRQ_MINUS_62_9ppm (223)
> +#define DA9052_RTC_OSC_FRQ_MINUS_61_0ppm (224)
> +#define DA9052_RTC_OSC_FRQ_MINUS_59_1ppm (225)
> +#define DA9052_RTC_OSC_FRQ_MINUS_57_2ppm (226)
> +#define DA9052_RTC_OSC_FRQ_MINUS_55_3ppm (227)
> +#define DA9052_RTC_OSC_FRQ_MINUS_53_4ppm (228)
> +#define DA9052_RTC_OSC_FRQ_MINUS_51_4ppm (229)
> +#define DA9052_RTC_OSC_FRQ_MINUS_49_5ppm (230)
> +#define DA9052_RTC_OSC_FRQ_MINUS_47_6ppm (231)
> +#define DA9052_RTC_OSC_FRQ_MINUS_45_7ppm (232)
> +#define DA9052_RTC_OSC_FRQ_MINUS_43_8ppm (233)
> +#define DA9052_RTC_OSC_FRQ_MINUS_41_9ppm (234)
> +#define DA9052_RTC_OSC_FRQ_MINUS_40_0ppm (235)
> +#define DA9052_RTC_OSC_FRQ_MINUS_38_1ppm (236)
> +#define DA9052_RTC_OSC_FRQ_MINUS_36_2ppm (237)
> +#define DA9052_RTC_OSC_FRQ_MINUS_34_3ppm (238)
> +#define DA9052_RTC_OSC_FRQ_MINUS_32_4ppm (239)
> +#define DA9052_RTC_OSC_FRQ_MINUS_30_5ppm (240)
> +#define DA9052_RTC_OSC_FRQ_MINUS_28_6ppm (241)
> +#define DA9052_RTC_OSC_FRQ_MINUS_26_7ppm (242)
> +#define DA9052_RTC_OSC_FRQ_MINUS_24_7ppm (243)
> +#define DA9052_RTC_OSC_FRQ_MINUS_22_8ppm (244)
> +#define DA9052_RTC_OSC_FRQ_MINUS_20_9ppm (245)
> +#define DA9052_RTC_OSC_FRQ_MINUS_19_0ppm (246)
> +#define DA9052_RTC_OSC_FRQ_MINUS_17_1ppm (247)
> +#define DA9052_RTC_OSC_FRQ_MINUS_15_2ppm (248)
> +#define DA9052_RTC_OSC_FRQ_MINUS_13_3ppm (249)
> +#define DA9052_RTC_OSC_FRQ_MINUS_11_4ppm (250)
> +#define DA9052_RTC_OSC_FRQ_MINUS_9_5ppm (251)
> +#define DA9052_RTC_OSC_FRQ_MINUS_7_6ppm (252)
> +#define DA9052_RTC_OSC_FRQ_MINUS_5_7ppm (253)
> +#define DA9052_RTC_OSC_FRQ_MINUS_3_8ppm (254)
> +#define DA9052_RTC_OSC_FRQ_MINUS_1_9ppm (255)
> +
> +/* RTC error codes */
> +#define DA9052_RTC_INVALID_SECONDS (3)
> +#define DA9052_RTC_INVALID_MINUTES (4)
> +#define DA9052_RTC_INVALID_HOURS (5)
> +#define DA9052_RTC_INVALID_DAYS (6)
> +#define DA9052_RTC_INVALID_MONTHS (7)
> +#define DA9052_RTC_INVALID_YEARS (8)
> +#define DA9052_RTC_INVALID_EVENT (9)
> +#define DA9052_RTC_INVALID_IOCTL (10)
> +#define DA9052_RTC_INVALID_SETTING (11)
> +#define DA9052_RTC_EVENT_ALREADY_REGISTERED (12)
> +#define DA9052_RTC_EVENT_UNREGISTERED (13)
> +#define DA9052_RTC_EVENT_REGISTRATION_FAILED (14)
> +#define DA9052_RTC_EVENT_UNREGISTRATION_FAILED (15)
> +
> +#endif /* _RTC_H */
--
Best regards,
Alessandro Zummo,
Tower Technologies - Torino, Italy
http://www.towertech.it
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/