/**********************************************************************
* I.MX6 AD7606-4 device driver registe hacking
* 说明:
* 看一下AD7606的驱动注册上是否存在一些问题。
*
* 2017-8-4 深圳 龙华樟坑村 曾剑锋
*********************************************************************/ /*
* initialize __mach_desc_MX6Q_SABRESD data structure.
*/
MACHINE_START(MX6Q_SABRESD, "Freescale i.MX 6Quad/DualLite/Solo Sabre-SD Board")
/* Maintainer: Freescale Semiconductor, Inc. */
.boot_params = MX6_PHYS_OFFSET + 0x100,
.fixup = fixup_mxc_board,
.map_io = mx6_map_io,
.init_irq = mx6_init_irq,
.init_machine = mx6_sabresd_board_init, ------------+
.timer = &mx6_sabresd_timer, |
.reserve = mx6q_sabresd_reserve, |
MACHINE_END |
|
static void __init mx6_sabresd_board_init(void) <--------+
{
... /* SPI */
imx6q_add_ecspi(, &mx6q_sabresd_spi2_data); ---------------------------+
spi_device_init(); ---------------------------*-+
| |
... | |
} | |
| |
static const struct spi_imx_master mx6q_sabresd_spi2_data __initconst = { <---+ |
.chipselect = mx6q_sabresd_spi2_cs, |
.num_chipselect = ARRAY_SIZE(mx6q_sabresd_spi2_cs), |
}; |
|
static void spi_device_init(void) <--------------------------------+
{
spi_register_board_info(imx6_sabresd_spi_nor_device, -----------------------+
ARRAY_SIZE(imx6_sabresd_spi_nor_device)); |
} |
|
static struct spi_board_info imx6_sabresd_spi_nor_device[] __initdata = { <-------+
{
{
/* the modalias must be the same as spi device driver name */
.modalias = "ad7606-4", /* Name of spi_driver for this device */
.max_speed_hz = , /* max spi clock (SCK) speed in HZ */
//.max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
//.max_speed_hz = 14500000, /* max spi clock (SCK) speed in HZ */
.bus_num = , /* Framework bus number */
.chip_select = , /* Framework chip select */
.platform_data = &ad7606_pdata, -----------+
// .controller_data = &ad7606_chip_info, /* Blackfin only */ |
.irq = gpio_to_irq(AD7606_GPIO_BUSY), |
.mode = SPI_MODE_0, |
}, |
}; |
|
static struct ad7606_platform_data ad7606_pdata = { <----------------+
.default_os = ,
.default_range = ,
.gpio_convst = AD7606_GPIO_CONVST,
.gpio_reset = AD7606_GPIO_RESET,
.gpio_range = -,
.gpio_os0 = AD7606_GPIO_OS0,
.gpio_os1 = AD7606_GPIO_OS1,
.gpio_os2 = AD7606_GPIO_OS2,
.gpio_frstdata = -,
//.gpio_frstdata = AD7606_GPIO_FRSTDATA,
.gpio_stby = AD7606_GPIO_STBY,
}; "drivers/staging/iio/adc/ad7606_spi.c"
static const struct spi_device_id ad7606_id[] = { <---------+
{"ad7606-8", ID_AD7606_8}, |
{"ad7606-6", ID_AD7606_6}, |
{"ad7606-4", ID_AD7606_4}, |
{} |
}; |
|
static struct spi_driver ad7606_driver = { <------------+ |
.driver = { | |
.name = "ad7606", | |
.bus = &spi_bus_type, | |
.owner = THIS_MODULE, | |
.pm = AD7606_SPI_PM_OPS, | |
}, | |
.probe = ad7606_spi_probe, ------*-*-------+
.remove = __devexit_p(ad7606_spi_remove), | | |
.id_table = ad7606_id, -------------*-+ |
}; | |
| |
static int __init ad7606_spi_init(void) | |
{ | |
return spi_register_driver(&ad7606_driver); ------+ |
} |
module_init(ad7606_spi_init); |
|
static void __exit ad7606_spi_exit(void) |
{ |
spi_unregister_driver(&ad7606_driver); |
} |
module_exit(ad7606_spi_exit); |
|
MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); |
MODULE_DESCRIPTION("Analog Devices AD7606 ADC"); |
MODULE_LICENSE("GPL v2"); |
MODULE_ALIAS("spi:ad7606_spi"); |
|
static int __devinit ad7606_spi_probe(struct spi_device *spi) <------+
{
struct iio_dev *indio_dev; indio_dev = ad7606_probe(&spi->dev, spi->irq, NULL, ---------+
spi_get_device_id(spi)->driver_data, |
&ad7606_spi_bops); |
|
if (IS_ERR(indio_dev)) |
return PTR_ERR(indio_dev); |
|
spi_set_drvdata(spi, indio_dev); |
|
return ; |
} |
|
struct iio_dev *ad7606_probe(struct device *dev, int irq, <-------+
void __iomem *base_address,
unsigned id,
const struct ad7606_bus_ops *bops)
{
struct ad7606_platform_data *pdata = dev->platform_data;
struct ad7606_state *st;
int ret, regdone = ;
struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); if (indio_dev == NULL) {
ret = -ENOMEM;
goto error_ret;
} st = iio_priv(indio_dev); st->dev = dev;
st->id = id;
st->irq = irq;
st->bops = bops;
st->base_address = base_address;
st->range = pdata->default_range == ? : ; ret = ad7606_oversampling_get_index(pdata->default_os);
if (ret < ) {
dev_warn(dev, "oversampling %d is not supported\n",
pdata->default_os);
st->oversampling = ;
} else {
st->oversampling = pdata->default_os;
} st->reg = regulator_get(dev, "vcc");
if (!IS_ERR(st->reg)) {
ret = regulator_enable(st->reg);
if (ret)
goto error_put_reg;
} st->pdata = pdata;
st->chip_info = &ad7606_chip_info_tbl[id]; indio_dev->dev.parent = dev;
indio_dev->info = &ad7606_info;
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->name = st->chip_info->name;
indio_dev->channels = st->chip_info->channels;
indio_dev->num_channels = st->chip_info->num_channels; init_waitqueue_head(&st->wq_data_avail); ret = ad7606_request_gpios(st);
if (ret)
goto error_disable_reg; ret = ad7606_reset(st);
if (ret)
dev_warn(st->dev, "failed to RESET: no RESET GPIO specified\n"); ret = request_irq(st->irq, ad7606_interrupt,
IRQF_TRIGGER_FALLING, st->chip_info->name, indio_dev);
if (ret)
goto error_free_gpios; ret = ad7606_register_ring_funcs_and_init(indio_dev);
if (ret)
goto error_free_irq; ret = iio_device_register(indio_dev);
if (ret)
goto error_free_irq;
regdone = ; ret = iio_ring_buffer_register_ex(indio_dev->ring, ,
indio_dev->channels,
indio_dev->num_channels);
if (ret)
goto error_cleanup_ring; return indio_dev; error_cleanup_ring:
ad7606_ring_cleanup(indio_dev); error_free_irq:
free_irq(st->irq, indio_dev); error_free_gpios:
ad7606_free_gpios(st); error_disable_reg:
if (!IS_ERR(st->reg))
regulator_disable(st->reg);
error_put_reg:
if (!IS_ERR(st->reg))
regulator_put(st->reg);
if (regdone)
iio_device_unregister(indio_dev);
else
iio_free_device(indio_dev);
error_ret:
return ERR_PTR(ret);
}

I.MX6 AD7606-4 device driver registe hacking的更多相关文章

  1. I.MX6 ar1020 SPI device driver hacking

    /************************************************************************************ * I.MX6 ar1020 ...

  2. I.MX6 Linux I2C device& driver hacking

    /******************************************************************************************* * I.MX6 ...

  3. OK335xS I2C device registe hacking

    /*************************************************************************** * OK335xS I2C device re ...

  4. OK335xS UART device registe hacking

    /************************************************************************* * OK335xS UART device reg ...

  5. I.MX6 Goodix GT9xx touchscreen driver porting

    /************************************************************************ * I.MX6 Goodix GT9xx touch ...

  6. I.MX6 Ethernet MAC (ENET) MAC Address hacking

    /********************************************************************* * I.MX6 Ethernet MAC (ENET) M ...

  7. [platform]linux platform device/driver(二)--Platform Device和Platform_driver注册过程之详细代码

    转自:http://www.cnblogs.com/haimeng2010/p/3582403.html 目录: 1.platform_device注册过程 2.platform_driver注册过程 ...

  8. Architecture of Device I/O Drivers, Device Driver Design

    http://www.kalinskyassociates.com/Wpaper4.html Architecture of Device I/O Drivers Many embedded syst ...

  9. linux下bus,device,driver三者关系

    linux下bus,device,driver三者关系 1.bus: 总线作为主机和外设的连接通道,有些总线是比较规范的,形成了很多协议.如 PCI,USB,1394,IIC等.任何设备都可以选择合适 ...

随机推荐

  1. Caffe学习笔记(三):Caffe数据是如何输入和输出的?

    Caffe学习笔记(三):Caffe数据是如何输入和输出的? Caffe中的数据流以Blobs进行传输,在<Caffe学习笔记(一):Caffe架构及其模型解析>中已经对Blobs进行了简 ...

  2. Python学习札记(五) Basic2 字符串和编码

    参考:字符串和编码 Note A.字符编码 1.计算机处理文本 == 将文本转换为二进制 => 处理 2.8 bit(比特) = 1 byte(字节) 一个字节所能表示的最大的十进制整数是255 ...

  3. 为什么使用Lambda表达式(翻译版)

    简介 如上图所示,绿色框中就是Lambda表达式,是可以执行的代码块.Lambda表达式是很多编程语言的特征,比如Lisp, Python, Scala等. 但是对于java,在8以后才支持这种写法. ...

  4. 2-1 RHEL6.5 环境搭建与部署

    第二部分:Linux常见服务管理 2-1 RHEL6.5 环境搭建与部署 第二部分主要讲解的是开源服务搭建 学习方法与注意事项: 1. 端正态度,开始学习 2. 认真完成作业和实验(并详细记录) 3. ...

  5. C++函数参数中的省略号

    本文基本是转载自:https://blog.csdn.net/think12/article/details/5785066 另一篇看到写得很好的博客:https://www.cnblogs.com/ ...

  6. HDU 4739 Zhuge Liang's Mines (状态压缩+背包DP)

    题意 给定平面直角坐标系内的N(N <= 20)个点,每四个点构成一个正方形可以消去,问最多可以消去几个点. 思路 比赛的时候暴力dfs+O(n^4)枚举写过了--无意间看到有题解用状压DP(这 ...

  7. EBS Certifications

    Last Updated: September 29, 2017.  This summary cross-references published blog articles and the off ...

  8. 图片服务器(FastDFS)的搭建

    1.1 什么是FastDFS FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用Fa ...

  9. Nginx禁止域名恶意解析

    今天打开网站发现访客人数突增啊,不对啊,小站哪来这么多的访问量呢?打开百度统计,看到有其他的域名解析到我的IP,心中很不爽啊.遂搜索之,才有了此篇文章. 打开Nginx配置文件/etc/nginx/s ...

  10. 为什么是link-visited-hover-active

    前言 通常我们在设置链接的一些伪类(link,visited,hover,active)样式时,要让不同的状态显示正确的样式,我们需要按一定的顺序设置这些伪类的样式.这里我就按CSS2规范中推荐的顺序 ...