linux/drivers/mfd/ab8500-i2c.c
<<
>>
Prefs
   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
  17static 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
  27static 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
  40static 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
  72static 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
  82static 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
  91static int __init ab8500_i2c_init(void)
  92{
  93        return platform_driver_register(&ab8500_i2c_driver);
  94}
  95
  96static void __exit ab8500_i2c_exit(void)
  97{
  98        platform_driver_unregister(&ab8500_i2c_driver);
  99}
 100arch_initcall(ab8500_i2c_init);
 101module_exit(ab8500_i2c_exit);
 102
 103MODULE_AUTHOR("Mattias WALLIN <mattias.wallin@stericsson.com");
 104MODULE_DESCRIPTION("AB8500 Core access via PRCMU I2C");
 105MODULE_LICENSE("GPL v2");
 106