linux/drivers/misc/ti_dac7512.c
<<
>>
Prefs
   1/*
   2 *  dac7512.c - Linux kernel module for
   3 *      Texas Instruments DAC7512
   4 *
   5 *  Copyright (c) 2009 Daniel Mack <daniel@caiaq.de>
   6 *
   7 *  This program is free software; you can redistribute it and/or modify
   8 *  it under the terms of the GNU General Public License as published by
   9 *  the Free Software Foundation; either version 2 of the License, or
  10 *  (at your option) any later version.
  11 *
  12 *  This program is distributed in the hope that it will be useful,
  13 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 *  GNU General Public License for more details.
  16 *
  17 *  You should have received a copy of the GNU General Public License
  18 *  along with this program; if not, write to the Free Software
  19 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20 */
  21
  22#include <linux/module.h>
  23#include <linux/init.h>
  24#include <linux/spi/spi.h>
  25
  26#define DAC7512_DRV_NAME        "dac7512"
  27#define DRIVER_VERSION          "1.0"
  28
  29static ssize_t dac7512_store_val(struct device *dev,
  30                                 struct device_attribute *attr,
  31                                 const char *buf, size_t count)
  32{
  33        struct spi_device *spi = to_spi_device(dev);
  34        unsigned char tmp[2];
  35        unsigned long val;
  36
  37        if (strict_strtoul(buf, 10, &val) < 0)
  38                return -EINVAL;
  39
  40        tmp[0] = val >> 8;
  41        tmp[1] = val & 0xff;
  42        spi_write(spi, tmp, sizeof(tmp));
  43        return count;
  44}
  45
  46static DEVICE_ATTR(value, S_IWUSR, NULL, dac7512_store_val);
  47
  48static struct attribute *dac7512_attributes[] = {
  49        &dev_attr_value.attr,
  50        NULL
  51};
  52
  53static const struct attribute_group dac7512_attr_group = {
  54        .attrs = dac7512_attributes,
  55};
  56
  57static int __devinit dac7512_probe(struct spi_device *spi)
  58{
  59        int ret;
  60
  61        spi->bits_per_word = 8;
  62        spi->mode = SPI_MODE_0;
  63        ret = spi_setup(spi);
  64        if (ret < 0)
  65                return ret;
  66
  67        return sysfs_create_group(&spi->dev.kobj, &dac7512_attr_group);
  68}
  69
  70static int __devexit dac7512_remove(struct spi_device *spi)
  71{
  72        sysfs_remove_group(&spi->dev.kobj, &dac7512_attr_group);
  73        return 0;
  74}
  75
  76static struct spi_driver dac7512_driver = {
  77        .driver = {
  78                .name   = DAC7512_DRV_NAME,
  79                .owner  = THIS_MODULE,
  80        },
  81        .probe  = dac7512_probe,
  82        .remove = __devexit_p(dac7512_remove),
  83};
  84
  85static int __init dac7512_init(void)
  86{
  87        return spi_register_driver(&dac7512_driver);
  88}
  89
  90static void __exit dac7512_exit(void)
  91{
  92        spi_unregister_driver(&dac7512_driver);
  93}
  94
  95MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>");
  96MODULE_DESCRIPTION("DAC7512 16-bit DAC");
  97MODULE_LICENSE("GPL v2");
  98MODULE_VERSION(DRIVER_VERSION);
  99
 100module_init(dac7512_init);
 101module_exit(dac7512_exit);
 102