atic struct resource sep_iis_resource[] = { //很肯能会有多个[0]表示第一个元素
[0] = {
.start = I2S_BASE,
.end = I2S_BASE + SZ_4K -1,
.flags = IORESOURCE_MEM,
}
};
struct klist {
spinlock_t k_lock;
struct list_head k_list;
void (*get)(struct klist_node *);
void (*put)(struct klist_node *);
} __attribute__ ((aligned (4)));
#define KLIST_INIT(_name, _get, _put) \
{ .k_lock = __SPIN_LOCK_UNLOCKED(_name.k_lock), \
.k_list = LIST_HEAD_INIT(_name.k_list), \
.get = _get, \
.put = _put, }
#define DEFINE_KLIST(_name, _get, _put) \
struct klist _name = KLIST_INIT(_name, _get, _put)
struct klist_node {
void *n_klist; /* never access directly */
struct list_head n_node;
struct kref n_ref;
}
struct platform_device {
const char * name;
int id;
struct device dev;
u32 num_resources;
struct resource * resource;
struct platform_device_id *id_entry;
/* arch specific additions */
struct pdev_archdata archdata;
};
#define platform_get_device_id(pdev) ((pdev)->id_entry)
#define to_platform_device(x) container_of((x), struct platform_device, dev)
static u64 sep_device_iis_dmamask = 0xffffffffUL;
struct platform_device sep_device_iis = {
.name = "sep0611-iis",
.id = -1,
.num_resources = ARRAY_SIZE(sep_iis_resource),
.resource = sep_iis_resource,
.dev = {
.dma_mask = &sep_device_iis_dmamask,
.coherent_dma_mask = 0xffffffffUL,
}
};
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
EXPORT_SYMBOL(sep_device_iis);
static struct platform_device *devices[] __initdata =
{
&serial_device,
&sep0611_dm9000_device,
&dw_dmac1_device,
&dw_dmac2_device,
&sep0611_device_lcd,
&sep0611_nandflash_device,
&sep0611_device_spi1,
//&sep0611_device_spi1,
//&sep0611_device_spi1,
&sep0611_device_i2c, //当前情景
&sep0611_device_ts,
&sep0611_device_mmc,
&sep_device_iis,
&sep0611_device_usb,
};
void __init sep0611_init(void)
{
SEP0611_INT_ENABLE(INTSRC_UART0);
SEP0611_INT_ENABLE(INTSRC_UART1);
SEP0611_INT_ENABLE(INTSRC_UART2);
platform_add_devices(devices, ARRAY_SIZE(devices));
i2c_register_board_info(0, sep0611_i2c_board_info, ARRAY_SIZE(sep0611_i2c_board_info));
spi_register_board_info(sep0611_spi_board,ARRAY_SIZE(sep0611_spi_board));
}
int platform_add_devices(struct platform_device **devs, int num)
{
int i, ret = 0;
for (i = 0; i < num; i++) {
ret = platform_device_register(devs[i]); //注册函数,传入的devs是devices数组,对数组内每个设备注册
if (ret) {
while (--i >= 0)
platform_device_unregister(devs[i]);
break;
}
}
return ret;
}
EXPORT_SYMBOL_GPL(platform_add_devices);
int platform_device_register(struct platform_device *pdev)
{
device_initialize(&pdev->dev);//初始化device结构体,以后的成员一定是从后sep_device_iis得到的数据,可能未初始化
return platform_device_add(pdev);
}
void device_initialize(struct device *dev) //这个函数生成新的kobject并初始化和插入到相应的链表
{
dev->kobj.kset = devices_kset;//这里的devices_kset是全局变量,所有的设备kobject都应该挂在这个kset结构体上,这里的dev传入的肯定是sep_device_iis 中的变
量
kobject_init(&dev->kobj, &device_ktype);//kobject的初始化,这个kobject是包含在 platform_device sep_device_iis全局变量里,编译器在生成镜像文件时已经存
在.应该在.bss段
INIT_LIST_HEAD(&dev->dma_pools);