wl1251: add tx queue status to debugfs
[safe/jmp/linux-2.6] / drivers / rtc / rtc-cmos.c
index f1695d7..f7a4701 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/spinlock.h>
 #include <linux/platform_device.h>
 #include <linux/mod_devicetable.h>
+#include <linux/log2.h>
 
 /* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */
 #include <asm-generic/rtc.h>
@@ -58,7 +59,7 @@ struct cmos_rtc {
 };
 
 /* both platform and pnp busses use negative numbers for invalid irqs */
-#define is_valid_irq(n)                ((n) >= 0)
+#define is_valid_irq(n)                ((n) > 0)
 
 static const char driver_name[] = "rtc_cmos";
 
@@ -240,26 +241,26 @@ static int cmos_read_alarm(struct device *dev, struct rtc_wkalrm *t)
        /* REVISIT this assumes PC style usage:  always BCD */
 
        if (((unsigned)t->time.tm_sec) < 0x60)
-               t->time.tm_sec = BCD2BIN(t->time.tm_sec);
+               t->time.tm_sec = bcd2bin(t->time.tm_sec);
        else
                t->time.tm_sec = -1;
        if (((unsigned)t->time.tm_min) < 0x60)
-               t->time.tm_min = BCD2BIN(t->time.tm_min);
+               t->time.tm_min = bcd2bin(t->time.tm_min);
        else
                t->time.tm_min = -1;
        if (((unsigned)t->time.tm_hour) < 0x24)
-               t->time.tm_hour = BCD2BIN(t->time.tm_hour);
+               t->time.tm_hour = bcd2bin(t->time.tm_hour);
        else
                t->time.tm_hour = -1;
 
        if (cmos->day_alrm) {
                if (((unsigned)t->time.tm_mday) <= 0x31)
-                       t->time.tm_mday = BCD2BIN(t->time.tm_mday);
+                       t->time.tm_mday = bcd2bin(t->time.tm_mday);
                else
                        t->time.tm_mday = -1;
                if (cmos->mon_alrm) {
                        if (((unsigned)t->time.tm_mon) <= 0x12)
-                               t->time.tm_mon = BCD2BIN(t->time.tm_mon) - 1;
+                               t->time.tm_mon = bcd2bin(t->time.tm_mon) - 1;
                        else
                                t->time.tm_mon = -1;
                }
@@ -331,19 +332,19 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
        /* Writing 0xff means "don't care" or "match all".  */
 
        mon = t->time.tm_mon + 1;
-       mon = (mon <= 12) ? BIN2BCD(mon) : 0xff;
+       mon = (mon <= 12) ? bin2bcd(mon) : 0xff;
 
        mday = t->time.tm_mday;
-       mday = (mday >= 1 && mday <= 31) ? BIN2BCD(mday) : 0xff;
+       mday = (mday >= 1 && mday <= 31) ? bin2bcd(mday) : 0xff;
 
        hrs = t->time.tm_hour;
-       hrs = (hrs < 24) ? BIN2BCD(hrs) : 0xff;
+       hrs = (hrs < 24) ? bin2bcd(hrs) : 0xff;
 
        min = t->time.tm_min;
-       min = (min < 60) ? BIN2BCD(min) : 0xff;
+       min = (min < 60) ? bin2bcd(min) : 0xff;
 
        sec = t->time.tm_sec;
-       sec = (sec < 60) ? BIN2BCD(sec) : 0xff;
+       sec = (sec < 60) ? bin2bcd(sec) : 0xff;
 
        spin_lock_irq(&rtc_lock);
 
@@ -384,6 +385,8 @@ static int cmos_irq_set_freq(struct device *dev, int freq)
        if (!is_valid_irq(cmos->irq))
                return -ENXIO;
 
+       if (!is_power_of_2(freq))
+               return -EINVAL;
        /* 0 = no irqs; 1 = 2^15 Hz ... 15 = 2^0 Hz */
        f = ffs(freq);
        if (f-- > 16)
@@ -592,7 +595,6 @@ static struct bin_attribute nvram = {
        .attr = {
                .name   = "nvram",
                .mode   = S_IRUGO | S_IWUSR,
-               .owner  = THIS_MODULE,
        },
 
        .read   = cmos_nvram_read,
@@ -730,7 +732,7 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
 
        cmos_rtc.dev = dev;
        dev_set_drvdata(dev, &cmos_rtc);
-       rename_region(ports, cmos_rtc.rtc->dev.bus_id);
+       rename_region(ports, dev_name(&cmos_rtc.rtc->dev));
 
        spin_lock_irq(&rtc_lock);
 
@@ -778,7 +780,7 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
                        rtc_cmos_int_handler = cmos_interrupt;
 
                retval = request_irq(rtc_irq, rtc_cmos_int_handler,
-                               IRQF_DISABLED, cmos_rtc.rtc->dev.bus_id,
+                               IRQF_DISABLED, dev_name(&cmos_rtc.rtc->dev),
                                cmos_rtc.rtc);
                if (retval < 0) {
                        dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq);
@@ -795,17 +797,15 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
                goto cleanup2;
        }
 
-       pr_info("%s: alarms up to one %s%s, %zd bytes nvram, %s irqs\n",
-                       cmos_rtc.rtc->dev.bus_id,
-                       is_valid_irq(rtc_irq)
-                               ?  (cmos_rtc.mon_alrm
-                                       ? "year"
-                                       : (cmos_rtc.day_alrm
-                                               ? "month" : "day"))
-                               : "no",
-                       cmos_rtc.century ? ", y3k" : "",
-                       nvram.size,
-                       is_hpet_enabled() ? ", hpet irqs" : "");
+       pr_info("%s: %s%s, %zd bytes nvram%s\n",
+               dev_name(&cmos_rtc.rtc->dev),
+               !is_valid_irq(rtc_irq) ? "no alarms" :
+                       cmos_rtc.mon_alrm ? "alarms up to one year" :
+                       cmos_rtc.day_alrm ? "alarms up to one month" :
+                       "alarms up to one day",
+               cmos_rtc.century ? ", y3k" : "",
+               nvram.size,
+               is_hpet_enabled() ? ", hpet irqs" : "");
 
        return 0;
 
@@ -886,7 +886,7 @@ static int cmos_suspend(struct device *dev, pm_message_t mesg)
        }
 
        pr_debug("%s: suspend%s, ctrl %02x\n",
-                       cmos_rtc.rtc->dev.bus_id,
+                       dev_name(&cmos_rtc.rtc->dev),
                        (tmp & RTC_AIE) ? ", alarm may wake" : "",
                        tmp);
 
@@ -942,7 +942,7 @@ static int cmos_resume(struct device *dev)
        }
 
        pr_debug("%s: resume, ctrl %02x\n",
-                       cmos_rtc.rtc->dev.bus_id,
+                       dev_name(&cmos_rtc.rtc->dev),
                        tmp);
 
        return 0;
@@ -1174,23 +1174,34 @@ static struct platform_driver cmos_platform_driver = {
        }
 };
 
+#ifdef CONFIG_PNP
+static bool pnp_driver_registered;
+#endif
+static bool platform_driver_registered;
+
 static int __init cmos_init(void)
 {
        int retval = 0;
 
 #ifdef CONFIG_PNP
-       pnp_register_driver(&cmos_pnp_driver);
+       retval = pnp_register_driver(&cmos_pnp_driver);
+       if (retval == 0)
+               pnp_driver_registered = true;
 #endif
 
-       if (!cmos_rtc.dev)
+       if (!cmos_rtc.dev) {
                retval = platform_driver_probe(&cmos_platform_driver,
                                               cmos_platform_probe);
+               if (retval == 0)
+                       platform_driver_registered = true;
+       }
 
        if (retval == 0)
                return 0;
 
 #ifdef CONFIG_PNP
-       pnp_unregister_driver(&cmos_pnp_driver);
+       if (pnp_driver_registered)
+               pnp_unregister_driver(&cmos_pnp_driver);
 #endif
        return retval;
 }
@@ -1199,9 +1210,11 @@ module_init(cmos_init);
 static void __exit cmos_exit(void)
 {
 #ifdef CONFIG_PNP
-       pnp_unregister_driver(&cmos_pnp_driver);
+       if (pnp_driver_registered)
+               pnp_unregister_driver(&cmos_pnp_driver);
 #endif
-       platform_driver_unregister(&cmos_platform_driver);
+       if (platform_driver_registered)
+               platform_driver_unregister(&cmos_platform_driver);
 }
 module_exit(cmos_exit);