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等.任何设备都可以选择合适 ...
随机推荐
- 1970年1月1日(00:00:00 GMT)Unix 时间戳(Unix Timestamp)
转载自(http://jm.ncxyol.com/post-88.html) 今天在看Python API时,看到time模块: The epoch is the point where the ...
- 把 b中的字段整合到a上
a = [{"id": 1, "data": 1}, {"id": 2, "data": 1}, {"id&q ...
- Java中字符串和byte数组之间的相互转换
1.将字符转换成byte数组 String str = "罗长"; byte[] sb = str.getBytes(); 2.将byte数组转换成字符 byte[] b={(by ...
- mysql 命令行导数据库
cd d: 然后应该会提示你已经进入D盘了,按照你数据库的地址,我的数据库是在D盘的wamp这个文件夹目录, 输入命令:cd ruanjian\mysql\bin 类似于这样,大家可以先在本 ...
- 数据库原理及应用-SQL数据操纵语言(Data Manipulation Language)和嵌入式SQL&存储过程
2018-02-19 18:03:54 一.数据操纵语言(Data Manipulation Language) 数据操纵语言是指插入,删除和更新语言. 二.视图(View) 数据库三级模式,两级映射 ...
- 英语词根与单词的说文解字---词根示例1、第10页 st(at)
英语词根与单词的说文解字---词根示例1.第10页 st(at) 一.总结 一句话总结: 站 state,establish,constitution 英 [ɪ'stæblɪʃ; e-] 美 [ɪˈ ...
- JavaScript高级与面向对象
对象:任何事物都可以看作是对象. 1.面向对象与面向过程的概念 面向过程:凡是自己亲力亲为,自己按部就班的解决现有问题. 面向对象:自己充当一个指挥者的角色,指挥更加专业的对象帮我解决问题. 联系:面 ...
- 手动建立Mysql表实体类技巧
首先执行一条sql语句,也可以在开发中插入数据.修改数据或者查询数据的某个属性时使用. select sc.COLUMN_NAME from information_schema.COLUMNS as ...
- program发展史及以后预测
三个阶段:第一个阶段是1950年代到1960年代,是程序设计阶段,基本是个体手工劳动的生产方式.这个时期,一个程序是为一个特定的目的而编制的,软件的通用性是很有限的,软件往往带有强烈的个人色彩.早期的 ...
- Jenkins学习之旅
学习博客:http://www.cnblogs.com/zz0412/tag/jenkins/ https://jenkins.io/doc/ http://www.cnblogs.com/h ...