2 * linux/drivers/acorn/char/i2c.c
4 * Copyright (C) 2000 Russell King
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 * ARM IOC/IOMD i2c driver.
12 * On Acorn machines, the following i2c devices are on the bus:
13 * - PCF8583 real time clock & static RAM
15 #include <linux/capability.h>
16 #include <linux/init.h>
17 #include <linux/sched.h>
18 #include <linux/time.h>
19 #include <linux/miscdevice.h>
20 #include <linux/rtc.h>
21 #include <linux/i2c.h>
22 #include <linux/i2c-algo-bit.h>
25 #include <asm/hardware.h>
27 #include <asm/hardware/ioc.h>
28 #include <asm/system.h>
29 #include <asm/uaccess.h>
33 extern int (*set_rtc
)(void);
35 static struct i2c_client
*rtc_client
;
36 static const unsigned char days_in_mon
[] =
37 { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
39 #define CMOS_CHECKSUM (63)
42 * Acorn machines store the year in the static RAM at
45 #define CMOS_YEAR (64 + 128)
47 static inline int rtc_command(int cmd
, void *data
)
52 ret
= rtc_client
->driver
->command(rtc_client
, cmd
, data
);
58 * Update the century + year bytes in the CMOS RAM, ensuring
59 * that the check byte is correctly adjusted for the change.
61 static int rtc_update_year(unsigned int new_year
)
63 unsigned char yr
[2], chk
;
64 struct mem cmos_year
= { CMOS_YEAR
, sizeof(yr
), yr
};
65 struct mem cmos_check
= { CMOS_CHECKSUM
, 1, &chk
};
68 ret
= rtc_command(MEM_READ
, &cmos_check
);
71 ret
= rtc_command(MEM_READ
, &cmos_year
);
77 yr
[1] = new_year
/ 100;
78 yr
[0] = new_year
% 100;
82 ret
= rtc_command(MEM_WRITE
, &cmos_year
);
84 ret
= rtc_command(MEM_WRITE
, &cmos_check
);
90 * Read the current RTC time and date, and update xtime.
92 static void get_rtc_time(struct rtc_tm
*rtctm
, unsigned int *year
)
94 unsigned char ctrl
, yr
[2];
95 struct mem rtcmem
= { CMOS_YEAR
, sizeof(yr
), yr
};
96 int real_year
, year_offset
;
99 * Ensure that the RTC is running.
101 rtc_command(RTC_GETCTRL
, &ctrl
);
103 unsigned char new_ctrl
= ctrl
& ~0xc0;
105 printk(KERN_WARNING
"RTC: resetting control %02x -> %02x\n",
108 rtc_command(RTC_SETCTRL
, &new_ctrl
);
111 if (rtc_command(RTC_GETDATETIME
, rtctm
) ||
112 rtc_command(MEM_READ
, &rtcmem
))
118 * The RTC year holds the LSB two bits of the current
119 * year, which should reflect the LSB two bits of the
120 * CMOS copy of the year. Any difference indicates
121 * that we have to correct the CMOS version.
123 year_offset
= rtctm
->year_off
- (real_year
& 3);
126 * RTC year wrapped. Adjust it appropriately.
130 *year
= real_year
+ year_offset
+ yr
[1] * 100;
133 static int set_rtc_time(struct rtc_tm
*rtctm
, unsigned int year
)
138 leap
= (!(year
% 4) && (year
% 100)) || !(year
% 400);
140 if (rtctm
->mon
> 12 || rtctm
->mon
== 0 || rtctm
->mday
== 0)
143 if (rtctm
->mday
> (days_in_mon
[rtctm
->mon
] + (rtctm
->mon
== 2 && leap
)))
146 if (rtctm
->hours
>= 24 || rtctm
->mins
>= 60 || rtctm
->secs
>= 60)
150 * The RTC's own 2-bit year must reflect the least
151 * significant two bits of the CMOS year.
153 rtctm
->year_off
= (year
% 100) & 3;
155 ret
= rtc_command(RTC_SETDATETIME
, rtctm
);
157 ret
= rtc_update_year(year
);
163 * Set the RTC time only. Note that
164 * we do not touch the date.
166 static int k_set_rtc_time(void)
168 struct rtc_tm new_rtctm
, old_rtctm
;
169 unsigned long nowtime
= xtime
.tv_sec
;
171 if (rtc_command(RTC_GETDATETIME
, &old_rtctm
))
174 new_rtctm
.cs
= xtime
.tv_nsec
/ 10000000;
175 new_rtctm
.secs
= nowtime
% 60; nowtime
/= 60;
176 new_rtctm
.mins
= nowtime
% 60; nowtime
/= 60;
177 new_rtctm
.hours
= nowtime
% 24;
180 * avoid writing when we're going to change the day
181 * of the month. We will retry in the next minute.
182 * This basically means that if the RTC must not drift
183 * by more than 1 minute in 11 minutes.
185 * [ rtc: 1/1/2000 23:58:00, real 2/1/2000 00:01:00,
186 * rtc gets set to 1/1/2000 00:01:00 ]
188 if ((old_rtctm
.hours
== 23 && old_rtctm
.mins
== 59) ||
189 (new_rtctm
.hours
== 23 && new_rtctm
.mins
== 59))
192 return rtc_command(RTC_SETTIME
, &new_rtctm
);
195 static int rtc_ioctl(struct inode
*inode
, struct file
*file
,
196 unsigned int cmd
, unsigned long arg
)
199 struct rtc_time rtctm
;
200 struct rtc_tm rtc_raw
;
208 memset(&rtctm
, 0, sizeof(struct rtc_time
));
209 get_rtc_time(&rtc_raw
, &year
);
210 rtctm
.tm_sec
= rtc_raw
.secs
;
211 rtctm
.tm_min
= rtc_raw
.mins
;
212 rtctm
.tm_hour
= rtc_raw
.hours
;
213 rtctm
.tm_mday
= rtc_raw
.mday
;
214 rtctm
.tm_mon
= rtc_raw
.mon
- 1; /* month starts at 0 */
215 rtctm
.tm_year
= year
- 1900; /* starts at 1900 */
216 return copy_to_user((void *)arg
, &rtctm
, sizeof(rtctm
))
220 if (!capable(CAP_SYS_TIME
))
223 if (copy_from_user(&rtctm
, (void *)arg
, sizeof(rtctm
)))
225 rtc_raw
.secs
= rtctm
.tm_sec
;
226 rtc_raw
.mins
= rtctm
.tm_min
;
227 rtc_raw
.hours
= rtctm
.tm_hour
;
228 rtc_raw
.mday
= rtctm
.tm_mday
;
229 rtc_raw
.mon
= rtctm
.tm_mon
+ 1;
230 year
= rtctm
.tm_year
+ 1900;
231 return set_rtc_time(&rtc_raw
, year
);
235 return put_user(1900, (unsigned long *)arg
);
241 static struct file_operations rtc_fops
= {
245 static struct miscdevice rtc_dev
= {
251 /* IOC / IOMD i2c driver */
253 #define FORCE_ONES 0xdc
258 * We must preserve all non-i2c output bits in IOC_CONTROL.
259 * Note also that we need to preserve the value of SCL and
260 * SDA outputs as well (which may be different from the
261 * values read back from IOC_CONTROL).
263 static u_int force_ones
;
265 static void ioc_setscl(void *data
, int state
)
267 u_int ioc_control
= ioc_readb(IOC_CONTROL
) & ~(SCL
| SDA
);
268 u_int ones
= force_ones
;
277 ioc_writeb(ioc_control
| ones
, IOC_CONTROL
);
280 static void ioc_setsda(void *data
, int state
)
282 u_int ioc_control
= ioc_readb(IOC_CONTROL
) & ~(SCL
| SDA
);
283 u_int ones
= force_ones
;
292 ioc_writeb(ioc_control
| ones
, IOC_CONTROL
);
295 static int ioc_getscl(void *data
)
297 return (ioc_readb(IOC_CONTROL
) & SCL
) != 0;
300 static int ioc_getsda(void *data
)
302 return (ioc_readb(IOC_CONTROL
) & SDA
) != 0;
305 static struct i2c_algo_bit_data ioc_data
= {
306 .setsda
= ioc_setsda
,
307 .setscl
= ioc_setscl
,
308 .getsda
= ioc_getsda
,
309 .getscl
= ioc_getscl
,
314 static int ioc_client_reg(struct i2c_client
*client
)
316 if (client
->driver
->id
== I2C_DRIVERID_PCF8583
&&
317 client
->addr
== 0x50) {
323 get_rtc_time(&rtctm
, &year
);
325 tv
.tv_nsec
= rtctm
.cs
* 10000000;
326 tv
.tv_sec
= mktime(year
, rtctm
.mon
, rtctm
.mday
,
327 rtctm
.hours
, rtctm
.mins
, rtctm
.secs
);
328 do_settimeofday(&tv
);
329 set_rtc
= k_set_rtc_time
;
335 static int ioc_client_unreg(struct i2c_client
*client
)
337 if (client
== rtc_client
) {
345 static struct i2c_adapter ioc_ops
= {
347 .algo_data
= &ioc_data
,
348 .client_register
= ioc_client_reg
,
349 .client_unregister
= ioc_client_unreg
,
352 static int __init
i2c_ioc_init(void)
356 force_ones
= FORCE_ONES
| SCL
| SDA
;
358 ret
= i2c_bit_add_bus(&ioc_ops
);
361 ret
= misc_register(&rtc_dev
);
363 i2c_del_adapter(&ioc_ops
);
369 __initcall(i2c_ioc_init
);