Tiny6410触摸屏驱动设置platform data分析

在函数s3c_ts_probe中,对于下面的代码,我想弄清楚platform设备dev中的struct s3c_ts_mach_info 类型的变量是在哪定义并设置的:

s3c_ts_cfg = s3c_ts_get_platdata(&pdev->dev);

下面是s3c_ts_get_platdata的实现

static struct s3c_ts_mach_info *s3c_ts_get_platdata(struct device *dev)

{

if (dev->platform_data != NULL)

return (struct s3c_ts_mach_info *)dev->platform_data;

return &s3c_ts_default_cfg;

}

static int __init s3c_ts_probe(struct platform_device *pdev)中的参数就是在arch/arm/mach-s3c64xx/mach-mini6410.c 中定义的,如下:

#include <mach/map.h>

#include <mach/irqs.h>

#include <plat/devs.h>

#include <plat/cpu.h>

#include <mach/ts.h>

/* Touch srcreen */

static struct resource s3c_ts_resource[] = {

[0] = {

.start = SAMSUNG_PA_ADC,

.end   = SAMSUNG_PA_ADC + SZ_256 - 1,

.flags = IORESOURCE_MEM,

},

[1] = {

.start = IRQ_PENDN,

.end   = IRQ_PENDN,

.flags = IORESOURCE_IRQ,

},

[2] = {

.start = IRQ_ADC,

.end   = IRQ_ADC,

.flags = IORESOURCE_IRQ,

}

};

struct platform_device s3c_device_ts = {

.name   = "s3c-ts",

.id   = -1,

.num_resources   = ARRAY_SIZE(s3c_ts_resource),

.resource   = s3c_ts_resource,

};

//我们会调用这个函数来设置平台数据

void __init s3c_ts_set_platdata(struct s3c_ts_mach_info *pd)

{

struct s3c_ts_mach_info *npd;

if (!pd) {

printk(KERN_ERR "%s: no platform data\n", __func__);

return;

}

npd = kmemdup(pd, sizeof(struct s3c_ts_mach_info), GFP_KERNEL);

if (!npd)

printk(KERN_ERR "%s: no memory for platform data\n", __func__);

s3c_device_ts.dev.platform_data = npd;

}

经过查看,发现函数s3c_ts_set_platdata是在mach-mini6410.c中被调用了:

在该文件中定义了s3c_ts_platform:

#ifdef CONFIG_TOUCHSCREEN_MINI6410

static struct s3c_ts_mach_info s3c_ts_platform __initdata = {

.delay = 0xFFFF,

.presc = 0xFF,

.oversampling_shift = 2,

.resol_bit = 12,

.s3c_adc_con = ADC_TYPE_2,

};

#endif

并且在此函数中static void __init mini6410_machine_init(void)将平台数据给设置到平台设备中:

#ifdef CONFIG_TOUCHSCREEN_MINI6410

s3c_ts_set_platdata(&s3c_ts_platform);

#endif

static void __init mini6410_machine_init(void) 会在内核启动时被调用,这样一来驱动就能在挂载时获得自己的平台数据

你可能感兴趣的:(c,null,平台,resources)