Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

CHAR: Delete old and now unused M48T35 RTC driver for SGI IP27.

It was only used by this one SGI platform which recently was converted to
RTC_LIB and with RTC_LIB enabled the legacy drivers are no more selectable.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

-369
-1
arch/mips/configs/ip27_defconfig
··· 701 701 # CONFIG_WATCHDOG is not set 702 702 CONFIG_HW_RANDOM=m 703 703 # CONFIG_RTC is not set 704 - CONFIG_SGI_IP27_RTC=y 705 704 # CONFIG_R3964 is not set 706 705 # CONFIG_APPLICOM is not set 707 706 # CONFIG_DRM is not set
-27
arch/mips/include/asm/m48t35.h
··· 1 - /* 2 - * Registers for the SGS-Thomson M48T35 Timekeeper RAM chip 3 - */ 4 - #ifndef _ASM_M48T35_H 5 - #define _ASM_M48T35_H 6 - 7 - #include <linux/spinlock.h> 8 - 9 - extern spinlock_t rtc_lock; 10 - 11 - struct m48t35_rtc { 12 - volatile u8 pad[0x7ff8]; /* starts at 0x7ff8 */ 13 - volatile u8 control; 14 - volatile u8 sec; 15 - volatile u8 min; 16 - volatile u8 hour; 17 - volatile u8 day; 18 - volatile u8 date; 19 - volatile u8 month; 20 - volatile u8 year; 21 - }; 22 - 23 - #define M48T35_RTC_SET 0x80 24 - #define M48T35_RTC_STOPPED 0x80 25 - #define M48T35_RTC_READ 0x40 26 - 27 - #endif /* _ASM_M48T35_H */
-11
drivers/char/Kconfig
··· 812 812 To compile this driver as a module, choose M here: the 813 813 module will be called js-rtc. 814 814 815 - config SGI_IP27_RTC 816 - bool "SGI M48T35 RTC support" 817 - depends on SGI_IP27 818 - help 819 - If you say Y here and create a character special file /dev/rtc with 820 - major number 10 and minor number 135 using mknod ("man mknod"), you 821 - will get access to the real time clock built into your computer. 822 - Every SGI has such a clock built in. It reports status information 823 - via the file /proc/rtc and its behaviour is set by various ioctls on 824 - /dev/rtc. 825 - 826 815 config GEN_RTC 827 816 tristate "Generic /dev/rtc emulation" 828 817 depends on RTC!=y && !IA64 && !ARM && !M32R && !MIPS && !SPARC && !FRV && !S390 && !SUPERH && !AVR32
-1
drivers/char/Makefile
··· 74 74 obj-$(CONFIG_HPET) += hpet.o 75 75 obj-$(CONFIG_GEN_RTC) += genrtc.o 76 76 obj-$(CONFIG_EFI_RTC) += efirtc.o 77 - obj-$(CONFIG_SGI_IP27_RTC) += ip27-rtc.o 78 77 obj-$(CONFIG_DS1302) += ds1302.o 79 78 obj-$(CONFIG_XILINX_HWICAP) += xilinx_hwicap/ 80 79 ifeq ($(CONFIG_GENERIC_NVRAM),y)
-329
drivers/char/ip27-rtc.c
··· 1 - /* 2 - * Driver for the SGS-Thomson M48T35 Timekeeper RAM chip 3 - * 4 - * Real Time Clock interface for Linux 5 - * 6 - * TODO: Implement periodic interrupts. 7 - * 8 - * Copyright (C) 2000 Silicon Graphics, Inc. 9 - * Written by Ulf Carlsson (ulfc@engr.sgi.com) 10 - * 11 - * Based on code written by Paul Gortmaker. 12 - * 13 - * This driver allows use of the real time clock (built into 14 - * nearly all computers) from user space. It exports the /dev/rtc 15 - * interface supporting various ioctl() and also the /proc/rtc 16 - * pseudo-file for status information. 17 - * 18 - * This program is free software; you can redistribute it and/or 19 - * modify it under the terms of the GNU General Public License 20 - * as published by the Free Software Foundation; either version 21 - * 2 of the License, or (at your option) any later version. 22 - * 23 - */ 24 - 25 - #define RTC_VERSION "1.09b" 26 - 27 - #include <linux/bcd.h> 28 - #include <linux/module.h> 29 - #include <linux/kernel.h> 30 - #include <linux/smp_lock.h> 31 - #include <linux/types.h> 32 - #include <linux/miscdevice.h> 33 - #include <linux/ioport.h> 34 - #include <linux/fcntl.h> 35 - #include <linux/rtc.h> 36 - #include <linux/init.h> 37 - #include <linux/poll.h> 38 - #include <linux/proc_fs.h> 39 - 40 - #include <asm/m48t35.h> 41 - #include <asm/sn/ioc3.h> 42 - #include <asm/io.h> 43 - #include <asm/uaccess.h> 44 - #include <asm/system.h> 45 - #include <asm/sn/klconfig.h> 46 - #include <asm/sn/sn0/ip27.h> 47 - #include <asm/sn/sn0/hub.h> 48 - #include <asm/sn/sn_private.h> 49 - 50 - static long rtc_ioctl(struct file *filp, unsigned int cmd, 51 - unsigned long arg); 52 - 53 - static int rtc_read_proc(char *page, char **start, off_t off, 54 - int count, int *eof, void *data); 55 - 56 - static void get_rtc_time(struct rtc_time *rtc_tm); 57 - 58 - /* 59 - * Bits in rtc_status. (6 bits of room for future expansion) 60 - */ 61 - 62 - #define RTC_IS_OPEN 0x01 /* means /dev/rtc is in use */ 63 - #define RTC_TIMER_ON 0x02 /* missed irq timer active */ 64 - 65 - static unsigned char rtc_status; /* bitmapped status byte. */ 66 - static unsigned long rtc_freq; /* Current periodic IRQ rate */ 67 - static struct m48t35_rtc *rtc; 68 - 69 - /* 70 - * If this driver ever becomes modularised, it will be really nice 71 - * to make the epoch retain its value across module reload... 72 - */ 73 - 74 - static unsigned long epoch = 1970; /* year corresponding to 0x00 */ 75 - 76 - static const unsigned char days_in_mo[] = 77 - {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 78 - 79 - static long rtc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 80 - { 81 - 82 - struct rtc_time wtime; 83 - 84 - switch (cmd) { 85 - case RTC_RD_TIME: /* Read the time/date from RTC */ 86 - { 87 - get_rtc_time(&wtime); 88 - break; 89 - } 90 - case RTC_SET_TIME: /* Set the RTC */ 91 - { 92 - struct rtc_time rtc_tm; 93 - unsigned char mon, day, hrs, min, sec, leap_yr; 94 - unsigned int yrs; 95 - 96 - if (!capable(CAP_SYS_TIME)) 97 - return -EACCES; 98 - 99 - if (copy_from_user(&rtc_tm, (struct rtc_time*)arg, 100 - sizeof(struct rtc_time))) 101 - return -EFAULT; 102 - 103 - yrs = rtc_tm.tm_year + 1900; 104 - mon = rtc_tm.tm_mon + 1; /* tm_mon starts at zero */ 105 - day = rtc_tm.tm_mday; 106 - hrs = rtc_tm.tm_hour; 107 - min = rtc_tm.tm_min; 108 - sec = rtc_tm.tm_sec; 109 - 110 - if (yrs < 1970) 111 - return -EINVAL; 112 - 113 - leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400)); 114 - 115 - if ((mon > 12) || (day == 0)) 116 - return -EINVAL; 117 - 118 - if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr))) 119 - return -EINVAL; 120 - 121 - if ((hrs >= 24) || (min >= 60) || (sec >= 60)) 122 - return -EINVAL; 123 - 124 - if ((yrs -= epoch) > 255) /* They are unsigned */ 125 - return -EINVAL; 126 - 127 - if (yrs > 169) 128 - return -EINVAL; 129 - 130 - if (yrs >= 100) 131 - yrs -= 100; 132 - 133 - sec = bin2bcd(sec); 134 - min = bin2bcd(min); 135 - hrs = bin2bcd(hrs); 136 - day = bin2bcd(day); 137 - mon = bin2bcd(mon); 138 - yrs = bin2bcd(yrs); 139 - 140 - spin_lock_irq(&rtc_lock); 141 - rtc->control |= M48T35_RTC_SET; 142 - rtc->year = yrs; 143 - rtc->month = mon; 144 - rtc->date = day; 145 - rtc->hour = hrs; 146 - rtc->min = min; 147 - rtc->sec = sec; 148 - rtc->control &= ~M48T35_RTC_SET; 149 - spin_unlock_irq(&rtc_lock); 150 - 151 - return 0; 152 - } 153 - default: 154 - return -EINVAL; 155 - } 156 - return copy_to_user((void *)arg, &wtime, sizeof wtime) ? -EFAULT : 0; 157 - } 158 - 159 - /* 160 - * We enforce only one user at a time here with the open/close. 161 - * Also clear the previous interrupt data on an open, and clean 162 - * up things on a close. 163 - */ 164 - 165 - static int rtc_open(struct inode *inode, struct file *file) 166 - { 167 - lock_kernel(); 168 - spin_lock_irq(&rtc_lock); 169 - 170 - if (rtc_status & RTC_IS_OPEN) { 171 - spin_unlock_irq(&rtc_lock); 172 - unlock_kernel(); 173 - return -EBUSY; 174 - } 175 - 176 - rtc_status |= RTC_IS_OPEN; 177 - spin_unlock_irq(&rtc_lock); 178 - unlock_kernel(); 179 - 180 - return 0; 181 - } 182 - 183 - static int rtc_release(struct inode *inode, struct file *file) 184 - { 185 - /* 186 - * Turn off all interrupts once the device is no longer 187 - * in use, and clear the data. 188 - */ 189 - 190 - spin_lock_irq(&rtc_lock); 191 - rtc_status &= ~RTC_IS_OPEN; 192 - spin_unlock_irq(&rtc_lock); 193 - 194 - return 0; 195 - } 196 - 197 - /* 198 - * The various file operations we support. 199 - */ 200 - 201 - static const struct file_operations rtc_fops = { 202 - .owner = THIS_MODULE, 203 - .unlocked_ioctl = rtc_ioctl, 204 - .open = rtc_open, 205 - .release = rtc_release, 206 - }; 207 - 208 - static struct miscdevice rtc_dev= 209 - { 210 - RTC_MINOR, 211 - "rtc", 212 - &rtc_fops 213 - }; 214 - 215 - static int __init rtc_init(void) 216 - { 217 - rtc = (struct m48t35_rtc *) 218 - (KL_CONFIG_CH_CONS_INFO(master_nasid)->memory_base + IOC3_BYTEBUS_DEV0); 219 - 220 - printk(KERN_INFO "Real Time Clock Driver v%s\n", RTC_VERSION); 221 - if (misc_register(&rtc_dev)) { 222 - printk(KERN_ERR "rtc: cannot register misc device.\n"); 223 - return -ENODEV; 224 - } 225 - if (!create_proc_read_entry("driver/rtc", 0, NULL, rtc_read_proc, NULL)) { 226 - printk(KERN_ERR "rtc: cannot create /proc/rtc.\n"); 227 - misc_deregister(&rtc_dev); 228 - return -ENOENT; 229 - } 230 - 231 - rtc_freq = 1024; 232 - 233 - return 0; 234 - } 235 - 236 - static void __exit rtc_exit (void) 237 - { 238 - /* interrupts and timer disabled at this point by rtc_release */ 239 - 240 - remove_proc_entry ("rtc", NULL); 241 - misc_deregister(&rtc_dev); 242 - } 243 - 244 - module_init(rtc_init); 245 - module_exit(rtc_exit); 246 - 247 - /* 248 - * Info exported via "/proc/rtc". 249 - */ 250 - 251 - static int rtc_get_status(char *buf) 252 - { 253 - char *p; 254 - struct rtc_time tm; 255 - 256 - /* 257 - * Just emulate the standard /proc/rtc 258 - */ 259 - 260 - p = buf; 261 - 262 - get_rtc_time(&tm); 263 - 264 - /* 265 - * There is no way to tell if the luser has the RTC set for local 266 - * time or for Universal Standard Time (GMT). Probably local though. 267 - */ 268 - p += sprintf(p, 269 - "rtc_time\t: %02d:%02d:%02d\n" 270 - "rtc_date\t: %04d-%02d-%02d\n" 271 - "rtc_epoch\t: %04lu\n" 272 - "24hr\t\t: yes\n", 273 - tm.tm_hour, tm.tm_min, tm.tm_sec, 274 - tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, epoch); 275 - 276 - return p - buf; 277 - } 278 - 279 - static int rtc_read_proc(char *page, char **start, off_t off, 280 - int count, int *eof, void *data) 281 - { 282 - int len = rtc_get_status(page); 283 - if (len <= off+count) *eof = 1; 284 - *start = page + off; 285 - len -= off; 286 - if (len>count) len = count; 287 - if (len<0) len = 0; 288 - return len; 289 - } 290 - 291 - static void get_rtc_time(struct rtc_time *rtc_tm) 292 - { 293 - /* 294 - * Do we need to wait for the last update to finish? 295 - */ 296 - 297 - /* 298 - * Only the values that we read from the RTC are set. We leave 299 - * tm_wday, tm_yday and tm_isdst untouched. Even though the 300 - * RTC has RTC_DAY_OF_WEEK, we ignore it, as it is only updated 301 - * by the RTC when initially set to a non-zero value. 302 - */ 303 - spin_lock_irq(&rtc_lock); 304 - rtc->control |= M48T35_RTC_READ; 305 - rtc_tm->tm_sec = rtc->sec; 306 - rtc_tm->tm_min = rtc->min; 307 - rtc_tm->tm_hour = rtc->hour; 308 - rtc_tm->tm_mday = rtc->date; 309 - rtc_tm->tm_mon = rtc->month; 310 - rtc_tm->tm_year = rtc->year; 311 - rtc->control &= ~M48T35_RTC_READ; 312 - spin_unlock_irq(&rtc_lock); 313 - 314 - rtc_tm->tm_sec = bcd2bin(rtc_tm->tm_sec); 315 - rtc_tm->tm_min = bcd2bin(rtc_tm->tm_min); 316 - rtc_tm->tm_hour = bcd2bin(rtc_tm->tm_hour); 317 - rtc_tm->tm_mday = bcd2bin(rtc_tm->tm_mday); 318 - rtc_tm->tm_mon = bcd2bin(rtc_tm->tm_mon); 319 - rtc_tm->tm_year = bcd2bin(rtc_tm->tm_year); 320 - 321 - /* 322 - * Account for differences between how the RTC uses the values 323 - * and how they are defined in a struct rtc_time; 324 - */ 325 - if ((rtc_tm->tm_year += (epoch - 1900)) <= 69) 326 - rtc_tm->tm_year += 100; 327 - 328 - rtc_tm->tm_mon--; 329 - }