1 /* 2 * include/asm-ppc/todc.h 3 * 4 * Definitions for the M48Txx and mc146818 series of Time of day/Real Time 5 * Clock chips. 6 * 7 * Author: Mark A. Greer 8 * mgreer@mvista.com 9 * 10 * 2001 (c) MontaVista, Software, Inc. This file is licensed under 11 * the terms of the GNU General Public License version 2. This program 12 * is licensed "as is" without any warranty of any kind, whether express 13 * or implied. 14 */ 15 16 /* 17 * Support for the M48T37/M48T59/.../mc146818 Real Time Clock chips. 18 * Purpose is to make one generic file that handles all of these chips instead 19 * of every platform implementing the same code over & over again. 20 */ 21 22 #ifndef __PPC_KERNEL_TODC_H 23 #define __PPC_KERNEL_TODC_H 24 25 typedef struct { 26 uint rtc_type; /* your particular chip */ 27 28 /* 29 * Following are the addresses of the AS0, AS1, and DATA registers 30 * of these chips. Note that these are board-specific. 31 */ 32 unsigned char *nvram_as0; 33 unsigned char *nvram_as1; 34 unsigned char *nvram_data; 35 36 /* 37 * Define bits to stop external set of regs from changing so 38 * the chip can be read/written reliably. 39 */ 40 unsigned char enable_read; 41 unsigned char enable_write; 42 43 /* 44 * Following is the number of AS0 address bits. This is normally 45 * 8 but some bad hardware routes address lines incorrectly. 46 */ 47 int as0_bits; 48 49 int nvram_size; /* Size of NVRAM on chip */ 50 int sw_flags; /* Software control flags */ 51 52 /* Following are the register offsets for the particular chip */ 53 int year; 54 int month; 55 int day_of_month; 56 int day_of_week; 57 int hours; 58 int minutes; 59 int seconds; 60 int control_b; 61 int control_a; 62 int watchdog; 63 int interrupts; 64 int alarm_date; 65 int alarm_hour; 66 int alarm_minutes; 67 int alarm_seconds; 68 int century; 69 int flags; 70 71 /* 72 * Some RTC chips have their NVRAM buried behind a addr/data pair of 73 * regs on the first level/clock registers. The following fields 74 * are the addresses for those addr/data regs. 75 */ 76 int nvram_addr_reg; 77 int nvram_data_reg; 78 } todc_info_t; 79 80 /* 81 * Define the types of TODC/RTC variants that are supported in 82 * arch/ppc/kernel/todc_time.c 83 * Make a new one of these for any chip somehow differs from what's already 84 * defined. That way, if you ever need to put in code to touch those 85 * bits/registers in todc_time.c, you can put it inside an 86 * 'if (todc_info->rtc_type == TODC_TYPE_XXX)' so you won't break 87 * anyone else. 88 */ 89 #define TODC_TYPE_MK48T35 1 90 #define TODC_TYPE_MK48T37 2 91 #define TODC_TYPE_MK48T59 3 92 #define TODC_TYPE_DS1693 4 /* Dallas DS1693 RTC */ 93 #define TODC_TYPE_DS1743 5 /* Dallas DS1743 RTC */ 94 #define TODC_TYPE_DS1746 6 /* Dallas DS1746 RTC */ 95 #define TODC_TYPE_DS1747 7 /* Dallas DS1747 RTC */ 96 #define TODC_TYPE_DS1501 8 /* Dallas DS1501 RTC */ 97 #define TODC_TYPE_DS1643 9 /* Dallas DS1643 RTC */ 98 #define TODC_TYPE_PC97307 10 /* PC97307 internal RTC */ 99 #define TODC_TYPE_DS1557 11 /* Dallas DS1557 RTC */ 100 #define TODC_TYPE_MC146818 100 /* Leave room for m48txx's */ 101 102 /* 103 * Bit to clear/set to enable reads/writes to the chip 104 */ 105 #define TODC_MK48TXX_CNTL_A_R 0x40 106 #define TODC_MK48TXX_CNTL_A_W 0x80 107 #define TODC_MK48TXX_DAY_CB 0x80 108 109 #define TODC_DS1501_CNTL_B_TE 0x80 110 111 /* 112 * Define flag bits used by todc routines. 113 */ 114 #define TODC_FLAG_2_LEVEL_NVRAM 0x00000001 115 116 /* 117 * Define the values for the various RTC's that should to into the todc_info 118 * table. 119 * Note: The XXX_NVRAM_SIZE, XXX_NVRAM_ADDR_REG, and XXX_NVRAM_DATA_REG only 120 * matter if XXX_SW_FLAGS has TODC_FLAG_2_LEVEL_NVRAM set. 121 */ 122 #define TODC_TYPE_MK48T35_NVRAM_SIZE 0x7ff8 123 #define TODC_TYPE_MK48T35_SW_FLAGS 0 124 #define TODC_TYPE_MK48T35_YEAR 0x7fff 125 #define TODC_TYPE_MK48T35_MONTH 0x7ffe 126 #define TODC_TYPE_MK48T35_DOM 0x7ffd /* Day of Month */ 127 #define TODC_TYPE_MK48T35_DOW 0x7ffc /* Day of Week */ 128 #define TODC_TYPE_MK48T35_HOURS 0x7ffb 129 #define TODC_TYPE_MK48T35_MINUTES 0x7ffa 130 #define TODC_TYPE_MK48T35_SECONDS 0x7ff9 131 #define TODC_TYPE_MK48T35_CNTL_B 0x7ff9 132 #define TODC_TYPE_MK48T35_CNTL_A 0x7ff8 133 #define TODC_TYPE_MK48T35_WATCHDOG 0x0000 134 #define TODC_TYPE_MK48T35_INTERRUPTS 0x0000 135 #define TODC_TYPE_MK48T35_ALARM_DATE 0x0000 136 #define TODC_TYPE_MK48T35_ALARM_HOUR 0x0000 137 #define TODC_TYPE_MK48T35_ALARM_MINUTES 0x0000 138 #define TODC_TYPE_MK48T35_ALARM_SECONDS 0x0000 139 #define TODC_TYPE_MK48T35_CENTURY 0x0000 140 #define TODC_TYPE_MK48T35_FLAGS 0x0000 141 #define TODC_TYPE_MK48T35_NVRAM_ADDR_REG 0 142 #define TODC_TYPE_MK48T35_NVRAM_DATA_REG 0 143 144 #define TODC_TYPE_MK48T37_NVRAM_SIZE 0x7ff0 145 #define TODC_TYPE_MK48T37_SW_FLAGS 0 146 #define TODC_TYPE_MK48T37_YEAR 0x7fff 147 #define TODC_TYPE_MK48T37_MONTH 0x7ffe 148 #define TODC_TYPE_MK48T37_DOM 0x7ffd /* Day of Month */ 149 #define TODC_TYPE_MK48T37_DOW 0x7ffc /* Day of Week */ 150 #define TODC_TYPE_MK48T37_HOURS 0x7ffb 151 #define TODC_TYPE_MK48T37_MINUTES 0x7ffa 152 #define TODC_TYPE_MK48T37_SECONDS 0x7ff9 153 #define TODC_TYPE_MK48T37_CNTL_B 0x7ff9 154 #define TODC_TYPE_MK48T37_CNTL_A 0x7ff8 155 #define TODC_TYPE_MK48T37_WATCHDOG 0x7ff7 156 #define TODC_TYPE_MK48T37_INTERRUPTS 0x7ff6 157 #define TODC_TYPE_MK48T37_ALARM_DATE 0x7ff5 158 #define TODC_TYPE_MK48T37_ALARM_HOUR 0x7ff4 159 #define TODC_TYPE_MK48T37_ALARM_MINUTES 0x7ff3 160 #define TODC_TYPE_MK48T37_ALARM_SECONDS 0x7ff2 161 #define TODC_TYPE_MK48T37_CENTURY 0x7ff1 162 #define TODC_TYPE_MK48T37_FLAGS 0x7ff0 163 #define TODC_TYPE_MK48T37_NVRAM_ADDR_REG 0 164 #define TODC_TYPE_MK48T37_NVRAM_DATA_REG 0 165 166 #define TODC_TYPE_MK48T59_NVRAM_SIZE 0x1ff0 167 #define TODC_TYPE_MK48T59_SW_FLAGS 0 168 #define TODC_TYPE_MK48T59_YEAR 0x1fff 169 #define TODC_TYPE_MK48T59_MONTH 0x1ffe 170 #define TODC_TYPE_MK48T59_DOM 0x1ffd /* Day of Month */ 171 #define TODC_TYPE_MK48T59_DOW 0x1ffc /* Day of Week */ 172 #define TODC_TYPE_MK48T59_HOURS 0x1ffb 173 #define TODC_TYPE_MK48T59_MINUTES 0x1ffa 174 #define TODC_TYPE_MK48T59_SECONDS 0x1ff9 175 #define TODC_TYPE_MK48T59_CNTL_B 0x1ff9 176 #define TODC_TYPE_MK48T59_CNTL_A 0x1ff8 177 #define TODC_TYPE_MK48T59_WATCHDOG 0x1fff 178 #define TODC_TYPE_MK48T59_INTERRUPTS 0x1fff 179 #define TODC_TYPE_MK48T59_ALARM_DATE 0x1fff 180 #define TODC_TYPE_MK48T59_ALARM_HOUR 0x1fff 181 #define TODC_TYPE_MK48T59_ALARM_MINUTES 0x1fff 182 #define TODC_TYPE_MK48T59_ALARM_SECONDS 0x1fff 183 #define TODC_TYPE_MK48T59_CENTURY 0x1fff 184 #define TODC_TYPE_MK48T59_FLAGS 0x1fff 185 #define TODC_TYPE_MK48T59_NVRAM_ADDR_REG 0 186 #define TODC_TYPE_MK48T59_NVRAM_DATA_REG 0 187 188 #define TODC_TYPE_DS1501_NVRAM_SIZE 0x100 189 #define TODC_TYPE_DS1501_SW_FLAGS TODC_FLAG_2_LEVEL_NVRAM 190 #define TODC_TYPE_DS1501_YEAR (TODC_TYPE_DS1501_NVRAM_SIZE + 0x06) 191 #define TODC_TYPE_DS1501_MONTH (TODC_TYPE_DS1501_NVRAM_SIZE + 0x05) 192 #define TODC_TYPE_DS1501_DOM (TODC_TYPE_DS1501_NVRAM_SIZE + 0x04) 193 #define TODC_TYPE_DS1501_DOW (TODC_TYPE_DS1501_NVRAM_SIZE + 0x03) 194 #define TODC_TYPE_DS1501_HOURS (TODC_TYPE_DS1501_NVRAM_SIZE + 0x02) 195 #define TODC_TYPE_DS1501_MINUTES (TODC_TYPE_DS1501_NVRAM_SIZE + 0x01) 196 #define TODC_TYPE_DS1501_SECONDS (TODC_TYPE_DS1501_NVRAM_SIZE + 0x00) 197 #define TODC_TYPE_DS1501_CNTL_B (TODC_TYPE_DS1501_NVRAM_SIZE + 0x0f) 198 #define TODC_TYPE_DS1501_CNTL_A (TODC_TYPE_DS1501_NVRAM_SIZE + 0x0f) 199 #define TODC_TYPE_DS1501_WATCHDOG (TODC_TYPE_DS1501_NVRAM_SIZE + 0xff) 200 #define TODC_TYPE_DS1501_INTERRUPTS (TODC_TYPE_DS1501_NVRAM_SIZE + 0xff) 201 #define TODC_TYPE_DS1501_ALARM_DATE (TODC_TYPE_DS1501_NVRAM_SIZE + 0x0b) 202 #define TODC_TYPE_DS1501_ALARM_HOUR (TODC_TYPE_DS1501_NVRAM_SIZE + 0x0a) 203 #define TODC_TYPE_DS1501_ALARM_MINUTES (TODC_TYPE_DS1501_NVRAM_SIZE + 0x09) 204 #define TODC_TYPE_DS1501_ALARM_SECONDS (TODC_TYPE_DS1501_NVRAM_SIZE + 0x08) 205 #define TODC_TYPE_DS1501_CENTURY (TODC_TYPE_DS1501_NVRAM_SIZE + 0x07) 206 #define TODC_TYPE_DS1501_FLAGS (TODC_TYPE_DS1501_NVRAM_SIZE + 0xff) 207 #define TODC_TYPE_DS1501_NVRAM_ADDR_REG 0x10 208 #define TODC_TYPE_DS1501_NVRAM_DATA_REG 0x13 209 210 #define TODC_TYPE_DS1557_NVRAM_SIZE 0x7fff0 211 #define TODC_TYPE_DS1557_SW_FLAGS 0 212 #define TODC_TYPE_DS1557_YEAR 0x7ffff 213 #define TODC_TYPE_DS1557_MONTH 0x7fffe 214 #define TODC_TYPE_DS1557_DOM 0x7fffd /* Day of Month */ 215 #define TODC_TYPE_DS1557_DOW 0x7fffc /* Day of Week */ 216 #define TODC_TYPE_DS1557_HOURS 0x7fffb 217 #define TODC_TYPE_DS1557_MINUTES 0x7fffa 218 #define TODC_TYPE_DS1557_SECONDS 0x7fff9 219 #define TODC_TYPE_DS1557_CNTL_B 0x7fff9 220 #define TODC_TYPE_DS1557_CNTL_A 0x7fff8 /* control_a R/W regs */ 221 #define TODC_TYPE_DS1557_WATCHDOG 0x7fff7 222 #define TODC_TYPE_DS1557_INTERRUPTS 0x7fff6 223 #define TODC_TYPE_DS1557_ALARM_DATE 0x7fff5 224 #define TODC_TYPE_DS1557_ALARM_HOUR 0x7fff4 225 #define TODC_TYPE_DS1557_ALARM_MINUTES 0x7fff3 226 #define TODC_TYPE_DS1557_ALARM_SECONDS 0x7fff2 227 #define TODC_TYPE_DS1557_CENTURY 0x7fff8 228 #define TODC_TYPE_DS1557_FLAGS 0x7fff0 229 #define TODC_TYPE_DS1557_NVRAM_ADDR_REG 0 230 #define TODC_TYPE_DS1557_NVRAM_DATA_REG 0 231 232 #define TODC_TYPE_DS1643_NVRAM_SIZE 0x1ff8 233 #define TODC_TYPE_DS1643_SW_FLAGS 0 234 #define TODC_TYPE_DS1643_YEAR 0x1fff 235 #define TODC_TYPE_DS1643_MONTH 0x1ffe 236 #define TODC_TYPE_DS1643_DOM 0x1ffd /* Day of Month */ 237 #define TODC_TYPE_DS1643_DOW 0x1ffc /* Day of Week */ 238 #define TODC_TYPE_DS1643_HOURS 0x1ffb 239 #define TODC_TYPE_DS1643_MINUTES 0x1ffa 240 #define TODC_TYPE_DS1643_SECONDS 0x1ff9 241 #define TODC_TYPE_DS1643_CNTL_B 0x1ff9 242 #define TODC_TYPE_DS1643_CNTL_A 0x1ff8 /* control_a R/W regs */ 243 #define TODC_TYPE_DS1643_WATCHDOG 0x1fff 244 #define TODC_TYPE_DS1643_INTERRUPTS 0x1fff 245 #define TODC_TYPE_DS1643_ALARM_DATE 0x1fff 246 #define TODC_TYPE_DS1643_ALARM_HOUR 0x1fff 247 #define TODC_TYPE_DS1643_ALARM_MINUTES 0x1fff 248 #define TODC_TYPE_DS1643_ALARM_SECONDS 0x1fff 249 #define TODC_TYPE_DS1643_CENTURY 0x1ff8 250 #define TODC_TYPE_DS1643_FLAGS 0x1fff 251 #define TODC_TYPE_DS1643_NVRAM_ADDR_REG 0 252 #define TODC_TYPE_DS1643_NVRAM_DATA_REG 0 253 254 #define TODC_TYPE_DS1693_NVRAM_SIZE 0 /* Not handled yet */ 255 #define TODC_TYPE_DS1693_SW_FLAGS 0 256 #define TODC_TYPE_DS1693_YEAR 0x09 257 #define TODC_TYPE_DS1693_MONTH 0x08 258 #define TODC_TYPE_DS1693_DOM 0x07 /* Day of Month */ 259 #define TODC_TYPE_DS1693_DOW 0x06 /* Day of Week */ 260 #define TODC_TYPE_DS1693_HOURS 0x04 261 #define TODC_TYPE_DS1693_MINUTES 0x02 262 #define TODC_TYPE_DS1693_SECONDS 0x00 263 #define TODC_TYPE_DS1693_CNTL_B 0x0b 264 #define TODC_TYPE_DS1693_CNTL_A 0x0a 265 #define TODC_TYPE_DS1693_WATCHDOG 0xff 266 #define TODC_TYPE_DS1693_INTERRUPTS 0xff 267 #define TODC_TYPE_DS1693_ALARM_DATE 0x49 268 #define TODC_TYPE_DS1693_ALARM_HOUR 0x05 269 #define TODC_TYPE_DS1693_ALARM_MINUTES 0x03 270 #define TODC_TYPE_DS1693_ALARM_SECONDS 0x01 271 #define TODC_TYPE_DS1693_CENTURY 0x48 272 #define TODC_TYPE_DS1693_FLAGS 0xff 273 #define TODC_TYPE_DS1693_NVRAM_ADDR_REG 0 274 #define TODC_TYPE_DS1693_NVRAM_DATA_REG 0 275 276 #define TODC_TYPE_DS1743_NVRAM_SIZE 0x1ff8 277 #define TODC_TYPE_DS1743_SW_FLAGS 0 278 #define TODC_TYPE_DS1743_YEAR 0x1fff 279 #define TODC_TYPE_DS1743_MONTH 0x1ffe 280 #define TODC_TYPE_DS1743_DOM 0x1ffd /* Day of Month */ 281 #define TODC_TYPE_DS1743_DOW 0x1ffc /* Day of Week */ 282 #define TODC_TYPE_DS1743_HOURS 0x1ffb 283 #define TODC_TYPE_DS1743_MINUTES 0x1ffa 284 #define TODC_TYPE_DS1743_SECONDS 0x1ff9 285 #define TODC_TYPE_DS1743_CNTL_B 0x1ff9 286 #define TODC_TYPE_DS1743_CNTL_A 0x1ff8 /* control_a R/W regs */ 287 #define TODC_TYPE_DS1743_WATCHDOG 0x1fff 288 #define TODC_TYPE_DS1743_INTERRUPTS 0x1fff 289 #define TODC_TYPE_DS1743_ALARM_DATE 0x1fff 290 #define TODC_TYPE_DS1743_ALARM_HOUR 0x1fff 291 #define TODC_TYPE_DS1743_ALARM_MINUTES 0x1fff 292 #define TODC_TYPE_DS1743_ALARM_SECONDS 0x1fff 293 #define TODC_TYPE_DS1743_CENTURY 0x1ff8 294 #define TODC_TYPE_DS1743_FLAGS 0x1fff 295 #define TODC_TYPE_DS1743_NVRAM_ADDR_REG 0 296 #define TODC_TYPE_DS1743_NVRAM_DATA_REG 0 297 298 #define TODC_TYPE_DS1746_NVRAM_SIZE 0x1fff8 299 #define TODC_TYPE_DS1746_SW_FLAGS 0 300 #define TODC_TYPE_DS1746_YEAR 0x1ffff 301 #define TODC_TYPE_DS1746_MONTH 0x1fffe 302 #define TODC_TYPE_DS1746_DOM 0x1fffd /* Day of Month */ 303 #define TODC_TYPE_DS1746_DOW 0x1fffc /* Day of Week */ 304 #define TODC_TYPE_DS1746_HOURS 0x1fffb 305 #define TODC_TYPE_DS1746_MINUTES 0x1fffa 306 #define TODC_TYPE_DS1746_SECONDS 0x1fff9 307 #define TODC_TYPE_DS1746_CNTL_B 0x1fff9 308 #define TODC_TYPE_DS1746_CNTL_A 0x1fff8 /* control_a R/W regs */ 309 #define TODC_TYPE_DS1746_WATCHDOG 0x00000 310 #define TODC_TYPE_DS1746_INTERRUPTS 0x00000 311 #define TODC_TYPE_DS1746_ALARM_DATE 0x00000 312 #define TODC_TYPE_DS1746_ALARM_HOUR 0x00000 313 #define TODC_TYPE_DS1746_ALARM_MINUTES 0x00000 314 #define TODC_TYPE_DS1746_ALARM_SECONDS 0x00000 315 #define TODC_TYPE_DS1746_CENTURY 0x00000 316 #define TODC_TYPE_DS1746_FLAGS 0x00000 317 #define TODC_TYPE_DS1746_NVRAM_ADDR_REG 0 318 #define TODC_TYPE_DS1746_NVRAM_DATA_REG 0 319 320 #define TODC_TYPE_DS1747_NVRAM_SIZE 0x7fff8 321 #define TODC_TYPE_DS1747_SW_FLAGS 0 322 #define TODC_TYPE_DS1747_YEAR 0x7ffff 323 #define TODC_TYPE_DS1747_MONTH 0x7fffe 324 #define TODC_TYPE_DS1747_DOM 0x7fffd /* Day of Month */ 325 #define TODC_TYPE_DS1747_DOW 0x7fffc /* Day of Week */ 326 #define TODC_TYPE_DS1747_HOURS 0x7fffb 327 #define TODC_TYPE_DS1747_MINUTES 0x7fffa 328 #define TODC_TYPE_DS1747_SECONDS 0x7fff9 329 #define TODC_TYPE_DS1747_CNTL_B 0x7fff9 330 #define TODC_TYPE_DS1747_CNTL_A 0x7fff8 /* control_a R/W regs */ 331 #define TODC_TYPE_DS1747_WATCHDOG 0x00000 332 #define TODC_TYPE_DS1747_INTERRUPTS 0x00000 333 #define TODC_TYPE_DS1747_ALARM_DATE 0x00000 334 #define TODC_TYPE_DS1747_ALARM_HOUR 0x00000 335 #define TODC_TYPE_DS1747_ALARM_MINUTES 0x00000 336 #define TODC_TYPE_DS1747_ALARM_SECONDS 0x00000 337 #define TODC_TYPE_DS1747_CENTURY 0x00000 338 #define TODC_TYPE_DS1747_FLAGS 0x00000 339 #define TODC_TYPE_DS1747_NVRAM_ADDR_REG 0 340 #define TODC_TYPE_DS1747_NVRAM_DATA_REG 0 341 342 #define TODC_TYPE_MC146818_NVRAM_SIZE 0 /* XXXX */ 343 #define TODC_TYPE_MC146818_SW_FLAGS 0 344 #define TODC_TYPE_MC146818_YEAR 0x09 345 #define TODC_TYPE_MC146818_MONTH 0x08 346 #define TODC_TYPE_MC146818_DOM 0x07 /* Day of Month */ 347 #define TODC_TYPE_MC146818_DOW 0x06 /* Day of Week */ 348 #define TODC_TYPE_MC146818_HOURS 0x04 349 #define TODC_TYPE_MC146818_MINUTES 0x02 350 #define TODC_TYPE_MC146818_SECONDS 0x00 351 #define TODC_TYPE_MC146818_CNTL_B 0x0a 352 #define TODC_TYPE_MC146818_CNTL_A 0x0b /* control_a R/W regs */ 353 #define TODC_TYPE_MC146818_WATCHDOG 0 354 #define TODC_TYPE_MC146818_INTERRUPTS 0x0c 355 #define TODC_TYPE_MC146818_ALARM_DATE 0xff 356 #define TODC_TYPE_MC146818_ALARM_HOUR 0x05 357 #define TODC_TYPE_MC146818_ALARM_MINUTES 0x03 358 #define TODC_TYPE_MC146818_ALARM_SECONDS 0x01 359 #define TODC_TYPE_MC146818_CENTURY 0xff 360 #define TODC_TYPE_MC146818_FLAGS 0xff 361 #define TODC_TYPE_MC146818_NVRAM_ADDR_REG 0 362 #define TODC_TYPE_MC146818_NVRAM_DATA_REG 0 363 364 #define TODC_TYPE_PC97307_NVRAM_SIZE 0 /* No NVRAM? */ 365 #define TODC_TYPE_PC97307_SW_FLAGS 0 366 #define TODC_TYPE_PC97307_YEAR 0x09 367 #define TODC_TYPE_PC97307_MONTH 0x08 368 #define TODC_TYPE_PC97307_DOM 0x07 /* Day of Month */ 369 #define TODC_TYPE_PC97307_DOW 0x06 /* Day of Week */ 370 #define TODC_TYPE_PC97307_HOURS 0x04 371 #define TODC_TYPE_PC97307_MINUTES 0x02 372 #define TODC_TYPE_PC97307_SECONDS 0x00 373 #define TODC_TYPE_PC97307_CNTL_B 0x0a 374 #define TODC_TYPE_PC97307_CNTL_A 0x0b /* control_a R/W regs */ 375 #define TODC_TYPE_PC97307_WATCHDOG 0x0c 376 #define TODC_TYPE_PC97307_INTERRUPTS 0x0d 377 #define TODC_TYPE_PC97307_ALARM_DATE 0xff 378 #define TODC_TYPE_PC97307_ALARM_HOUR 0x05 379 #define TODC_TYPE_PC97307_ALARM_MINUTES 0x03 380 #define TODC_TYPE_PC97307_ALARM_SECONDS 0x01 381 #define TODC_TYPE_PC97307_CENTURY 0xff 382 #define TODC_TYPE_PC97307_FLAGS 0xff 383 #define TODC_TYPE_PC97307_NVRAM_ADDR_REG 0 384 #define TODC_TYPE_PC97307_NVRAM_DATA_REG 0 385 386 /* 387 * Define macros to allocate and init the todc_info_t table that will 388 * be used by the todc_time.c routines. 389 */ 390 #define TODC_ALLOC() \ 391 static todc_info_t todc_info_alloc; \ 392 todc_info_t *todc_info = &todc_info_alloc; 393 394 #define TODC_INIT(clock_type, as0, as1, data, bits) { \ 395 todc_info->rtc_type = clock_type; \ 396 \ 397 todc_info->nvram_as0 = (unsigned char *)(as0); \ 398 todc_info->nvram_as1 = (unsigned char *)(as1); \ 399 todc_info->nvram_data = (unsigned char *)(data); \ 400 \ 401 todc_info->as0_bits = (bits); \ 402 \ 403 todc_info->nvram_size = clock_type ##_NVRAM_SIZE; \ 404 todc_info->sw_flags = clock_type ##_SW_FLAGS; \ 405 \ 406 todc_info->year = clock_type ##_YEAR; \ 407 todc_info->month = clock_type ##_MONTH; \ 408 todc_info->day_of_month = clock_type ##_DOM; \ 409 todc_info->day_of_week = clock_type ##_DOW; \ 410 todc_info->hours = clock_type ##_HOURS; \ 411 todc_info->minutes = clock_type ##_MINUTES; \ 412 todc_info->seconds = clock_type ##_SECONDS; \ 413 todc_info->control_b = clock_type ##_CNTL_B; \ 414 todc_info->control_a = clock_type ##_CNTL_A; \ 415 todc_info->watchdog = clock_type ##_WATCHDOG; \ 416 todc_info->interrupts = clock_type ##_INTERRUPTS; \ 417 todc_info->alarm_date = clock_type ##_ALARM_DATE; \ 418 todc_info->alarm_hour = clock_type ##_ALARM_HOUR; \ 419 todc_info->alarm_minutes = clock_type ##_ALARM_MINUTES; \ 420 todc_info->alarm_seconds = clock_type ##_ALARM_SECONDS; \ 421 todc_info->century = clock_type ##_CENTURY; \ 422 todc_info->flags = clock_type ##_FLAGS; \ 423 \ 424 todc_info->nvram_addr_reg = clock_type ##_NVRAM_ADDR_REG; \ 425 todc_info->nvram_data_reg = clock_type ##_NVRAM_DATA_REG; \ 426 } 427 428 #ifndef BCD_TO_BIN 429 #define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10) 430 #endif 431 432 #ifndef BIN_TO_BCD 433 #define BIN_TO_BCD(val) ((val)=(((val)/10)<<4) + (val)%10) 434 #endif 435 436 extern todc_info_t *todc_info; 437 438 unsigned char todc_direct_read_val(int addr); 439 void todc_direct_write_val(int addr, unsigned char val); 440 unsigned char todc_m48txx_read_val(int addr); 441 void todc_m48txx_write_val(int addr, unsigned char val); 442 unsigned char todc_mc146818_read_val(int addr); 443 void todc_mc146818_write_val(int addr, unsigned char val); 444 445 long todc_time_init(void); 446 unsigned long todc_get_rtc_time(void); 447 int todc_set_rtc_time(unsigned long nowtime); 448 void todc_calibrate_decr(void); 449 450 #endif /* __PPC_KERNEL_TODC_H */ 451