Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm: (272 commits) Fix soc_common PCMCIA configuration ARM: 5827/1: SA1100: h3100/h3600: emit messages on failed gpio_request ARM: 5826/1: SA1100: h3100/h3600: always build htc-egpio driver ARM: 5825/1: SA1100: h3600: update defconfig ARM: 5824/1: SA1100: reuse h3600 PCMCIA driver on h3100 ARM: 5823/1: SA1100: h3100/h3600: add support for gpio-keys ARM: 5822/1: SA1100: h3100/h3600: clean up #includes ARM: 5821/1: SA1100: h3100/h3600: revise copyright boilerplates ARM: 5820/1: SA1100: h3100/h3600: split h3600.c ARM: 5819/1: SA1100: h3100/h3600: merge h3600.h and h3600_gpio.h into h3xxx.h ARM: 5818/1: SA1100: h3100/h3600: drop old GPIO definitions ARM: 5817/1: SA1100: h3100/h3600: configure all unused gpios as inputs ARM: 5816/1: SA1100: h3600: remove IRQ_GPIO_* definitions ARM: 5815/1: SA1100: h3100/h3600: remove now unused assign_h3600_egpio handlers ARM: 5814/1: SA1100: h3100/h3600: convert all users of assign_h3600_egpio to gpiolib ARM: 5813/1: SA1100: h3100/h3600: add htc-egpio driver ARM: 5812/1: SA1100: h3100/h3600: separate machine-specific LCD helpers ARM: 5811/2: pcmcia: convert sa1100_h3600 driver to gpiolib ARM: 5799/1: SA1100: h3600: stop setting direction for LCD pins ARM: 5798/1: SA1100: h3600: remove unused cruft from h3600.h ...
This commit is contained in:
@@ -17,11 +17,11 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/mfd/mcp.h>
|
||||
|
||||
#include <mach/dma.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include "mcp.h"
|
||||
|
||||
#define to_mcp(d) container_of(d, struct mcp, attached_device)
|
||||
#define to_mcp_driver(d) container_of(d, struct mcp_driver, drv)
|
||||
|
@@ -19,6 +19,7 @@
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/mcp.h>
|
||||
|
||||
#include <mach/dma.h>
|
||||
#include <mach/hardware.h>
|
||||
@@ -28,7 +29,6 @@
|
||||
|
||||
#include <mach/assabet.h>
|
||||
|
||||
#include "mcp.h"
|
||||
|
||||
struct mcp_sa11x0 {
|
||||
u32 mccr0;
|
||||
@@ -163,6 +163,7 @@ static int mcp_sa11x0_probe(struct platform_device *pdev)
|
||||
mcp->dma_audio_wr = DMA_Ser4MCP0Wr;
|
||||
mcp->dma_telco_rd = DMA_Ser4MCP1Rd;
|
||||
mcp->dma_telco_wr = DMA_Ser4MCP1Wr;
|
||||
mcp->gpio_base = data->gpio_base;
|
||||
|
||||
platform_set_drvdata(pdev, mcp);
|
||||
|
||||
|
@@ -1,66 +0,0 @@
|
||||
/*
|
||||
* linux/drivers/mfd/mcp.h
|
||||
*
|
||||
* Copyright (C) 2001 Russell King, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License.
|
||||
*/
|
||||
#ifndef MCP_H
|
||||
#define MCP_H
|
||||
|
||||
struct mcp_ops;
|
||||
|
||||
struct mcp {
|
||||
struct module *owner;
|
||||
struct mcp_ops *ops;
|
||||
spinlock_t lock;
|
||||
int use_count;
|
||||
unsigned int sclk_rate;
|
||||
unsigned int rw_timeout;
|
||||
dma_device_t dma_audio_rd;
|
||||
dma_device_t dma_audio_wr;
|
||||
dma_device_t dma_telco_rd;
|
||||
dma_device_t dma_telco_wr;
|
||||
struct device attached_device;
|
||||
};
|
||||
|
||||
struct mcp_ops {
|
||||
void (*set_telecom_divisor)(struct mcp *, unsigned int);
|
||||
void (*set_audio_divisor)(struct mcp *, unsigned int);
|
||||
void (*reg_write)(struct mcp *, unsigned int, unsigned int);
|
||||
unsigned int (*reg_read)(struct mcp *, unsigned int);
|
||||
void (*enable)(struct mcp *);
|
||||
void (*disable)(struct mcp *);
|
||||
};
|
||||
|
||||
void mcp_set_telecom_divisor(struct mcp *, unsigned int);
|
||||
void mcp_set_audio_divisor(struct mcp *, unsigned int);
|
||||
void mcp_reg_write(struct mcp *, unsigned int, unsigned int);
|
||||
unsigned int mcp_reg_read(struct mcp *, unsigned int);
|
||||
void mcp_enable(struct mcp *);
|
||||
void mcp_disable(struct mcp *);
|
||||
#define mcp_get_sclk_rate(mcp) ((mcp)->sclk_rate)
|
||||
|
||||
struct mcp *mcp_host_alloc(struct device *, size_t);
|
||||
int mcp_host_register(struct mcp *);
|
||||
void mcp_host_unregister(struct mcp *);
|
||||
|
||||
struct mcp_driver {
|
||||
struct device_driver drv;
|
||||
int (*probe)(struct mcp *);
|
||||
void (*remove)(struct mcp *);
|
||||
int (*suspend)(struct mcp *, pm_message_t);
|
||||
int (*resume)(struct mcp *);
|
||||
};
|
||||
|
||||
int mcp_driver_register(struct mcp_driver *);
|
||||
void mcp_driver_unregister(struct mcp_driver *);
|
||||
|
||||
#define mcp_get_drvdata(mcp) dev_get_drvdata(&(mcp)->attached_device)
|
||||
#define mcp_set_drvdata(mcp,d) dev_set_drvdata(&(mcp)->attached_device, d)
|
||||
|
||||
#define mcp_priv(mcp) ((void *)((mcp)+1))
|
||||
|
||||
#endif
|
@@ -14,10 +14,10 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mfd/ucb1x00.h>
|
||||
|
||||
#include <mach/dma.h>
|
||||
|
||||
#include "ucb1x00.h"
|
||||
|
||||
#define UCB1X00_ATTR(name,input)\
|
||||
static ssize_t name##_show(struct device *dev, struct device_attribute *attr, \
|
||||
|
@@ -25,12 +25,12 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/mfd/ucb1x00.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include <mach/dma.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#include "ucb1x00.h"
|
||||
|
||||
static DEFINE_MUTEX(ucb1x00_mutex);
|
||||
static LIST_HEAD(ucb1x00_drivers);
|
||||
static LIST_HEAD(ucb1x00_devices);
|
||||
@@ -108,6 +108,60 @@ unsigned int ucb1x00_io_read(struct ucb1x00 *ucb)
|
||||
return ucb1x00_reg_read(ucb, UCB_IO_DATA);
|
||||
}
|
||||
|
||||
static void ucb1x00_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
{
|
||||
struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ucb->io_lock, flags);
|
||||
if (value)
|
||||
ucb->io_out |= 1 << offset;
|
||||
else
|
||||
ucb->io_out &= ~(1 << offset);
|
||||
|
||||
ucb1x00_reg_write(ucb, UCB_IO_DATA, ucb->io_out);
|
||||
spin_unlock_irqrestore(&ucb->io_lock, flags);
|
||||
}
|
||||
|
||||
static int ucb1x00_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio);
|
||||
return ucb1x00_reg_read(ucb, UCB_IO_DATA) & (1 << offset);
|
||||
}
|
||||
|
||||
static int ucb1x00_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ucb->io_lock, flags);
|
||||
ucb->io_dir &= ~(1 << offset);
|
||||
ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir);
|
||||
spin_unlock_irqrestore(&ucb->io_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ucb1x00_gpio_direction_output(struct gpio_chip *chip, unsigned offset
|
||||
, int value)
|
||||
{
|
||||
struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ucb->io_lock, flags);
|
||||
ucb->io_dir |= (1 << offset);
|
||||
ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir);
|
||||
|
||||
if (value)
|
||||
ucb->io_out |= 1 << offset;
|
||||
else
|
||||
ucb->io_out &= ~(1 << offset);
|
||||
ucb1x00_reg_write(ucb, UCB_IO_DATA, ucb->io_out);
|
||||
spin_unlock_irqrestore(&ucb->io_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* UCB1300 data sheet says we must:
|
||||
* 1. enable ADC => 5us (including reference startup time)
|
||||
@@ -476,6 +530,7 @@ static int ucb1x00_probe(struct mcp *mcp)
|
||||
struct ucb1x00_driver *drv;
|
||||
unsigned int id;
|
||||
int ret = -ENODEV;
|
||||
int temp;
|
||||
|
||||
mcp_enable(mcp);
|
||||
id = mcp_reg_read(mcp, UCB_ID);
|
||||
@@ -508,12 +563,27 @@ static int ucb1x00_probe(struct mcp *mcp)
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
ucb->gpio.base = -1;
|
||||
if (mcp->gpio_base != 0) {
|
||||
ucb->gpio.label = dev_name(&ucb->dev);
|
||||
ucb->gpio.base = mcp->gpio_base;
|
||||
ucb->gpio.ngpio = 10;
|
||||
ucb->gpio.set = ucb1x00_gpio_set;
|
||||
ucb->gpio.get = ucb1x00_gpio_get;
|
||||
ucb->gpio.direction_input = ucb1x00_gpio_direction_input;
|
||||
ucb->gpio.direction_output = ucb1x00_gpio_direction_output;
|
||||
ret = gpiochip_add(&ucb->gpio);
|
||||
if (ret)
|
||||
goto err_free;
|
||||
} else
|
||||
dev_info(&ucb->dev, "gpio_base not set so no gpiolib support");
|
||||
|
||||
ret = request_irq(ucb->irq, ucb1x00_irq, IRQF_TRIGGER_RISING,
|
||||
"UCB1x00", ucb);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "ucb1x00: unable to grab irq%d: %d\n",
|
||||
ucb->irq, ret);
|
||||
goto err_free;
|
||||
goto err_gpio;
|
||||
}
|
||||
|
||||
mcp_set_drvdata(mcp, ucb);
|
||||
@@ -522,6 +592,7 @@ static int ucb1x00_probe(struct mcp *mcp)
|
||||
if (ret)
|
||||
goto err_irq;
|
||||
|
||||
|
||||
INIT_LIST_HEAD(&ucb->devs);
|
||||
mutex_lock(&ucb1x00_mutex);
|
||||
list_add(&ucb->node, &ucb1x00_devices);
|
||||
@@ -529,10 +600,14 @@ static int ucb1x00_probe(struct mcp *mcp)
|
||||
ucb1x00_add_dev(ucb, drv);
|
||||
}
|
||||
mutex_unlock(&ucb1x00_mutex);
|
||||
|
||||
goto out;
|
||||
|
||||
err_irq:
|
||||
free_irq(ucb->irq, ucb);
|
||||
err_gpio:
|
||||
if (ucb->gpio.base != -1)
|
||||
temp = gpiochip_remove(&ucb->gpio);
|
||||
err_free:
|
||||
kfree(ucb);
|
||||
err_disable:
|
||||
@@ -545,6 +620,7 @@ static void ucb1x00_remove(struct mcp *mcp)
|
||||
{
|
||||
struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
|
||||
struct list_head *l, *n;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&ucb1x00_mutex);
|
||||
list_del(&ucb->node);
|
||||
@@ -554,6 +630,12 @@ static void ucb1x00_remove(struct mcp *mcp)
|
||||
}
|
||||
mutex_unlock(&ucb1x00_mutex);
|
||||
|
||||
if (ucb->gpio.base != -1) {
|
||||
ret = gpiochip_remove(&ucb->gpio);
|
||||
if (ret)
|
||||
dev_err(&ucb->dev, "Can't remove gpio chip: %d\n", ret);
|
||||
}
|
||||
|
||||
free_irq(ucb->irq, ucb);
|
||||
device_unregister(&ucb->dev);
|
||||
}
|
||||
@@ -604,6 +686,7 @@ static int ucb1x00_resume(struct mcp *mcp)
|
||||
struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
|
||||
struct ucb1x00_dev *dev;
|
||||
|
||||
ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir);
|
||||
mutex_lock(&ucb1x00_mutex);
|
||||
list_for_each_entry(dev, &ucb->devs, dev_node) {
|
||||
if (dev->drv->resume)
|
||||
|
@@ -30,12 +30,12 @@
|
||||
#include <linux/freezer.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/mfd/ucb1x00.h>
|
||||
|
||||
#include <mach/dma.h>
|
||||
#include <mach/collie.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include "ucb1x00.h"
|
||||
|
||||
|
||||
struct ucb1x00_ts {
|
||||
|
@@ -1,255 +0,0 @@
|
||||
/*
|
||||
* linux/drivers/mfd/ucb1x00.h
|
||||
*
|
||||
* Copyright (C) 2001 Russell King, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License.
|
||||
*/
|
||||
#ifndef UCB1200_H
|
||||
#define UCB1200_H
|
||||
|
||||
#define UCB_IO_DATA 0x00
|
||||
#define UCB_IO_DIR 0x01
|
||||
|
||||
#define UCB_IO_0 (1 << 0)
|
||||
#define UCB_IO_1 (1 << 1)
|
||||
#define UCB_IO_2 (1 << 2)
|
||||
#define UCB_IO_3 (1 << 3)
|
||||
#define UCB_IO_4 (1 << 4)
|
||||
#define UCB_IO_5 (1 << 5)
|
||||
#define UCB_IO_6 (1 << 6)
|
||||
#define UCB_IO_7 (1 << 7)
|
||||
#define UCB_IO_8 (1 << 8)
|
||||
#define UCB_IO_9 (1 << 9)
|
||||
|
||||
#define UCB_IE_RIS 0x02
|
||||
#define UCB_IE_FAL 0x03
|
||||
#define UCB_IE_STATUS 0x04
|
||||
#define UCB_IE_CLEAR 0x04
|
||||
#define UCB_IE_ADC (1 << 11)
|
||||
#define UCB_IE_TSPX (1 << 12)
|
||||
#define UCB_IE_TSMX (1 << 13)
|
||||
#define UCB_IE_TCLIP (1 << 14)
|
||||
#define UCB_IE_ACLIP (1 << 15)
|
||||
|
||||
#define UCB_IRQ_TSPX 12
|
||||
|
||||
#define UCB_TC_A 0x05
|
||||
#define UCB_TC_A_LOOP (1 << 7) /* UCB1200 */
|
||||
#define UCB_TC_A_AMPL (1 << 7) /* UCB1300 */
|
||||
|
||||
#define UCB_TC_B 0x06
|
||||
#define UCB_TC_B_VOICE_ENA (1 << 3)
|
||||
#define UCB_TC_B_CLIP (1 << 4)
|
||||
#define UCB_TC_B_ATT (1 << 6)
|
||||
#define UCB_TC_B_SIDE_ENA (1 << 11)
|
||||
#define UCB_TC_B_MUTE (1 << 13)
|
||||
#define UCB_TC_B_IN_ENA (1 << 14)
|
||||
#define UCB_TC_B_OUT_ENA (1 << 15)
|
||||
|
||||
#define UCB_AC_A 0x07
|
||||
#define UCB_AC_B 0x08
|
||||
#define UCB_AC_B_LOOP (1 << 8)
|
||||
#define UCB_AC_B_MUTE (1 << 13)
|
||||
#define UCB_AC_B_IN_ENA (1 << 14)
|
||||
#define UCB_AC_B_OUT_ENA (1 << 15)
|
||||
|
||||
#define UCB_TS_CR 0x09
|
||||
#define UCB_TS_CR_TSMX_POW (1 << 0)
|
||||
#define UCB_TS_CR_TSPX_POW (1 << 1)
|
||||
#define UCB_TS_CR_TSMY_POW (1 << 2)
|
||||
#define UCB_TS_CR_TSPY_POW (1 << 3)
|
||||
#define UCB_TS_CR_TSMX_GND (1 << 4)
|
||||
#define UCB_TS_CR_TSPX_GND (1 << 5)
|
||||
#define UCB_TS_CR_TSMY_GND (1 << 6)
|
||||
#define UCB_TS_CR_TSPY_GND (1 << 7)
|
||||
#define UCB_TS_CR_MODE_INT (0 << 8)
|
||||
#define UCB_TS_CR_MODE_PRES (1 << 8)
|
||||
#define UCB_TS_CR_MODE_POS (2 << 8)
|
||||
#define UCB_TS_CR_BIAS_ENA (1 << 11)
|
||||
#define UCB_TS_CR_TSPX_LOW (1 << 12)
|
||||
#define UCB_TS_CR_TSMX_LOW (1 << 13)
|
||||
|
||||
#define UCB_ADC_CR 0x0a
|
||||
#define UCB_ADC_SYNC_ENA (1 << 0)
|
||||
#define UCB_ADC_VREFBYP_CON (1 << 1)
|
||||
#define UCB_ADC_INP_TSPX (0 << 2)
|
||||
#define UCB_ADC_INP_TSMX (1 << 2)
|
||||
#define UCB_ADC_INP_TSPY (2 << 2)
|
||||
#define UCB_ADC_INP_TSMY (3 << 2)
|
||||
#define UCB_ADC_INP_AD0 (4 << 2)
|
||||
#define UCB_ADC_INP_AD1 (5 << 2)
|
||||
#define UCB_ADC_INP_AD2 (6 << 2)
|
||||
#define UCB_ADC_INP_AD3 (7 << 2)
|
||||
#define UCB_ADC_EXT_REF (1 << 5)
|
||||
#define UCB_ADC_START (1 << 7)
|
||||
#define UCB_ADC_ENA (1 << 15)
|
||||
|
||||
#define UCB_ADC_DATA 0x0b
|
||||
#define UCB_ADC_DAT_VAL (1 << 15)
|
||||
#define UCB_ADC_DAT(x) (((x) & 0x7fe0) >> 5)
|
||||
|
||||
#define UCB_ID 0x0c
|
||||
#define UCB_ID_1200 0x1004
|
||||
#define UCB_ID_1300 0x1005
|
||||
#define UCB_ID_TC35143 0x9712
|
||||
|
||||
#define UCB_MODE 0x0d
|
||||
#define UCB_MODE_DYN_VFLAG_ENA (1 << 12)
|
||||
#define UCB_MODE_AUD_OFF_CAN (1 << 13)
|
||||
|
||||
#include "mcp.h"
|
||||
|
||||
struct ucb1x00_irq {
|
||||
void *devid;
|
||||
void (*fn)(int, void *);
|
||||
};
|
||||
|
||||
struct ucb1x00 {
|
||||
spinlock_t lock;
|
||||
struct mcp *mcp;
|
||||
unsigned int irq;
|
||||
struct semaphore adc_sem;
|
||||
spinlock_t io_lock;
|
||||
u16 id;
|
||||
u16 io_dir;
|
||||
u16 io_out;
|
||||
u16 adc_cr;
|
||||
u16 irq_fal_enbl;
|
||||
u16 irq_ris_enbl;
|
||||
struct ucb1x00_irq irq_handler[16];
|
||||
struct device dev;
|
||||
struct list_head node;
|
||||
struct list_head devs;
|
||||
};
|
||||
|
||||
struct ucb1x00_driver;
|
||||
|
||||
struct ucb1x00_dev {
|
||||
struct list_head dev_node;
|
||||
struct list_head drv_node;
|
||||
struct ucb1x00 *ucb;
|
||||
struct ucb1x00_driver *drv;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
struct ucb1x00_driver {
|
||||
struct list_head node;
|
||||
struct list_head devs;
|
||||
int (*add)(struct ucb1x00_dev *dev);
|
||||
void (*remove)(struct ucb1x00_dev *dev);
|
||||
int (*suspend)(struct ucb1x00_dev *dev, pm_message_t state);
|
||||
int (*resume)(struct ucb1x00_dev *dev);
|
||||
};
|
||||
|
||||
#define classdev_to_ucb1x00(cd) container_of(cd, struct ucb1x00, dev)
|
||||
|
||||
int ucb1x00_register_driver(struct ucb1x00_driver *);
|
||||
void ucb1x00_unregister_driver(struct ucb1x00_driver *);
|
||||
|
||||
/**
|
||||
* ucb1x00_clkrate - return the UCB1x00 SIB clock rate
|
||||
* @ucb: UCB1x00 structure describing chip
|
||||
*
|
||||
* Return the SIB clock rate in Hz.
|
||||
*/
|
||||
static inline unsigned int ucb1x00_clkrate(struct ucb1x00 *ucb)
|
||||
{
|
||||
return mcp_get_sclk_rate(ucb->mcp);
|
||||
}
|
||||
|
||||
/**
|
||||
* ucb1x00_enable - enable the UCB1x00 SIB clock
|
||||
* @ucb: UCB1x00 structure describing chip
|
||||
*
|
||||
* Enable the SIB clock. This can be called multiple times.
|
||||
*/
|
||||
static inline void ucb1x00_enable(struct ucb1x00 *ucb)
|
||||
{
|
||||
mcp_enable(ucb->mcp);
|
||||
}
|
||||
|
||||
/**
|
||||
* ucb1x00_disable - disable the UCB1x00 SIB clock
|
||||
* @ucb: UCB1x00 structure describing chip
|
||||
*
|
||||
* Disable the SIB clock. The SIB clock will only be disabled
|
||||
* when the number of ucb1x00_enable calls match the number of
|
||||
* ucb1x00_disable calls.
|
||||
*/
|
||||
static inline void ucb1x00_disable(struct ucb1x00 *ucb)
|
||||
{
|
||||
mcp_disable(ucb->mcp);
|
||||
}
|
||||
|
||||
/**
|
||||
* ucb1x00_reg_write - write a UCB1x00 register
|
||||
* @ucb: UCB1x00 structure describing chip
|
||||
* @reg: UCB1x00 4-bit register index to write
|
||||
* @val: UCB1x00 16-bit value to write
|
||||
*
|
||||
* Write the UCB1x00 register @reg with value @val. The SIB
|
||||
* clock must be running for this function to return.
|
||||
*/
|
||||
static inline void ucb1x00_reg_write(struct ucb1x00 *ucb, unsigned int reg, unsigned int val)
|
||||
{
|
||||
mcp_reg_write(ucb->mcp, reg, val);
|
||||
}
|
||||
|
||||
/**
|
||||
* ucb1x00_reg_read - read a UCB1x00 register
|
||||
* @ucb: UCB1x00 structure describing chip
|
||||
* @reg: UCB1x00 4-bit register index to write
|
||||
*
|
||||
* Read the UCB1x00 register @reg and return its value. The SIB
|
||||
* clock must be running for this function to return.
|
||||
*/
|
||||
static inline unsigned int ucb1x00_reg_read(struct ucb1x00 *ucb, unsigned int reg)
|
||||
{
|
||||
return mcp_reg_read(ucb->mcp, reg);
|
||||
}
|
||||
/**
|
||||
* ucb1x00_set_audio_divisor -
|
||||
* @ucb: UCB1x00 structure describing chip
|
||||
* @div: SIB clock divisor
|
||||
*/
|
||||
static inline void ucb1x00_set_audio_divisor(struct ucb1x00 *ucb, unsigned int div)
|
||||
{
|
||||
mcp_set_audio_divisor(ucb->mcp, div);
|
||||
}
|
||||
|
||||
/**
|
||||
* ucb1x00_set_telecom_divisor -
|
||||
* @ucb: UCB1x00 structure describing chip
|
||||
* @div: SIB clock divisor
|
||||
*/
|
||||
static inline void ucb1x00_set_telecom_divisor(struct ucb1x00 *ucb, unsigned int div)
|
||||
{
|
||||
mcp_set_telecom_divisor(ucb->mcp, div);
|
||||
}
|
||||
|
||||
void ucb1x00_io_set_dir(struct ucb1x00 *ucb, unsigned int, unsigned int);
|
||||
void ucb1x00_io_write(struct ucb1x00 *ucb, unsigned int, unsigned int);
|
||||
unsigned int ucb1x00_io_read(struct ucb1x00 *ucb);
|
||||
|
||||
#define UCB_NOSYNC (0)
|
||||
#define UCB_SYNC (1)
|
||||
|
||||
unsigned int ucb1x00_adc_read(struct ucb1x00 *ucb, int adc_channel, int sync);
|
||||
void ucb1x00_adc_enable(struct ucb1x00 *ucb);
|
||||
void ucb1x00_adc_disable(struct ucb1x00 *ucb);
|
||||
|
||||
/*
|
||||
* Which edges of the IRQ do you want to control today?
|
||||
*/
|
||||
#define UCB_RISING (1 << 0)
|
||||
#define UCB_FALLING (1 << 1)
|
||||
|
||||
int ucb1x00_hook_irq(struct ucb1x00 *ucb, unsigned int idx, void (*fn)(int, void *), void *devid);
|
||||
void ucb1x00_enable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges);
|
||||
void ucb1x00_disable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges);
|
||||
int ucb1x00_free_irq(struct ucb1x00 *ucb, unsigned int idx, void *devid);
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user