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_get_platdata(dev);
  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        if (pdata) {
  79                ucb_gpio.gpio_setup = pdata->gpio_setup;
  80                ucb_gpio.gpio_teardown = pdata->gpio_teardown;
  81                ucb_gpio.gpio_offset = pdata->gpio_offset;
  82        }
  83        ucb->ucb1400_gpio = platform_device_alloc("ucb1400_gpio", -1);
  84        if (!ucb->ucb1400_gpio) {
  85                err = -ENOMEM;
  86                goto err0;
  87        }
  88        err = platform_device_add_data(ucb->ucb1400_gpio, &ucb_gpio,
  89                                        sizeof(ucb_gpio));
  90        if (err)
  91                goto err1;
  92        err = platform_device_add(ucb->ucb1400_gpio);
  93        if (err)
  94                goto err1;
  95
  96        /* TOUCHSCREEN */
  97        ucb_ts.ac97 = ac97;
  98
  99        if (pdata != NULL && pdata->irq >= 0)
 100                ucb_ts.irq = pdata->irq;
 101        else
 102                ucb_ts.irq = -1;
 103
 104        ucb->ucb1400_ts = platform_device_alloc("ucb1400_ts", -1);
 105        if (!ucb->ucb1400_ts) {
 106                err = -ENOMEM;
 107                goto err2;
 108        }
 109        err = platform_device_add_data(ucb->ucb1400_ts, &ucb_ts,
 110                                        sizeof(ucb_ts));
 111        if (err)
 112                goto err3;
 113        err = platform_device_add(ucb->ucb1400_ts);
 114        if (err)
 115                goto err3;
 116
 117        return 0;
 118
 119err3:
 120        platform_device_put(ucb->ucb1400_ts);
 121err2:
 122        platform_device_del(ucb->ucb1400_gpio);
 123err1:
 124        platform_device_put(ucb->ucb1400_gpio);
 125err0:
 126        kfree(ucb);
 127err:
 128        return err;
 129}
 130
 131static int ucb1400_core_remove(struct device *dev)
 132{
 133        struct ucb1400 *ucb = dev_get_drvdata(dev);
 134
 135        platform_device_unregister(ucb->ucb1400_ts);
 136        platform_device_unregister(ucb->ucb1400_gpio);
 137
 138        kfree(ucb);
 139        return 0;
 140}
 141
 142static struct device_driver ucb1400_core_driver = {
 143        .name   = "ucb1400_core",
 144        .bus    = &ac97_bus_type,
 145        .probe  = ucb1400_core_probe,
 146        .remove = ucb1400_core_remove,
 147};
 148
 149static int __init ucb1400_core_init(void)
 150{
 151        return driver_register(&ucb1400_core_driver);
 152}
 153
 154static void __exit ucb1400_core_exit(void)
 155{
 156        driver_unregister(&ucb1400_core_driver);
 157}
 158
 159module_init(ucb1400_core_init);
 160module_exit(ucb1400_core_exit);
 161
 162MODULE_DESCRIPTION("Philips UCB1400 driver");
 163MODULE_LICENSE("GPL");
 164
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.