I.MX6 AD7606-4 device driver registe hacking
/**********************************************************************
* 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的更多相关文章
- I.MX6 ar1020 SPI device driver hacking
/************************************************************************************ * I.MX6 ar1020 ...
- I.MX6 Linux I2C device& driver hacking
/******************************************************************************************* * I.MX6 ...
- OK335xS I2C device registe hacking
/*************************************************************************** * OK335xS I2C device re ...
- OK335xS UART device registe hacking
/************************************************************************* * OK335xS UART device reg ...
- I.MX6 Goodix GT9xx touchscreen driver porting
/************************************************************************ * I.MX6 Goodix GT9xx touch ...
- I.MX6 Ethernet MAC (ENET) MAC Address hacking
/********************************************************************* * I.MX6 Ethernet MAC (ENET) M ...
- [platform]linux platform device/driver(二)--Platform Device和Platform_driver注册过程之详细代码
转自:http://www.cnblogs.com/haimeng2010/p/3582403.html 目录: 1.platform_device注册过程 2.platform_driver注册过程 ...
- Architecture of Device I/O Drivers, Device Driver Design
http://www.kalinskyassociates.com/Wpaper4.html Architecture of Device I/O Drivers Many embedded syst ...
- linux下bus,device,driver三者关系
linux下bus,device,driver三者关系 1.bus: 总线作为主机和外设的连接通道,有些总线是比较规范的,形成了很多协议.如 PCI,USB,1394,IIC等.任何设备都可以选择合适 ...
随机推荐
- LeetCode——Coin Change
Question You are given coins of different denominations and a total amount of money amount. Write a ...
- 【转】GitHub汉化脚本(谷歌浏览器)
// ==UserScript== // @name GitHub 汉化插件 // @description 汉化 GitHub 界面的部分菜单及内容. // @copyright 2016, 楼教主 ...
- Python学习札记(三) I/O
参考:输入和输出 I/O 1.print()函数 a.调用print()输出字符串有以下两种方式:(1)print('[字符串]') (2)print("[字符串]") b.调用p ...
- How to implement multiple constructor with different parameters in Scala
Using scala is just another road, and it just like we fall in love again, but there is some pain you ...
- spring的静态代理和动态代理
Java静态代理 Jdk动态代理 java代理模式 即Proxy Pattern,23种java常用设计模式之一.代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问. 原理: 代理模式的主要 ...
- solr 5.1.0安装-Windows(亦可用于5.4.1)
以前4.10的时候写过一个安装教程,是安装在tomcat的,在来安装5.1的时候,看了下简介,发现从5.x后solr集成了jetty,安装变得简单了不少. 现在只需要三步就能搞定,下载solr包解压, ...
- 【Python】解决Python脚本 在cmd命令行窗口运行时,中文乱码问题
问题描述 python2.X,代码中指定了UTF-8,但是在cmd命令行窗口时,打印的中文仍然会乱码 在python3不存在该问题 运行结果: 原因 搜索得知,中文windows默认的输出编码为gbk ...
- 缓存技术内部交流_03_Cache Aside
参考资料: http://www.ehcache.org/documentation/3.2/caching-patterns.html http://www.ehcache.org/document ...
- IntelliJ IDEA 2017 主题安装及配置
主题哪里下的? 网站:http://www.riaway.com/ 主题怎么安装? 然后选择文件,找到下载的主题,按步骤,重启之后即可使用: 主题如何配置? 以下所有配置基于 IntelliJ IDE ...
- UVALive-3211 Now or later (2-SAT+二分)
题目大意:有n架飞机,每架飞机有两个可选择的着陆时间,并且每架飞机都必须要选一个时间着陆.为了安全考虑,要求两架飞机的最小着陆时间差最大,找出这个最大值. 题目分析:有“最小值的最大值”这样的字眼,用 ...