]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'rtc/rtc-next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Mon, 2 Nov 2015 03:22:13 +0000 (14:22 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Mon, 2 Nov 2015 03:22:13 +0000 (14:22 +1100)
1  2 
drivers/rtc/rtc-ds1343.c
drivers/rtc/rtc-ds1390.c

diff --combined drivers/rtc/rtc-ds1343.c
index 07371a9e37936b7290febc3a0ec08a3c30e37da2,615ce5c370ebde55a84dcd11905084e0acac304d..3d389bd8a289590561d45a0dc3a82697fd659bf4
@@@ -21,6 -21,7 +21,7 @@@
  #include <linux/rtc.h>
  #include <linux/bcd.h>
  #include <linux/pm.h>
+ #include <linux/pm_wakeirq.h>
  #include <linux/slab.h>
  
  #define DS1343_DRV_VERSION    "01.00"
@@@ -663,15 -664,15 +664,15 @@@ static int ds1343_probe(struct spi_devi
  
        if (priv->irq >= 0) {
                res = devm_request_threaded_irq(&spi->dev, spi->irq, NULL,
-                                               ds1343_thread,
-                                               IRQF_NO_SUSPEND | IRQF_ONESHOT,
+                                               ds1343_thread, IRQF_ONESHOT,
                                                "ds1343", priv);
                if (res) {
                        priv->irq = -1;
                        dev_err(&spi->dev,
                                "unable to request irq for rtc ds1343\n");
                } else {
-                       device_set_wakeup_capable(&spi->dev, 1);
+                       device_init_wakeup(&spi->dev, true);
+                       dev_pm_set_wake_irq(&spi->dev, spi->irq);
                }
        }
  
@@@ -692,6 -693,8 +693,8 @@@ static int ds1343_remove(struct spi_dev
                priv->irqen &= ~RTC_AF;
                mutex_unlock(&priv->mutex);
  
+               dev_pm_clear_wake_irq(&spi->dev);
+               device_init_wakeup(&spi->dev, false);
                devm_free_irq(&spi->dev, spi->irq, priv);
        }
  
@@@ -731,6 -734,7 +734,6 @@@ static SIMPLE_DEV_PM_OPS(ds1343_pm, ds1
  static struct spi_driver ds1343_driver = {
        .driver = {
                .name = "ds1343",
 -              .owner = THIS_MODULE,
                .pm = &ds1343_pm,
        },
        .probe = ds1343_probe,
diff --combined drivers/rtc/rtc-ds1390.c
index 4c229c97ef9749ea844685d7923f4cf7fc7f3596,b2b9454aa7a2554b1c66326b9e7b65caed9bcdb2..aa0d2c6f1edc235d00d2da56be0d55b9d88ed44a
@@@ -20,6 -20,7 +20,7 @@@
  #include <linux/spi/spi.h>
  #include <linux/bcd.h>
  #include <linux/slab.h>
+ #include <linux/of.h>
  
  #define DS1390_REG_100THS             0x00
  #define DS1390_REG_SECONDS            0x01
  #define DS1390_REG_STATUS             0x0E
  #define DS1390_REG_TRICKLE            0x0F
  
+ #define DS1390_TRICKLE_CHARGER_ENABLE 0xA0
+ #define DS1390_TRICKLE_CHARGER_250_OHM        0x01
+ #define DS1390_TRICKLE_CHARGER_2K_OHM 0x02
+ #define DS1390_TRICKLE_CHARGER_4K_OHM 0x03
+ #define DS1390_TRICKLE_CHARGER_NO_DIODE       0x04
+ #define DS1390_TRICKLE_CHARGER_DIODE  0x08
  struct ds1390 {
        struct rtc_device *rtc;
        u8 txrx_buf[9]; /* cmd + 8 registers */
  };
  
+ static void ds1390_set_reg(struct device *dev, unsigned char address,
+                          unsigned char data)
+ {
+       struct spi_device *spi = to_spi_device(dev);
+       unsigned char buf[2];
+       /* MSB must be '1' to write */
+       buf[0] = address | 0x80;
+       buf[1] = data;
+       spi_write(spi, buf, 2);
+ }
  static int ds1390_get_reg(struct device *dev, unsigned char address,
                                unsigned char *data)
  {
        if (status != 0)
                return status;
  
-       *data = chip->txrx_buf[1];
+       *data = chip->txrx_buf[0];
  
        return 0;
  }
  
+ static void ds1390_trickle_of_init(struct spi_device *spi)
+ {
+       u32 ohms = 0;
+       u8 value;
+       if (of_property_read_u32(spi->dev.of_node, "trickle-resistor-ohms",
+                                &ohms))
+               goto out;
+       /* Enable charger */
+       value = DS1390_TRICKLE_CHARGER_ENABLE;
+       if (of_property_read_bool(spi->dev.of_node, "trickle-diode-disable"))
+               value |= DS1390_TRICKLE_CHARGER_NO_DIODE;
+       else
+               value |= DS1390_TRICKLE_CHARGER_DIODE;
+       /* Resistor select */
+       switch (ohms) {
+       case 250:
+               value |= DS1390_TRICKLE_CHARGER_250_OHM;
+               break;
+       case 2000:
+               value |= DS1390_TRICKLE_CHARGER_2K_OHM;
+               break;
+       case 4000:
+               value |= DS1390_TRICKLE_CHARGER_4K_OHM;
+               break;
+       default:
+               dev_warn(&spi->dev,
+                        "Unsupported ohm value %02ux in dt\n", ohms);
+               return;
+       }
+       ds1390_set_reg(&spi->dev, DS1390_REG_TRICKLE, value);
+ out:
+       return;
+ }
  static int ds1390_read_time(struct device *dev, struct rtc_time *dt)
  {
        struct spi_device *spi = to_spi_device(dev);
@@@ -143,6 -203,9 +203,9 @@@ static int ds1390_probe(struct spi_devi
                return res;
        }
  
+       if (spi->dev.of_node)
+               ds1390_trickle_of_init(spi);
        chip->rtc = devm_rtc_device_register(&spi->dev, "ds1390",
                                        &ds1390_rtc_ops, THIS_MODULE);
        if (IS_ERR(chip->rtc)) {
  static struct spi_driver ds1390_driver = {
        .driver = {
                .name   = "rtc-ds1390",
 -              .owner  = THIS_MODULE,
        },
        .probe  = ds1390_probe,
  };