linux/drivers/mfd/ucb1400_core.c
<<
>>
Prefs
   1/*
   2 * Core functions for:
   3 *  Philips UCB1400 multifunction chip
   4 *
   5 * Based on ucb1400_ts.c:
   6 *  Author:     Nicolas Pitre
   7 *  Created:    September 25, 2006
   8 *  Copyright:  MontaVista Software, Inc.
   9 *
  10 * Spliting done by: Marek Vasut <marek.vasut@gmail.com>
  11 * If something doesn't work and it worked before spliting, e-mail me,
  12 * dont bother Nicolas please ;-)
  13 *
  14 * This program is free software; you can redistribute it and/or modify
  15 * it under the terms of the GNU General Public License version 2 as
  16 * published by the Free Software Foundation.
  17 *
  18 * This code is heavily based on ucb1x00-*.c copyrighted by Russell King
  19 * covering the UCB1100, UCB1200 and UCB1300..  Support for the UCB1400 has
  20 * been made separate from ucb1x00-core/ucb1x00-ts on Russell's request.
  21 */
  22
  23#include <linux/module.h>
  24#include <linux/sched.h>
  25#include <linux/slab.h>
  26#include <linux/ucb1400.h>
  27
  28unsigned int ucb1400_adc_read(struct snd_ac97 *ac97, u16 adc_channel,
  29                int adcsync)
  30{
  31        unsigned int val;
  32
  33        if (adcsync)
  34                adc_channel |= UCB_ADC_SYNC_ENA;
  35
  36        ucb1400_reg_write(ac97, UCB_ADC_CR, UCB_ADC_ENA | adc_channel);
  37        ucb1400_reg_write(ac97, UCB_ADC_CR, UCB_ADC_ENA | adc_channel |
  38                        UCB_ADC_START);
  39
  40        while (!((val = ucb1400_reg_read(ac97, UCB_ADC_DATA))
  41                                & UCB_ADC_DAT_VALID))
  42                schedule_timeout_uninterruptible(1);
  43
  44        return val & UCB_ADC_DAT_MASK;
  45}
  46EXPORT_SYMBOL_GPL(ucb1400_adc_read);
  47
  48static int ucb1400_core_probe(struct device *dev)
  49{
  50        int err;
  51        struct ucb1400 *ucb;
  52        struct ucb1400_ts ucb_ts;
  53        struct ucb1400_gpio ucb_gpio;
  54        struct snd_ac97 *ac97;
  55        struct ucb1400_pdata *pdata = dev->platform_data;
  56
  57        memset(&ucb_ts, 0, sizeof(ucb_ts));
  58        memset(&ucb_gpio, 0, sizeof(ucb_gpio));
  59
  60        ucb = kzalloc(sizeof(struct ucb1400), GFP_KERNEL);
  61        if (!ucb) {
  62                err = -ENOMEM;
  63                goto err;
  64        }
  65
  66        dev_set_drvdata(dev, ucb);
  67
  68        ac97 = to_ac97_t(dev);
  69
  70        ucb_ts.id = ucb1400_reg_read(ac97, UCB_ID);
  71        if (ucb_ts.id != UCB_ID_1400) {
  72                err = -ENODEV;
  73                goto err0;
  74        }
  75
  76        /* GPIO */
  77        ucb_gpio.ac97 = ac97;
  78        ucb->ucb1400_gpio = platform_device_alloc("ucb1400_gpio", -1);
  79        if (!ucb->ucb1400_gpio) {
  80                err = -ENOMEM;
  81                goto err0;
  82        }
  83        err = platform_device_add_data(ucb->ucb1400_gpio, &ucb_gpio,
  84                                        sizeof(ucb_gpio));
  85        if (err)
  86                goto err1;
  87        err = platform_device_add(ucb->ucb1400_gpio);
  88        if (err)
  89                goto err1;
  90
  91        /* TOUCHSCREEN */
  92        ucb_ts.ac97 = ac97;
  93
  94        if (pdata != NULL && pdata->irq >= 0)
  95                ucb_ts.irq = pdata->irq;
  96        else
  97                ucb_ts.irq = -1;
  98
  99        ucb->ucb1400_ts = platform_device_alloc("ucb1400_ts", -1);
 100        if (!ucb->ucb1400_ts) {
 101                err = -ENOMEM;
 102                goto err2;
 103        }
 104        err = platform_device_add_data(ucb->ucb1400_ts, &ucb_ts,
 105                                        sizeof(ucb_ts));
 106        if (err)
 107                goto err3;
 108        err = platform_device_add(ucb->ucb1400_ts);
 109        if (err)
 110                goto err3;
 111
 112        return 0;
 113
 114err3:
 115        platform_device_put(ucb->ucb1400_ts);
 116err2:
 117        platform_device_del(ucb->ucb1400_gpio);
 118err1:
 119        platform_device_put(ucb->ucb1400_gpio);
 120err0:
 121        kfree(ucb);
 122err:
 123        return err;
 124}
 125
 126static int ucb1400_core_remove(struct device *dev)
 127{
 128        struct ucb1400 *ucb = dev_get_drvdata(dev);
 129
 130        platform_device_unregister(ucb->ucb1400_ts);
 131        platform_device_unregister(ucb->ucb1400_gpio);
 132
 133        kfree(ucb);
 134        return 0;
 135}
 136
 137static struct device_driver ucb1400_core_driver = {
 138        .name   = "ucb1400_core",
 139        .bus    = &ac97_bus_type,
 140        .probe  = ucb1400_core_probe,
 141        .remove = ucb1400_core_remove,
 142};
 143
 144static int __init ucb1400_core_init(void)
 145{
 146        return driver_register(&ucb1400_core_driver);
 147}
 148
 149static void __exit ucb1400_core_exit(void)
 150{
 151        driver_unregister(&ucb1400_core_driver);
 152}
 153
 154module_init(ucb1400_core_init);
 155module_exit(ucb1400_core_exit);
 156
 157MODULE_DESCRIPTION("Philips UCB1400 driver");
 158MODULE_LICENSE("GPL");
 159
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.