lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20100624182744.22839a43@linux.lan.towertech.it>
Date:	Thu, 24 Jun 2010 18:27:44 +0200
From:	Alessandro Zummo <a.zummo@...ertech.it>
To:	dd.diasemi@...il.com
Cc:	linux-kernel@...r.kernel.org
Subject: Re: [PATCH 4/11] device driver for DA9052

On Thu, 24 Jun 2010 17:39:13 +0200
dd diasemi <dd.diasemi@...il.com> 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@...semi.com>

 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@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ