#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/i2c.h>
#include <linux/rtc.h>
#include <linux/bcd.h>
#include <linux/workqueue.h>
#include <linux/slab.h>
#include <linux/dma-mapping.h>
#include <asm/delay.h>
#include <linux/delay.h>
void __iomem* reg_gpio_base_va = 0;
#define GPIO_ADRESS_BASE 0x12140000
#define GPIO_CTRL_ADRESS_BASE 0x12040000
#define HI_IO_GPIO_ADDRESS(x) (reg_gpio_base_va + ((x)-(GPIO_ADRESS_BASE)))
#define GPIO9_REG6 HI_IO_GPIO_ADDRESS(GPIO_ADRESS_BASE+(0x9000)+0x100)
#define I2C1_CTRL_REG6 HI_IO_GPIO_ADDRESS(GPIO_CTRL_ADRESS_BASE+0x005C)
#define I2C1_CTRL_REG7 HI_IO_GPIO_ADDRESS(GPIO_CTRL_ADRESS_BASE+0x0060)
#define GPIO9_CTRL_REG6 HI_IO_GPIO_ADDRESS(GPIO_CTRL_ADRESS_BASE+0x0134)
#define GPIO9_IS6 HI_IO_GPIO_ADDRESS(GPIO_ADRESS_BASE+(0x9000)+0x404)
#define GPIO9_IBE6 HI_IO_GPIO_ADDRESS(GPIO_ADRESS_BASE+(0x9000)+0x408)
#define GPIO9_IEV6 HI_IO_GPIO_ADDRESS(GPIO_ADRESS_BASE+(0x9000)+0x40C)
#define GPIO9_IC6 HI_IO_GPIO_ADDRESS(GPIO_ADRESS_BASE+(0x9000)+0x41C)
#define GPIO9_IE6 HI_IO_GPIO_ADDRESS(GPIO_ADRESS_BASE+(0x9000)+0x410)
#define GPIO9_DIR6 HI_IO_GPIO_ADDRESS(GPIO_ADRESS_BASE+(0x9000)+0x400)
#define GPIO_SET(g,r) ((*(volatile unsigned int *)g) |= (1<<(r)))
#define GPIO_RST(g,r) ((*(volatile unsigned int *)g) &= ~(1<<(r)))
#define GPIO_WRITE_REG(Addr, Value) ((*(volatile unsigned int *)(Addr))=(Value))
#define GPIO_READ_REG(Addr) (*(volatile unsigned int *)(Addr))
#define MODULE_VERSION_STRING "RTC-DS3231"
#define DS3232_DRIVER_VERSION "v1.0.0"
#define DS3231_REG_SECONDS 0x00
#define DS3231_REG_MINUTES 0x01
#define DS3231_REG_HOURS 0x02
#define DS3231_REG_AMPM 0x02
#define DS3231_REG_DAY 0x03
#define DS3231_REG_DATE 0x04
#define DS3231_REG_MONTH 0x05
#define DS3231_REG_CENTURY 0x05
#define DS3231_REG_YEAR 0x06
#define DS3231_REG_ALARM1 0x07 /* Alarm 1 BASE */
#define DS3231_REG_ALARM2 0x0B /* Alarm 2 BASE */
#define DS3231_REG_CR 0x0E /* Control register */
#define DS3231_REG_CR_nEOSC 0x80
#define DS3231_REG_CR_INTCN 0x04
#define DS3231_REG_CR_A2IE 0x02
#define DS3231_REG_CR_A1IE 0x01
#define DS3231_REG_SR 0x0F /* control/status register */
#define DS3231_REG_SR_OSF 0x80
#define DS3231_REG_SR_BSY 0x04
#define DS3231_REG_SR_A2F 0x02
#define DS3231_REG_SR_A1F 0x01
#define DEVICE_NAME "ds3231rtc"
#define I2C_ADDR_DS3231 0xD0
#ifdef DS3231_DEBUG
#define HI_MSG(x...) \
do { \
printk("%s->%d: ", __FUNCTION__, __LINE__); \
printk(x); \
printk("\n"); \
} while (0)
#else
#define HI_MSG(args...) do { } while (0)
#endif
#define HI_ERR(x...) \
do { \
printk(KERN_ALERT "%s->%d: ", __FUNCTION__, __LINE__); \
printk(KERN_ALERT x); \
printk(KERN_ALERT "\n"); \
} while (0)
#ifdef DS3231_DEBUG
static void display_rtc_time_in_bcd(struct rtc_time *rtime)
{
printk("tm_sec: %u\n", rtime->tm_sec);
printk("tm_min: %u\n", rtime->tm_min);
printk("tm_hour: %u\n", rtime->tm_hour);
printk("tm_mday: %u\n", rtime->tm_mday);
printk("tm_mon: %u\n", rtime->tm_mon);
printk("tm_year: %u\n", rtime->tm_year);
printk("tm_wday: %u\n", rtime->tm_wday);
printk("tm_yday: %u\n", rtime->tm_yday);
printk("tm_isdst: %u\n", rtime->tm_isdst);
}
#endif
struct rtc_time timess;
struct i2c_client *rtc_client;
struct rtc_device *rtc;
struct device *devicess;
int temp_flag=0;
extern int hi_i2c_dma_read(const struct i2c_client *client, unsigned int data_addr,
unsigned int