blob: 480f740b6147a67fe1ff6849c7e87b9c8f923127 [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/* drivers/rtc/zx234290_rtc.c
2 *
3 * Copyright (c) 2013 Sanechips Co., Ltd.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * zx234290 Internal RTC Driver
10*/
11
12#include <linux/module.h>
13#include <linux/kernel.h>
14#include <linux/fs.h>
15#include <linux/string.h>
16#include <linux/init.h>
17#include <linux/platform_device.h>
18#include <linux/interrupt.h>
19#include <linux/rtc.h>
20#include <linux/bcd.h>
21#include <linux/clk.h>
22#include <linux/log2.h>
23#include <linux/of.h>
24#include <linux/delay.h>
25#include <linux/irq.h>
26#include <linux/mfd/zx234290.h>
27#include <asm/irq.h>
28#include "mach/iomap.h"
29#include <linux/gpio.h>
30#include <mach/gpio.h>
31#include "zx234290-rtc.h"
32
33#include <linux/semaphore.h>
34
35//#define GPIOFUNC_GPIO 0
36//#define GPIOFUNC_FUNC 1
37//#define PIN_PMU_INT ZX29_GPIO_47
38static struct platform_device *g_rtcdev;
39
40static int zx234290_rtc_enable(struct device *dev, int enable);
41int zx234290_rtc_settimer(int sec);
42int zx234290_rtc_set_second_timer(int seconds);
43
44#define ZX234290_BITFVAL(var, lsh) ( (var) << (lsh) )
45#define ZX234290_BITFMASK(wid, lsh) ( ((1U << (wid)) - 1) << (lsh) )
46#define ZX234290_BITFEXT(var, wid, lsh) ((var & ZX234290_BITFMASK(wid, lsh)) >> (lsh))
47static struct rtc_device *g_rtc;
48int CycleTimes = 0;
49int surplus = 0;
50int timer_remain=0;
51//#define ZX234290_GPIO_NUM 10
52
53typedef enum
54{
55 TIMER_COUNT_4096 = 0,
56 TIMER_COUNT_64 = 1, /* 64 DEFAULT */
57 TIMER_COUNT_1 = 2, /* 1 */
58 TIMER_COUNT_1_60 = 3, /* 1/60 */
59
60 TIMER_COUNT_MAX
61}zx234290_timercount;
62
63typedef enum
64{
65 ALARM_MINUTE = 0,
66 ALARM_HOUR = 1,
67 ALARM_DAY = 2,
68 ALARM_WEEKDAY = 3,
69 ALARM_SECOND = 4,
70 ALARM_MAX
71}zx234290_alarm_type;
72
73typedef enum
74{
75 ZX234290_SET_TIMER =( 'r'<<24|'t'<<16|'c'<<8|0),
76 ZX234290_GET_TIMER,
77 ZX234290_TIMER_ENABLED,
78 ZX234290_GET_TIMER_REMAIN,
79 ZX234290_GET_TIMER_STATUS,
80 ZX234290_CYCLE_ENABLE,
81 ZX234290_FUNCTION_MAX
82
83}zx234290_rtc_timer;
84
85typedef struct _zx234290_rtc
86{
87 struct zx234290 *zx234290;
88}zx234290_rtc_data;
89
90zx234290_rtc_data zx234290_rtc;
91static int zx234290_rtc_irqno = NO_IRQ;
92
93static volatile long timer_sema_flag=0;
94#define TIMER_SEMA_START_BIT 0 /*set timer before get timer.*/
95#define TIMER_SEMA_WAIT_BIT 1 /*mutex semaphore, up semaphore must be after down semaphore.*/
96
97struct semaphore timerSemaphore;
98
99
100struct rtc_time tempTime = {0};
101
102int zx234290_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm);
103static int zx234290_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm);
104
105static int zx234290_rtc_write_register(unsigned char addr, unsigned char data, unsigned char mask)
106{
107 int ret = 0;
108 unsigned char content = 0;
109
110 ret = zx234290_reg_read(zx234290_rtc.zx234290, addr);
111 if (ret < 0)
112 {
113 return -1;
114 }
115
116 content = (unsigned char)ret;
117 content &= ~mask;
118 content |= data & mask;
119 ret = zx234290_reg_write(zx234290_rtc.zx234290, addr, content);
120 if (ret != 0)
121 {
122 return ret;
123 }
124
125 return ret;
126}
127
128static int zx234290_rtc_read_register(unsigned char reg, unsigned char *dest)
129{
130 int ret;
131
132 ret = zx234290_reg_read(zx234290_rtc.zx234290, reg);
133 if (ret < 0)
134 return ret;
135
136 *dest = (unsigned char)ret;
137
138 return 0;
139}
140
141//++added by ys
142//send alarm irq event to app when alarm come.
143void zte_send_alarm_irq_event(void)
144{
145 char event_string[100] = {0};
146 char *envp[] = { event_string, NULL };
147
148 struct rtc_time rtc_tm;
149 struct rtc_wkalrm alrm;
150 unsigned long sec;
151// time_t sec;
152
153 zx234290_rtc_gettime(NULL, &rtc_tm);
154 zx234290_rtc_getalarm(NULL, &alrm);
155 alrm.time.tm_year = rtc_tm.tm_year;
156 alrm.time.tm_mon = rtc_tm.tm_mon;
157 rtc_tm_to_time(&(alrm.time), &sec);
158/*
159 printk("read alarm %04d.%02d.%02d %02d:%02d:%02d wday %d, sec %lu\n",
160 alrm.time.tm_year, alrm.time.tm_mon, alrm.time.tm_mday,
161 alrm.time.tm_hour, alrm.time.tm_min, alrm.time.tm_sec, alrm.time.tm_wday, sec);
162*/
163
164 sprintf(event_string,"PMIC RTC ALARM IRQ COME, sec:%lu", sec);
165
166 if(strlen(event_string))
167 kobject_uevent_env(&g_rtcdev->dev.kobj, KOBJ_CHANGE,envp);
168}
169
170void zte_send_timer_irq_event(void)
171{
172 char event_string[100] = {0};
173 char *envp[] = { event_string, NULL };
174// printk(KERN_INFO "zx234290_rtc: send_timer_irq_event\n" );
175
176 sprintf(event_string,"PMIC RTC TIMER IRQ COME");
177
178 if(strlen(event_string))
179 kobject_uevent_env(&g_rtcdev->dev.kobj, KOBJ_CHANGE,envp);
180
181 //printk(KERN_INFO "[yuwei]send_timer_irq_event. uevent\n");
182}
183void zte_send_min_irq_event(void)
184{
185 char event_string[100] = {0};
186 char *envp[] = { event_string, NULL };
187// printk(KERN_INFO "zx234290_rtc: send_min_irq_event\n" );
188
189 sprintf(event_string,"PMIC RTC MIN IRQ COME");
190
191 if(strlen(event_string))
192 kobject_uevent_env(&g_rtcdev->dev.kobj, KOBJ_CHANGE,envp);
193
194}
195void zte_send_hour_irq_event(void)
196{
197 char event_string[100] = {0};
198 char *envp[] = { event_string, NULL };
199// printk(KERN_INFO "zx234290_rtc: send_hour_irq_event\n" );
200
201 sprintf(event_string,"PMIC RTC HOUR IRQ COME");
202
203 if(strlen(event_string))
204 kobject_uevent_env(&g_rtcdev->dev.kobj, KOBJ_CHANGE,envp);
205
206}
207//++end
208
209
210
211/*alarm and timer countdown irq*/
212static irqreturn_t zx234290_rtc_alarmirq(int irq, void *id)
213{
214 struct rtc_device *rdev = id;
215 unsigned char reg_val = 0, mask = 0;
216 unsigned char reg_val_ctrl2 = 0;
217
218 zx234290_rtc_read_register(ZX234290_REG_ADDR_RTC_CTRL2,&reg_val_ctrl2);
219 //printk(KERN_INFO "zx234290_rtc_alarmirq:CycleTimes=%d,surplus=%d,timerFlag=%d.\n",CycleTimes,surplus,timerFlag);
220 //printk(KERN_INFO "zx234290_rtc_alarmirq:value(0x31) =%d.\n",reg_val_ctrl2);
221
222 /*alarm int*/
223 if((reg_val_ctrl2&0x08) == 0x08)
224 //if((reg_val_ctrl2>>ZX234290_RTC_AF_LSH)&0x1 == 0x1)
225 {
226 /*clear AF bit*/
227 mask = ZX234290_BITFMASK(ZX234290_RTC_AF_WID, ZX234290_RTC_AF_LSH);
228 reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_AF_LSH);
229 zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);
230
231 rtc_update_irq(rdev, 1, RTC_AF | RTC_IRQF);
232
233 zte_send_alarm_irq_event();
234 }
235 /*timer int*/
236 if((reg_val_ctrl2&0x04) == 0x04)
237 //else if((reg_val_ctrl2>>ZX234290_RTC_TF_LSH)&0x1 == 0x1)
238 {
239 /*clear TF bit*/
240 mask = ZX234290_BITFMASK(ZX234290_RTC_TF_WID, ZX234290_RTC_TF_LSH);
241 reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_TF_LSH);
242 zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);
243
244 rtc_update_irq(rdev, 1, RTC_AF | RTC_IRQF);
245
246// printk(KERN_INFO "zx234290_rtc_alarmirq ,remain seconds=%ld,flag=0x%lx\n",timer_remain,timer_sema_flag);
247 if(timer_remain){
248 zx234290_rtc_set_second_timer(min(timer_remain,255));
249 timer_remain -= min(timer_remain,255);
250 }
251 else{
252 if(test_and_clear_bit(TIMER_SEMA_WAIT_BIT, &timer_sema_flag)){
253 up(&timerSemaphore);
254 printk(KERN_INFO "zx234290_rtc_alarmirq semaphore.\n");
255 }
256 zte_send_timer_irq_event();
257 clear_bit(TIMER_SEMA_START_BIT, &timer_sema_flag);
258 }
259
260 }
261
262// printk(KERN_INFO "zx234290_rtc: irq = %d, REG(0x31) =0x%x.\n", irq, reg_val_ctrl2);
263 return IRQ_HANDLED;
264}
265
266static irqreturn_t zx234290_rtc_minirq(int irq, void *id)
267{
268 struct rtc_device *rdev = id;
269
270 rtc_update_irq(rdev, 1, RTC_UF | RTC_IRQF);
271 zte_send_min_irq_event();
272 return IRQ_HANDLED;
273}
274static irqreturn_t zx234290_rtc_hourirq(int irq, void *id)
275{
276 struct rtc_device *rdev = id;
277
278 rtc_update_irq(rdev, 1, RTC_UF | RTC_IRQF);
279 zte_send_hour_irq_event();
280 return IRQ_HANDLED;
281}
282/*alarm enable/disable, 1:disable 0:enable*/
283int zx234290_rtc_alarm_enable(zx234290_alarm_type type, unsigned int enabled)
284{
285 int ret = 0;
286 unsigned char reg_addr=0, reg_val=0, mask=0;
287 switch(type)
288 {
289 case ALARM_MINUTE:
290 reg_addr = ZX234290_REG_ADDR_ALARM_MINUTE;
291 break;
292 case ALARM_HOUR:
293 reg_addr = ZX234290_REG_ADDR_ALARM_HOUR;
294 break;
295 case ALARM_DAY:
296 reg_addr = ZX234290_REG_ADDR_ALARM_DAY;
297 break;
298 case ALARM_WEEKDAY:
299 reg_addr = ZX234290_REG_ADDR_ALARM_WEEK;
300 break;
301 case ALARM_SECOND:
302 reg_addr = ZX234290_REG_ADDR_ALARM_SECOND;
303 break;
304 default:
305 reg_addr = ZX234290_REG_ADDR_ALARM_MINUTE;
306 break;
307 }
308
309 reg_val = ZX234290_BITFVAL(enabled, ZX234290_RTC_AlARM_ACTIVATED_LSH);
310 mask = ZX234290_BITFMASK(ZX234290_RTC_AlARM_ACTIVATED_WID, ZX234290_RTC_AlARM_ACTIVATED_LSH);
311 ret = zx234290_rtc_write_register(reg_addr, reg_val, mask);
312 return ret;
313}
314
315/*timer counter set*/
316int zx234290_rtc_set_timercounter(unsigned char cnt)
317{
318 int ret = 0;
319 unsigned char reg_addr=0, reg_val=0, mask=0;
320
321 reg_addr = ZX234290_REG_ADDR_TIMER_CNT;
322 reg_val = ZX234290_BITFVAL(cnt, ZX234290_RTC_TIMER_CNT_LSH);
323 mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_CNT_WID, ZX234290_RTC_TIMER_CNT_LSH);
324 ret = zx234290_rtc_write_register(reg_addr, reg_val, mask);
325
326 return ret;
327}
328
329/*
330 TIMER_COUNT_4096 = 0,
331 TIMER_COUNT_64 = 1,
332 TIMER_COUNT_1 = 2,
333 TIMER_COUNT_1_60 = 3,
334*/
335int zx234290_rtc_set_clock_frequency(zx234290_timercount td)
336{
337 int ret = 0;
338 unsigned char reg_addr=0, reg_val=0, mask=0;
339
340 reg_addr = ZX234290_REG_ADDR_TIMER_CTRL;
341 reg_val = ZX234290_BITFVAL(td, ZX234290_RTC_TIMER_TD_LSH);
342 mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_TD_WID, ZX234290_RTC_TIMER_TD_LSH);
343 ret = zx234290_rtc_write_register(reg_addr, reg_val, mask);
344
345 return ret;
346}
347
348static int zx234290_rtc_setaie(struct device *dev, unsigned int enabled)
349{
350 int ret = 0;
351 int reg_val=0, mask=0;
352
353 pr_debug("%s: aie=%d\n", __func__, enabled);
354 if(0==enabled)//disable alarm
355 {
356 zx234290_rtc_alarm_enable(ALARM_SECOND, 1);
357 zx234290_rtc_alarm_enable(ALARM_MINUTE, 1);
358 zx234290_rtc_alarm_enable(ALARM_HOUR, 1);
359 zx234290_rtc_alarm_enable(ALARM_DAY, 1);
360 zx234290_rtc_alarm_enable(ALARM_WEEKDAY, 1);
361 };
362 /*enable/disable AIE bit*/
363 mask = ZX234290_BITFMASK(ZX234290_RTC_AIE_WID, ZX234290_RTC_AIE_LSH);
364 reg_val= ZX234290_BITFVAL(enabled, ZX234290_RTC_AIE_LSH);
365 ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);
366 if (ret != 0)
367 {
368 return ret;
369 }
370
371 /*clear AF bit*/
372 mask = ZX234290_BITFMASK(ZX234290_RTC_AF_WID, ZX234290_RTC_AF_LSH);
373 reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_AF_LSH);
374 ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);
375 if (ret != 0)
376 {
377 return ret;
378 }
379
380 /*mask/unmask alarm int*/
381 /*
382 mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_MASK_WID, ZX234290_RTC_ALARM_INT_MASK_LSH);
383 if(enabled)
384 {
385 reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_ALARM_INT_MASK_LSH);
386 }
387 else
388 {
389 reg_val= ZX234290_BITFVAL(1, ZX234290_RTC_ALARM_INT_MASK_LSH);
390 }
391
392 ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_INTB_MASK, reg_val, mask);
393 if (ret != 0)
394 {
395 return ret;
396 }
397 */
398
399 return ret;
400}
401
402static int zx234290_rtc_settie(struct device *dev, unsigned int enabled)
403{
404 int ret = 0;
405 int reg_val=0, mask=0;
406 /*enable/disable TIE bit*/
407 mask = ZX234290_BITFMASK(ZX234290_RTC_TIE_WID, ZX234290_RTC_TIE_LSH);
408 reg_val= ZX234290_BITFVAL(enabled, ZX234290_RTC_TIE_LSH);
409 ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);
410 if (ret != 0)
411 {
412 return ret;
413 }
414 return 0;
415}
416static int zx234290_rtc_setuie(struct device *dev, unsigned int enabled)
417{
418 int nRet = 0;
419 int reg_val=0, mask=0;
420 pr_debug("%s: uie=%d\n", __func__, enabled);
421 /*
422 mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_INT_EN_WID, ZX234290_RTC_TIMER_INT_EN_LSH);
423 reg_val= ZX234290_BITFVAL(enabled, ZX234290_RTC_TIMER_INT_EN_LSH);
424 nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);
425 if (nRet != 0)
426 {
427 return nRet;
428 }
429 */
430 mask = ZX234290_BITFMASK(ZX234290_RTC_ONE_MINUTE_INT_MASK_WID, ZX234290_RTC_ONE_MINUTE_INT_MASK_LSH);
431 if(enabled)
432 {
433 reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_ONE_MINUTE_INT_MASK_LSH);
434 }
435 else
436 {
437 reg_val= ZX234290_BITFVAL(1, ZX234290_RTC_ONE_MINUTE_INT_MASK_LSH);
438 }
439
440 nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_INTB_MASK, reg_val, mask);
441
442 mask = ZX234290_BITFMASK(ZX234290_RTC_ONE_HOUR_INT_MASK_WID, ZX234290_RTC_ONE_HOUR_INT_MASK_LSH);
443 if(enabled)
444 {
445 reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_ONE_HOUR_INT_MASK_LSH);
446 }
447 else
448 {
449 reg_val= ZX234290_BITFVAL(1, ZX234290_RTC_ONE_HOUR_INT_MASK_LSH);
450 }
451
452 nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_INTB_MASK, reg_val, mask);
453
454 return nRet;
455}
456
457static int zx234290_rtc_getvalue(unsigned char reg, unsigned char *dest, unsigned char width, unsigned char offset)
458{
459 int nRet = 0;
460 unsigned char val;
461 nRet = zx234290_rtc_read_register(reg, dest);
462 if (nRet != 0)
463 {
464 return nRet;
465 }
466 val = *dest;
467 val = ZX234290_BITFEXT(val,width, offset);
468 *dest = val;
469 return nRet;
470}
471
472static int zx234290_rtc_setvalue(unsigned char addr, unsigned char data, unsigned char width, unsigned char offset)
473{
474 int nRet = 0;
475 unsigned char reg_val=0, mask=0;
476 reg_val = ZX234290_BITFVAL(data, offset);
477 mask = ZX234290_BITFMASK(width, offset);
478 nRet = zx234290_rtc_write_register(addr, reg_val, mask);
479 return nRet;
480}
481
482
483int zx234290_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
484{
485 unsigned char day, mon, year, wday, sec, min, hour;
486 unsigned char CenturyIndicate = 0;
487 unsigned int have_retried = 0;
488 if(rtc_tm == NULL)
489 {
490 return -1;
491 }
492retry_get_time:
493
494 zx234290_rtc_getvalue(ZX234290_REG_ADDR_SECONDS, &sec, ZX234290_RTC_TIME_SECONDS_WID, ZX234290_RTC_TIME_SECONDS_LSH);
495 zx234290_rtc_getvalue(ZX234290_REG_ADDR_MINUTES, &min, ZX234290_RTC_TIME_MINUTES_WID, ZX234290_RTC_TIME_MINUTES_LSH);
496 zx234290_rtc_getvalue(ZX234290_REG_ADDR_HOURS, &hour, ZX234290_RTC_TIME_HOURS_WID, ZX234290_RTC_TIME_HOURS_LSH);
497 zx234290_rtc_getvalue(ZX234290_REG_ADDR_DAY, &day, ZX234290_RTC_TIME_DAYS_WID, ZX234290_RTC_TIME_DAYS_LSH);
498 zx234290_rtc_getvalue(ZX234290_REG_ADDR_MONTH, &mon, ZX234290_RTC_TIME_MONTHS_WID, ZX234290_RTC_TIME_MONTHS_LSH);
499 zx234290_rtc_getvalue(ZX234290_REG_ADDR_YEAR, &year, ZX234290_RTC_TIME_YEAR_WID, ZX234290_RTC_TIME_YEAR_LSH);
500 zx234290_rtc_getvalue(ZX234290_REG_ADDR_WEEK, &wday, ZX234290_RTC_TIME_WEEKDAY_WID, ZX234290_RTC_TIME_WEEKDAY_LSH);
501 zx234290_rtc_getvalue(ZX234290_REG_ADDR_MONTH, &CenturyIndicate, ZX234290_RTC_TIME_CENTURY_WID, ZX234290_RTC_TIME_CENTURY_LSH);
502
503
504 if (sec == 0 && !have_retried)
505 {
506 have_retried = 1;
507 goto retry_get_time;
508 }
509 rtc_tm->tm_sec = bcd2bin(sec);
510 rtc_tm->tm_min = bcd2bin(min);
511 rtc_tm->tm_hour = bcd2bin(hour);
512 rtc_tm->tm_mday = bcd2bin(day);
513 rtc_tm->tm_mon = bcd2bin(mon);
514 rtc_tm->tm_year = bcd2bin(year);//+2000;
515 rtc_tm->tm_wday = bcd2bin(wday);
516 rtc_tm->tm_yday = rtc_year_days(rtc_tm->tm_mday, rtc_tm->tm_mon , rtc_tm->tm_year);
517 if(CenturyIndicate == 0)
518 {
519 rtc_tm->tm_year += 100;
520 }
521 rtc_tm->tm_mon -= 1;
522 rtc_tm->tm_isdst = 0;
523 pr_debug("read time %04d.%02d.%02d %02d:%02d:%02d\n",
524 rtc_tm->tm_year, rtc_tm->tm_mon+1, rtc_tm->tm_mday,
525 rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec);
526
527 return rtc_valid_tm(rtc_tm);
528}
529
530static int zx234290_rtc_settime(struct device *dev, struct rtc_time *tm)
531{
532 int ret = 0;
533 unsigned char day, mon, year, wday, sec, min, hour, CenturyIndicate;
534 unsigned char reg_val=0, mask=0;
535 //int year = tm->tm_year - 100;
536 pr_debug("set time %04d.%02d.%02d %02d:%02d:%02d\n",
537 tm->tm_year, tm->tm_mon+1, tm->tm_mday,
538 tm->tm_hour, tm->tm_min, tm->tm_sec);
539 if(tm->tm_year >= 200)
540 {
541 return -1;
542
543 }else if(tm->tm_year >= 100)
544 {
545 year = tm->tm_year - 100;
546 CenturyIndicate = 0; /*indicate 21 ÊÀ¼Í 20xx*/
547 }
548 else
549 {
550 year = tm->tm_year;
551 CenturyIndicate = 1; /*indicate 20 ÊÀ¼Í 19xx*/
552 }
553 /* we get around y2k by simply not supporting it */
554 sec = bin2bcd(tm->tm_sec);
555 reg_val = ZX234290_BITFVAL(sec, ZX234290_RTC_TIME_SECONDS_LSH);
556 mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_SECONDS_WID, ZX234290_RTC_TIME_SECONDS_LSH);
557 ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_SECONDS, reg_val, mask);
558
559 min = bin2bcd(tm->tm_min);
560 reg_val = ZX234290_BITFVAL(min, ZX234290_RTC_TIME_MINUTES_LSH);
561 mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_MINUTES_WID, ZX234290_RTC_TIME_MINUTES_LSH);
562 ret += zx234290_rtc_write_register(ZX234290_REG_ADDR_MINUTES, reg_val, mask);
563
564 hour = bin2bcd(tm->tm_hour);
565 reg_val = ZX234290_BITFVAL(hour, ZX234290_RTC_TIME_HOURS_LSH);
566 mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_HOURS_WID, ZX234290_RTC_TIME_HOURS_LSH);
567 ret += zx234290_rtc_write_register(ZX234290_REG_ADDR_HOURS, reg_val, mask);
568
569 day = bin2bcd(tm->tm_mday);
570 reg_val = ZX234290_BITFVAL(day, ZX234290_RTC_TIME_DAYS_LSH);
571 mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_DAYS_WID, ZX234290_RTC_TIME_DAYS_LSH);
572 ret += zx234290_rtc_write_register(ZX234290_REG_ADDR_DAY, reg_val, mask);
573
574 mon = bin2bcd(tm->tm_mon+1);
575 reg_val = ZX234290_BITFVAL(mon, ZX234290_RTC_TIME_MONTHS_LSH);
576 mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_MONTHS_WID, ZX234290_RTC_TIME_MONTHS_LSH);
577 ret += zx234290_rtc_write_register(ZX234290_REG_ADDR_MONTH, reg_val, mask);
578
579 reg_val = ZX234290_BITFVAL(CenturyIndicate, ZX234290_RTC_TIME_CENTURY_LSH);
580 mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_CENTURY_WID, ZX234290_RTC_TIME_CENTURY_LSH);
581 ret += zx234290_rtc_write_register(ZX234290_REG_ADDR_MONTH, reg_val, mask);
582
583 year = bin2bcd(year);
584 reg_val = ZX234290_BITFVAL(year, ZX234290_RTC_TIME_YEAR_LSH);
585 mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_YEAR_WID, ZX234290_RTC_TIME_YEAR_LSH);
586 ret += zx234290_rtc_write_register(ZX234290_REG_ADDR_YEAR, reg_val, mask);
587
588 wday = bin2bcd(tm->tm_wday);
589 reg_val = ZX234290_BITFVAL(wday, ZX234290_RTC_TIME_WEEKDAY_LSH);
590 mask = ZX234290_BITFMASK(ZX234290_RTC_TIME_WEEKDAY_WID, ZX234290_RTC_TIME_WEEKDAY_LSH);
591 ret += zx234290_rtc_write_register(ZX234290_REG_ADDR_WEEK, reg_val, mask);
592
593 return ret;
594}
595
596static int zx234290_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)
597{
598 struct rtc_time *alm_tm = &alrm->time;
599 unsigned char second, day, wday, min, hour;
600 unsigned char reg_val=0, mask=0;
601 if(alrm == NULL)
602 {
603 return -1;
604 }
605 zx234290_rtc_getvalue(ZX234290_REG_ADDR_ALARM_SECOND, &second, ZX234290_RTC_AlARM_SECOND_WID, ZX234290_RTC_AlARM_SECOND_LSH);
606 zx234290_rtc_getvalue(ZX234290_REG_ADDR_ALARM_MINUTE, &min, ZX234290_RTC_AlARM_MINUTES_WID, ZX234290_RTC_AlARM_MINUTES_LSH);
607 zx234290_rtc_getvalue(ZX234290_REG_ADDR_ALARM_HOUR, &hour, ZX234290_RTC_AlARM_HOURS_WID, ZX234290_RTC_AlARM_HOURS_LSH);
608 zx234290_rtc_getvalue(ZX234290_REG_ADDR_ALARM_DAY, &day, ZX234290_RTC_AlARM_DAYS_WID, ZX234290_RTC_AlARM_DAYS_LSH);
609 zx234290_rtc_getvalue(ZX234290_REG_ADDR_ALARM_WEEK, &wday, ZX234290_RTC_AlARM_WEEKDAY_WID, ZX234290_RTC_AlARM_WEEKDAY_LSH);
610
611 mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_EN_WID, ZX234290_RTC_ALARM_INT_EN_LSH);
612 zx234290_rtc_read_register(ZX234290_REG_ADDR_RTC_CTRL2, &reg_val);
613 alrm->enabled = (reg_val & mask)? 1 : 0;
614
615 pr_debug("read alarm %d, %04d.%02d.%02d %02d:%02d:%02d\n",
616 alrm->enabled,
617 1900 + alm_tm->tm_year, alm_tm->tm_mon+1, alm_tm->tm_mday,
618 alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec);
619 /* decode the alarm enable field */
620 if(alrm->enabled)
621 {
622 //alm_tm->tm_sec = 0; //bcd2bin(alm_tm->tm_sec);
623 alm_tm->tm_sec = bcd2bin(second);//yuxiang
624 alm_tm->tm_min = bcd2bin(min);
625 alm_tm->tm_hour = bcd2bin(hour);
626 alm_tm->tm_mday = bcd2bin(day);
627 alm_tm->tm_wday = bcd2bin(wday);
628 }
629 else
630 {
631 alm_tm->tm_sec = -1;
632 alm_tm->tm_min = -1;
633 alm_tm->tm_hour = -1;
634 alm_tm->tm_mday = -1;
635 alm_tm->tm_mon = -1;
636 alm_tm->tm_year = -1;
637 }
638
639 return 0;
640}
641
642static int zx234290_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
643{
644 struct rtc_time *tm = &alrm->time;
645 //unsigned long expires;
646 unsigned char sec, min, hour, mday, wday;
647 //rtc_tm_to_time(tm, &expires);
648 //expires = roundup(expires, 60);
649 //rtc_time_to_tm(expires, tm);
650 //tm->tm_sec = 0;
651
652 if (tm->tm_sec < 60 && tm->tm_sec >= 0)//yuxiang
653 {
654 sec = bin2bcd(tm->tm_sec);
655 zx234290_rtc_setvalue(ZX234290_REG_ADDR_ALARM_SECOND, sec, ZX234290_RTC_AlARM_SECOND_WID, ZX234290_RTC_AlARM_SECOND_LSH);
656 zx234290_rtc_alarm_enable(ALARM_SECOND, 0);
657 }
658 else
659 {
660 zx234290_rtc_alarm_enable(ALARM_SECOND, 1);
661 }
662
663 if (tm->tm_min < 60 && tm->tm_min >= 0)
664 {
665 min = bin2bcd(tm->tm_min);
666 zx234290_rtc_setvalue(ZX234290_REG_ADDR_ALARM_MINUTE, min, ZX234290_RTC_AlARM_MINUTES_WID, ZX234290_RTC_AlARM_MINUTES_LSH);
667 zx234290_rtc_alarm_enable(ALARM_MINUTE, 0);
668 }
669 else
670 {
671 zx234290_rtc_alarm_enable(ALARM_MINUTE, 1);
672 }
673 if (tm->tm_hour < 24 && tm->tm_hour >= 0)
674 {
675 hour = bin2bcd(tm->tm_hour);
676 zx234290_rtc_setvalue(ZX234290_REG_ADDR_ALARM_HOUR, hour, ZX234290_RTC_AlARM_HOURS_WID, ZX234290_RTC_AlARM_HOURS_LSH);
677 zx234290_rtc_alarm_enable(ALARM_HOUR, 0);
678 }
679 else
680 {
681 zx234290_rtc_alarm_enable(ALARM_HOUR, 1);
682 }
683 if(tm->tm_mday < 32 && tm->tm_mday > 0)
684 {
685 mday = bin2bcd(tm->tm_mday);
686 zx234290_rtc_setvalue(ZX234290_REG_ADDR_ALARM_DAY, mday, ZX234290_RTC_AlARM_DAYS_WID, ZX234290_RTC_AlARM_DAYS_LSH);
687 zx234290_rtc_alarm_enable(ALARM_DAY, 0);
688 }
689 else
690 {
691 zx234290_rtc_alarm_enable(ALARM_DAY, 1);
692 }
693 if(tm->tm_wday < 7 && tm->tm_wday >= 0)
694 {
695 wday = bin2bcd(tm->tm_wday);
696 zx234290_rtc_setvalue(ZX234290_REG_ADDR_ALARM_WEEK, wday, ZX234290_RTC_AlARM_WEEKDAY_WID, ZX234290_RTC_AlARM_WEEKDAY_LSH);
697 zx234290_rtc_alarm_enable(ALARM_WEEKDAY, 0);
698 }
699 else
700 {
701 zx234290_rtc_alarm_enable(ALARM_WEEKDAY, 1);
702 }
703 zx234290_rtc_setaie(dev, alrm->enabled);
704 return 0;
705}
706
707static int zx234290_rtc_request_irq(struct platform_device *pdev, struct rtc_device *rtc)
708{
709 int ret = -1;
710 //zx234290_rtc.zx234290->irq_base = PMIC_INT_START;
711 ret = request_threaded_irq(zx234290_rtc.zx234290->irq_base + ZX234290_INT_RTC_ALRM,
712 NULL, zx234290_rtc_alarmirq, 0, "zx234290-rtc alarm", rtc);
713 if (ret)
714 {
715 dev_err(&pdev->dev, "IRQ%d error %d\n", zx234290_rtc.zx234290->irq_base + ZX234290_INT_RTC_ALRM, ret);
716 goto err_alarm_irq;
717 }
718 ret = request_threaded_irq(zx234290_rtc.zx234290->irq_base + ZX234290_INT_RTC_HOUR,
719 NULL, zx234290_rtc_hourirq, 0, "zx234290-rtc hour", rtc);
720 if (ret)
721 {
722 dev_err(&pdev->dev, "IRQ%d error %d\n", zx234290_rtc.zx234290->irq_base + ZX234290_INT_RTC_HOUR, ret);
723 goto err_hour_irq;
724 }
725 ret = request_threaded_irq(zx234290_rtc.zx234290->irq_base + ZX234290_INT_RTC_MIN,
726 NULL, zx234290_rtc_minirq, 0, "zx234290-rtc min", rtc);
727 if (ret)
728 {
729 dev_err(&pdev->dev, "IRQ%d error %d\n", zx234290_rtc.zx234290->irq_base + ZX234290_INT_RTC_MIN, ret);
730 goto err_min_irq;
731 }
732
733 return 0;
734
735 err_min_irq:
736 free_irq(zx234290_rtc.zx234290->irq_base + ZX234290_INT_RTC_MIN, rtc);
737 err_hour_irq:
738 free_irq(zx234290_rtc.zx234290->irq_base + ZX234290_INT_RTC_HOUR, rtc);
739 err_alarm_irq:
740 free_irq(zx234290_rtc.zx234290->irq_base + ZX234290_INT_RTC_ALRM, rtc);
741
742 return ret;
743}
744
745#if 1
746
747static int zx234290_rtc_set_second_alarm_int(struct device *dev, unsigned int enabled)
748{
749 int nRet = 0;
750
751 int ret = 0;
752 int reg_addr=0, mask=0;
753 unsigned char reg_val=0;
754 int bIsOn = 0;
755
756 #if 0
757 pr_debug("%s: aie=%d\n", __func__, enabled);
758 mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_EN_WID, ZX234290_RTC_ALARM_INT_EN_LSH);
759 reg_val= ZX234290_BITFVAL(enabled, ZX234290_RTC_ALARM_INT_EN_LSH);
760 nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);
761 if (nRet != 0)
762 {
763 return nRet;
764 }
765 mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_AF_WID, ZX234290_RTC_ALARM_AF_LSH);
766 reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_ALARM_AF_LSH);
767 zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);
768 mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_MASK_WID, ZX234290_RTC_ALARM_INT_MASK_LSH);
769 if(enabled)
770 {
771 reg_val= ZX234290_BITFVAL(0, ZX234290_RTC_ALARM_INT_MASK_LSH);
772 }
773 else
774 {
775 reg_val= ZX234290_BITFVAL(1, ZX234290_RTC_ALARM_INT_MASK_LSH);
776 }
777 nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_INTB_MASK, reg_val, mask);
778 #endif
779 if(enabled)
780 bIsOn = 0;//active
781 else
782 bIsOn = 1;//inactive
783
784 reg_addr = ZX234290_REG_ADDR_INTB_MASK;
785 reg_val = ZX234290_BITFVAL(enabled, ZX234290_RTC_ALARM_INT_MASK_LSH);
786 mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_MASK_WID, ZX234290_RTC_ALARM_INT_MASK_LSH);
787 ret = zx234290_rtc_write_register(reg_addr,reg_val, mask);
788 zx234290_rtc_read_register(0x03, &reg_val);
789
790// printk(KERN_INFO "zx234290_rtc_ioctl:0x03 = %x.\n",reg_val);
791#if 0
792 reg_addr = ZX234290_REG_ADDR_RTC_CTRL2;
793 reg_val = ZX234290_BITFVAL(enabled, ZX234290_RTC_ALARM_INT_EN_LSH);
794 mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_EN_WID, ZX234290_RTC_ALARM_INT_EN_LSH);
795 ret = zx234290_rtc_write_register(slv_addr,reg_val, mask);
796 reg_addr = ZX234290_REG_ADDR_RTC_CTRL2;
797 reg_val = ZX234290_BITFVAL(enabled, 2);
798 mask = ZX234290_BITFMASK(1, 2);
799 ret = zx234290_rtc_write_register(slv_addr,reg_val, mask);
800#endif
801 return nRet;
802}
803
804//static DECLARE_MUTEX(timerSemaphore);
805
806
807
808int zx234290_rtc_gettimer(void)
809{
810 int ret = -EPERM;
811
812 if(!test_and_set_bit(TIMER_SEMA_WAIT_BIT, &timer_sema_flag))
813 ret = down_interruptible(&timerSemaphore);
814
815 clear_bit(TIMER_SEMA_WAIT_BIT, &timer_sema_flag);
816
817 if(!ret){
818// printk(KERN_INFO "zx234290_rtc_gettimer:get semaphore success.\n");
819
820 zx234290_rtc_enable(g_rtc->dev.parent, 0);
821 zx234290_rtc_settie(g_rtc->dev.parent, 0);
822 zx234290_rtc_set_second_alarm_int(g_rtc->dev.parent, 1);
823
824 //zx234290_rtc_set_clock_frequency(TIMER_COUNT_1);
825 return 0;
826 }
827 else{
828 // printk(KERN_INFO "zx234290_rtc_gettimer:get semaphore ret is %d.\n", ret);
829
830 return ret;
831 }
832}
833
834int zx234290_rtc_set_second_timer(int seconds)
835{
836 int mask = 0;
837 unsigned char reg_val=0;
838 //int value = 0;
839
840 mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_INT_EN_WID, 2);
841 reg_val= ZX234290_BITFVAL(0, 2);
842 zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);
843 zx234290_rtc_set_timercounter(seconds);
844 zx234290_rtc_set_clock_frequency(TIMER_COUNT_1);
845 zx234290_rtc_enable(g_rtc->dev.parent, 1);
846 zx234290_rtc_settie(g_rtc->dev.parent, 1);
847 zx234290_rtc_set_second_alarm_int(g_rtc->dev.parent, 0);
848#if 0
849 zx234290_rtc_read_register(0x01, &value);
850 printk(KERN_INFO "zx234290_rtc_ioctl:0x01 = %x.\n",value);
851 zx234290_rtc_read_register(0x03, &value);
852 printk(KERN_INFO "zx234290_rtc_ioctl:0x03 = %x.\n",value);
853 zx234290_rtc_read_register(0x05, &value);
854 printk(KERN_INFO "zx234290_rtc_ioctl:0x05 = %x.\n",value);
855 zx234290_rtc_read_register(0x30, &value);
856 printk(KERN_INFO "zx234290_rtc_ioctl:0x30 = %x.\n",value);
857 zx234290_rtc_read_register(0x31, &value);
858 printk(KERN_INFO "zx234290_rtc_ioctl:0x31 = %x.\n",value);
859 zx234290_rtc_read_register(0x3E, &value);
860 printk(KERN_INFO "zx234290_rtc_ioctl:0x3E = %x.\n",value);
861 zx234290_rtc_read_register(0x3F, &value);
862 printk(KERN_INFO "zx234290_rtc_ioctl:0x3F = %x.\n",value);
863#endif
864 return 0;
865}
866
867void printf_rtc_log(void)
868{
869 unsigned char value = 0;
870
871 zx234290_rtc_read_register(0x01, &value);
872 printk(KERN_INFO "printf_rtc_log:0x01 = %x.\n",value);
873 zx234290_rtc_read_register(0x03, &value);
874 printk(KERN_INFO "printf_rtc_log:0x03 = %x.\n",value);
875 zx234290_rtc_read_register(0x05, &value);
876 printk(KERN_INFO "printf_rtc_log:0x05 = %x.\n",value);
877 zx234290_rtc_read_register(0x30, &value);
878 printk(KERN_INFO "printf_rtc_log:0x30 = %x.\n",value);
879 zx234290_rtc_read_register(0x31, &value);
880 printk(KERN_INFO "printf_rtc_log:0x31 = %x.\n",value);
881 zx234290_rtc_read_register(0x3E, &value);
882 printk(KERN_INFO "printf_rtc_log:0x3E = %x.\n",value);
883 zx234290_rtc_read_register(0x3F, &value);
884 printk(KERN_INFO "printf_rtc_log:0x3F = %x.\n",value);
885}
886
887static int zx234290_rtc_set_alarm_enable(struct device *dev, unsigned int enabled)
888{
889 int nRet = 0;
890 int reg_val=0, mask=0;
891
892 mask = ZX234290_BITFMASK(ZX234290_RTC_ALARM_INT_EN_WID, ZX234290_RTC_ALARM_INT_EN_LSH);
893 reg_val= ZX234290_BITFVAL(enabled, ZX234290_RTC_ALARM_INT_EN_LSH);
894
895 nRet = zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);
896
897 mask = ZX234290_BITFMASK(1, 0);
898 reg_val= ZX234290_BITFVAL(0, 0);
899
900 nRet = zx234290_rtc_write_register(0x03, reg_val, mask);
901
902 mask = ZX234290_BITFMASK(2, 2);
903 reg_val= ZX234290_BITFVAL(0, 2);
904
905 nRet = zx234290_rtc_write_register(0x31, reg_val, mask);
906 return 0;
907}
908
909
910int zx234290_rtc_disable_timer_alarm(void)
911{
912 zx234290_rtc_enable(g_rtc->dev.parent, 0);
913 zx234290_rtc_settie(g_rtc->dev.parent, 0);
914 zx234290_rtc_set_alarm_enable(g_rtc->dev.parent, 0);
915 zx234290_rtc_alarm_enable(ALARM_MINUTE,1);
916 zx234290_rtc_alarm_enable(ALARM_HOUR,1);
917 zx234290_rtc_alarm_enable(ALARM_DAY,1);
918 zx234290_rtc_alarm_enable(ALARM_WEEKDAY,1);
919 return 0;
920}
921EXPORT_SYMBOL_GPL(zx234290_rtc_disable_timer_alarm);
922
923/****get value of rtc timer cnt ****/
924unsigned char zx234290_rtc_gettimer_cnt_remain(void)
925{
926 unsigned char timercnt_remain=0;
927 zx234290_rtc_getvalue(ZX234290_REG_ADDR_TIMER_CNT, &timercnt_remain, ZX234290_RTC_TIMER_CNT_WID, ZX234290_RTC_TIMER_CNT_LSH);
928 return timercnt_remain;
929}
930
931
932
933
934static int zx234290_rtc_ioctl(struct device *dev,zx234290_rtc_timer cmd,unsigned long arg)
935{
936 int err = 0;
937 unsigned int seconds;
938 unsigned char timercnt_remain = 0;
939 unsigned int seconds_remain = 0;
940 void __user *uarg = (void __user *) arg;
941// printk(KERN_INFO "zx234290_rtc_ioctl:cmd=%d[%c%c%c%d]arg=%ld.\n",cmd, (cmd>>24)&0xff,(cmd>>16)&0xff,(cmd>>8)&0xff,cmd&0xff,arg);
942 switch(cmd)
943 {
944 case ZX234290_SET_TIMER:
945 {
946 seconds = arg;
947
948 if(seconds){
949 set_bit(TIMER_SEMA_START_BIT, &timer_sema_flag);
950
951 timer_remain = seconds;
952
953 zx234290_rtc_set_second_timer(min(timer_remain,255));
954 timer_remain -= min(timer_remain,255);
955// printk(KERN_INFO "ZX234290_SET_TIMER:set timer=%d, remain=%d.\n", seconds,timer_remain);
956 }
957
958 else/* if(seconds == 0)*/{
959// printk(KERN_INFO "ZX234290_SET_TIMER(seconds == %ld):timerSemaphore=0x%x.\n",seconds,timerSemaphore);
960 zx234290_rtc_enable(g_rtc->dev.parent, 0);
961 zx234290_rtc_settie(g_rtc->dev.parent, 0);
962// printf_rtc_log();
963 {
964 if(test_and_clear_bit(TIMER_SEMA_WAIT_BIT, &timer_sema_flag))
965 up(&timerSemaphore);
966 }
967
968 clear_bit(TIMER_SEMA_START_BIT, &timer_sema_flag);
969 }
970
971 seconds = 0;
972 break;
973 }
974 #if 1
975 case ZX234290_GET_TIMER:
976 {
977
978 if(test_bit(TIMER_SEMA_START_BIT, &timer_sema_flag)){
979 err = zx234290_rtc_gettimer();
980// printk(KERN_INFO "ZX234290_GET_TIMER.ret=%d\n",err);
981 }
982 //else
983 // printk(KERN_INFO "ZX234290_GET_TIMER.has not setting timer, return=%d\n",err);
984
985 break;
986 }
987 #endif
988
989 case ZX234290_TIMER_ENABLED:
990 {
991 seconds = arg;
992 // printk(KERN_INFO "ZX234290_TIMER_ENABLED:cmd=%d,senconds=%d.\n", cmd,seconds);
993 if(seconds == 0) {
994 zx234290_rtc_enable(g_rtc->dev.parent, 0);
995 zx234290_rtc_settie(g_rtc->dev.parent, 0);
996// printf_rtc_log();
997 if(test_and_clear_bit(TIMER_SEMA_WAIT_BIT, &timer_sema_flag))
998 up(&timerSemaphore);
999
1000 clear_bit(TIMER_SEMA_START_BIT, &timer_sema_flag);
1001 }
1002 break;
1003 }
1004 case ZX234290_GET_TIMER_REMAIN:
1005 {
1006 timercnt_remain = zx234290_rtc_gettimer_cnt_remain();
1007
1008 seconds_remain = timer_remain + timercnt_remain;
1009 // printk(KERN_INFO "ZX234290_GET_TIMER_REMAIN:cmd=%d.remain=%d\n", cmd,seconds_remain);
1010 err = put_user(seconds_remain,(unsigned long __user *)uarg);
1011 break;
1012 }
1013 case ZX234290_CYCLE_ENABLE:
1014 {
1015 seconds = arg;
1016 // printk(KERN_INFO "ZX234290_CYCLE_ENABLE:cmd=%d,enable=%d.\n", cmd,seconds);
1017 zx234290_rtc_setuie(g_rtc->dev.parent, seconds);
1018 break;
1019 }
1020 default:
1021 err=ENOIOCTLCMD;
1022 break;
1023 }
1024 return err;
1025}
1026
1027static int zx234290_rtc_enable(struct device *dev, int enable)
1028{
1029 int ret = 0;
1030 int reg_val=0, mask=0;
1031
1032 reg_val = ZX234290_BITFVAL(enable, ZX234290_RTC_TIMER_EN_LSH);
1033 mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_EN_WID, ZX234290_RTC_TIMER_EN_LSH);
1034 ret = zx234290_rtc_write_register(ZX234290_REG_ADDR_TIMER_CTRL, reg_val, mask);
1035
1036 return ret;
1037}
1038
1039/* ÉèÖÃRTCÄÚ²¿µ¹¼ÆÊ±¶¨Ê±Æ÷,ÓÃÓÚʵÏֹػúºó¶¨Ê±¿ª»ú */
1040int zx234290_rtc_settimer(int sec)
1041{
1042 int mask = 0;
1043 unsigned char reg_val=0;
1044 //int value = 0;
1045
1046 mask = ZX234290_BITFMASK(ZX234290_RTC_TIMER_INT_EN_WID, 2);
1047 reg_val= ZX234290_BITFVAL(0, 2);
1048 zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL2, reg_val, mask);
1049 zx234290_rtc_set_timercounter(sec);
1050 zx234290_rtc_enable(g_rtc->dev.parent, 1);
1051 zx234290_rtc_settie(g_rtc->dev.parent, 1);
1052 zx234290_rtc_setaie(g_rtc->dev.parent, 0);
1053 #if 0
1054 zx234290_rtc_read_register(0x30, &value);
1055 printk(KERN_INFO "zx234290_rtc_ioctl:0x30 = %x.\n",value);
1056 zx234290_rtc_read_register(0x31, &value);
1057 printk(KERN_INFO "zx234290_rtc_ioctl:0x31 = %x.\n",value);
1058 zx234290_rtc_read_register(0x3E, &value);
1059 printk(KERN_INFO "zx234290_rtc_ioctl:0x3E = %x.\n",value);
1060 zx234290_rtc_read_register(0x3F, &value);
1061 printk(KERN_INFO "zx234290_rtc_ioctl:0x3F = %x.\n",value);
1062 //printk("zx234290_rtc_settimer is called! \n");
1063 #endif
1064 return 0;
1065}
1066EXPORT_SYMBOL_GPL(zx234290_rtc_settimer);
1067
1068#endif
1069
1070static const struct rtc_class_ops zx234290_rtcops = {
1071 .read_time = zx234290_rtc_gettime,
1072 .set_time = zx234290_rtc_settime,
1073 .read_alarm = zx234290_rtc_getalarm,
1074 .set_alarm = zx234290_rtc_setalarm,
1075 .alarm_irq_enable = zx234290_rtc_setaie,
1076 .ioctl = zx234290_rtc_ioctl,
1077};
1078static int zx234290_rtc_probe(struct platform_device *pdev)
1079{
1080 struct rtc_device *rtc;
1081 struct rtc_time rtc_tm;
1082 int ret;
1083 g_rtcdev = pdev;
1084 zx234290_rtc.zx234290 = dev_get_drvdata(pdev->dev.parent);
1085 if(NULL==zx234290_rtc.zx234290)
1086 return -EINVAL;
1087
1088 zx234290_rtc_set_timercounter(128);
1089 zx234290_rtc_set_clock_frequency(TIMER_COUNT_1);
1090 device_init_wakeup(&pdev->dev, 1);
1091 rtc = rtc_device_register("zx234290", &pdev->dev, &zx234290_rtcops, THIS_MODULE); /* register RTC and exit */
1092 if (IS_ERR(rtc))
1093 {
1094 dev_err(&pdev->dev, "cannot attach rtc\n");
1095 ret = PTR_ERR(rtc);
1096 goto err_nortc;
1097 }
1098 g_rtc = rtc;
1099 zx234290_rtc_gettime(NULL, &rtc_tm); /* Check RTC Time */
1100 tempTime = rtc_tm;
1101 if (rtc_valid_tm(&rtc_tm) < 0)
1102 {
1103 rtc_tm.tm_year = 100;
1104 rtc_tm.tm_mon = 0;
1105 rtc_tm.tm_mday = 1;
1106 rtc_tm.tm_hour = 0;
1107 rtc_tm.tm_min = 0;
1108 rtc_tm.tm_sec = 0;
1109 rtc_tm.tm_wday= 6;
1110 zx234290_rtc_settime(NULL, &rtc_tm);
1111 dev_warn(&pdev->dev, "warning: invalid RTC value so initializing it\n");
1112 }
1113 else
1114 {
1115 rtc_tm = rtc_ktime_to_tm(rtc_tm_to_ktime(rtc_tm));
1116 zx234290_rtc_settime(NULL, &rtc_tm);
1117 }
1118 rtc->max_user_freq = 64; //32768;//32k clock
1119 zx234290_rtc_irqno = zx234290_rtc.zx234290->chip_irq;
1120 platform_set_drvdata(pdev, rtc);
1121 ret = zx234290_rtc_request_irq(pdev, rtc);
1122 if (ret)
1123 {
1124 dev_err(&pdev->dev, "IRQ request error!\n");
1125 goto err_irq;
1126 }
1127 zx234290_rtc_write_register(ZX234290_REG_ADDR_RTC_CTRL1, 0, 0xff);
1128 zx234290_rtc_setuie(&pdev->dev, 0);
1129 zx234290_rtc_enable(&pdev->dev, 0);
1130 sema_init(&timerSemaphore,0);
1131 //zx234290_rtc_ioctl(NULL,ZX234290_SET_TIMER,20);
1132 return 0;
1133 err_irq:
1134 platform_set_drvdata(pdev, NULL);
1135 err_nortc:
1136 rtc_device_unregister(rtc);
1137 return ret;
1138}
1139static int zx234290_rtc_remove(struct platform_device *pdev)
1140{
1141 struct rtc_device *rtc = platform_get_drvdata(pdev);
1142
1143 platform_set_drvdata(pdev, NULL);
1144 rtc_device_unregister(rtc);
1145 zx234290_rtc_setuie(&pdev->dev, 0);
1146 zx234290_rtc.zx234290 = NULL;
1147
1148 return 0;
1149}
1150static int zx234290_rtc_resume(struct platform_device *pdev)
1151{
1152 int irq=0;
1153 struct zx234290_board *pmic_plat_data = zx234290_rtc.zx234290->dev->platform_data;
1154 irq=gpio_to_irq(pmic_plat_data->irq_gpio_num);
1155 enable_irq(irq);
1156 zx234290_rtc_setuie(&pdev->dev, 1);
1157
1158 return 0;
1159}
1160static int zx234290_rtc_suspend(struct platform_device *pdev, pm_message_t state)
1161{
1162 int irq=0;
1163 struct zx234290_board *pmic_plat_data = zx234290_rtc.zx234290->dev->platform_data;
1164 //irq=gpio_to_irq(PIN_PMU_INT);
1165 irq=gpio_to_irq(pmic_plat_data->irq_gpio_num);
1166 disable_irq_nosync(irq);
1167 zx234290_rtc_setuie(&pdev->dev, 0);
1168
1169 return 0;
1170}
1171
1172
1173static struct platform_driver zx234290_rtc_driver =
1174{
1175 .probe = zx234290_rtc_probe,
1176 .remove = zx234290_rtc_remove,
1177 .suspend = zx234290_rtc_suspend,
1178 .resume = zx234290_rtc_resume,
1179 .driver = {
1180 .name = "zx234290-rtc",
1181 .owner = THIS_MODULE,
1182 },
1183};
1184
1185
1186module_platform_driver(zx234290_rtc_driver);
1187
1188MODULE_DESCRIPTION("ZX234290 RTC Driver");
1189MODULE_AUTHOR("yuxiang");
1190MODULE_LICENSE("GPL");
1191MODULE_ALIAS("platform:zx234290-rtc");
1192