/**********************************************************************
* 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. NSURLSession 的学习资料

    一个nsurlsession的一些学习资料 http://www.cocoachina.com/ios/20161018/17785.html

  2. 搭建Nginx图片服务器(Linux)

    知识点: 在Linux系统上安装Nginx服务器,配置图片访问路径 通过ftp上传图片到,指定路径,通过浏览器访问指定路径中的图片 参考博客:http://blog.csdn.net/maoyuanm ...

  3. 【python】argparse学习(转)

    点击这里成为作者 · 更新于 2018-11-14 21:00:36 argparse argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数, ...

  4. 关于xftp连接不了Linux,但是却可以用xshell连接Linux

    解决方法:用sftp协议,不要用ftp协议

  5. webservice用cxf发布REST

    1.新建一个java项目 2.导入cxf相关的jar包,并部署到项目中 3.bean类 package com.xiaostudy; import javax.xml.bind.annotation. ...

  6. filezilla无法启动传输及严重文件传输错误

    filezilla无法启动传输 严重文件传输错误 文件夹权限不够,修改之. 你的空间或服务器已经满了,请空下回收站或者扩容. 文件正在被占用,关闭后传输 ​

  7. Java 最常见的 200+ 面试题:面试必备

    这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring ...

  8. web项目整合Shiro框架

    1.修改pom.xml文件 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>s ...

  9. MySQL设置某一字段默认为0,但是插入数据化却显示为null

    1.MySQL字段默认的含义:在插入时不指定该字段的值:2.以mybatis举例,如果是插入实体,那么为空的字段就会插入空:3.如果不想mybatis等持久化工具插入空,可以尝试insertSelec ...

  10. Python抓取糗事百科成人版图片

    最近开始学习爬虫,一开始看的是静觅的爬虫系列文章,今天看到糗事百科成人版,心里就邪恶了一下,把图片都爬下来吧,哈哈~ 虽然后来实现了,但还是存在一些问题,暂且不提,先切入正题吧,没什么好说的,直接上代 ...