Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block
[safe/jmp/linux-2.6] / drivers / mfd / ezx-pcap.c
index 732664f..134c69a 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/mfd/ezx-pcap.h>
 #include <linux/spi/spi.h>
 #include <linux/gpio.h>
+#include <linux/slab.h>
 
 #define PCAP_ADC_MAXQ          8
 struct pcap_adc_request {
@@ -107,6 +108,29 @@ int ezx_pcap_read(struct pcap_chip *pcap, u8 reg_num, u32 *value)
 }
 EXPORT_SYMBOL_GPL(ezx_pcap_read);
 
+int ezx_pcap_set_bits(struct pcap_chip *pcap, u8 reg_num, u32 mask, u32 val)
+{
+       int ret;
+       u32 tmp = PCAP_REGISTER_READ_OP_BIT |
+               (reg_num << PCAP_REGISTER_ADDRESS_SHIFT);
+
+       mutex_lock(&pcap->io_mutex);
+       ret = ezx_pcap_putget(pcap, &tmp);
+       if (ret)
+               goto out_unlock;
+
+       tmp &= (PCAP_REGISTER_VALUE_MASK & ~mask);
+       tmp |= (val & mask) | PCAP_REGISTER_WRITE_OP_BIT |
+               (reg_num << PCAP_REGISTER_ADDRESS_SHIFT);
+
+       ret = ezx_pcap_putget(pcap, &tmp);
+out_unlock:
+       mutex_unlock(&pcap->io_mutex);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(ezx_pcap_set_bits);
+
 /* IRQ */
 int irq_to_pcap(struct pcap_chip *pcap, int irq)
 {
@@ -364,7 +388,6 @@ static int __devinit pcap_add_subdev(struct pcap_chip *pcap,
        pdev = platform_device_alloc(subdev->name, subdev->id);
        pdev->dev.parent = &pcap->spi->dev;
        pdev->dev.platform_data = subdev->platform_data;
-       platform_set_drvdata(pdev, pcap);
 
        return platform_device_add(pdev);
 }
@@ -519,9 +542,10 @@ static void __exit ezx_pcap_exit(void)
        spi_unregister_driver(&ezxpcap_driver);
 }
 
-module_init(ezx_pcap_init);
+subsys_initcall(ezx_pcap_init);
 module_exit(ezx_pcap_exit);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Daniel Ribeiro / Harald Welte");
 MODULE_DESCRIPTION("Motorola PCAP2 ASIC Driver");
+MODULE_ALIAS("spi:ezx-pcap");