Merge branch 'for-linus' of git://git.infradead.org/users/eparis/notify
[pandora-kernel.git] / drivers / mfd / ab8500-i2c.c
1 /*
2  * Copyright (C) ST-Ericsson SA 2010
3  * Author: Mattias Wallin <mattias.wallin@stericsson.com> for ST-Ericsson.
4  * License Terms: GNU General Public License v2
5  * This file was based on drivers/mfd/ab8500-spi.c
6  */
7
8 #include <linux/kernel.h>
9 #include <linux/slab.h>
10 #include <linux/init.h>
11 #include <linux/module.h>
12 #include <linux/platform_device.h>
13 #include <linux/mfd/ab8500.h>
14
15 #include <mach/prcmu.h>
16
17 static int ab8500_i2c_write(struct ab8500 *ab8500, u16 addr, u8 data)
18 {
19         int ret;
20
21         ret = prcmu_abb_write((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1);
22         if (ret < 0)
23                 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
24         return ret;
25 }
26
27 static int ab8500_i2c_read(struct ab8500 *ab8500, u16 addr)
28 {
29         int ret;
30         u8 data;
31
32         ret = prcmu_abb_read((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1);
33         if (ret < 0) {
34                 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
35                 return ret;
36         }
37         return (int)data;
38 }
39
40 static int __devinit ab8500_i2c_probe(struct platform_device *plf)
41 {
42         struct ab8500 *ab8500;
43         struct resource *resource;
44         int ret;
45
46         ab8500 = kzalloc(sizeof *ab8500, GFP_KERNEL);
47         if (!ab8500)
48                 return -ENOMEM;
49
50         ab8500->dev = &plf->dev;
51
52         resource = platform_get_resource(plf, IORESOURCE_IRQ, 0);
53         if (!resource) {
54                 kfree(ab8500);
55                 return -ENODEV;
56         }
57
58         ab8500->irq = resource->start;
59
60         ab8500->read = ab8500_i2c_read;
61         ab8500->write = ab8500_i2c_write;
62
63         platform_set_drvdata(plf, ab8500);
64
65         ret = ab8500_init(ab8500);
66         if (ret)
67                 kfree(ab8500);
68
69         return ret;
70 }
71
72 static int __devexit ab8500_i2c_remove(struct platform_device *plf)
73 {
74         struct ab8500 *ab8500 = platform_get_drvdata(plf);
75
76         ab8500_exit(ab8500);
77         kfree(ab8500);
78
79         return 0;
80 }
81
82 static struct platform_driver ab8500_i2c_driver = {
83         .driver = {
84                 .name = "ab8500-i2c",
85                 .owner = THIS_MODULE,
86         },
87         .probe  = ab8500_i2c_probe,
88         .remove = __devexit_p(ab8500_i2c_remove)
89 };
90
91 static int __init ab8500_i2c_init(void)
92 {
93         return platform_driver_register(&ab8500_i2c_driver);
94 }
95
96 static void __exit ab8500_i2c_exit(void)
97 {
98         platform_driver_unregister(&ab8500_i2c_driver);
99 }
100 subsys_initcall(ab8500_i2c_init);
101 module_exit(ab8500_i2c_exit);
102
103 MODULE_AUTHOR("Mattias WALLIN <mattias.wallin@stericsson.com");
104 MODULE_DESCRIPTION("AB8500 Core access via PRCMU I2C");
105 MODULE_LICENSE("GPL v2");