0

我有一个platform_device实例,我想向它传递一个函数指针,我想知道最干净和最通用的方法是什么。

最好的办法是,如果我在内核中有一些杂项资源,我可以传递void*任何我想要的资源,但这些是唯一可用的资源:

 31 #define IORESOURCE_TYPE_BITS    0x00001f00      /* Resource type */
 32 #define IORESOURCE_IO           0x00000100      /* PCI/ISA I/O ports */
 33 #define IORESOURCE_MEM          0x00000200
 34 #define IORESOURCE_REG          0x00000300      /* Register offsets */
 35 #define IORESOURCE_IRQ          0x00000400
 36 #define IORESOURCE_DMA          0x00000800
 37 #define IORESOURCE_BUS          0x00001000

实际上我有一个用于平台设备的容器,但它是在探测函数中动态分配和初始化的。

我的问题是如何将通用指针作为资源传递给设备?或者我怎样才能以最干净的方式做到这一点?

4

1 回答 1

4

platform_data按照您在问题中链接的 LWN 文章底部的说明使用。在您的情况下,您的数据结构将如下所示。这显然是未经测试的,但你明白了。您的 platform_data 结构将保存您在定义设备细节的同时设置的函数指针。

int sleep_function_chip1(struct platform_device *pdev)
{
    // Go to sleep
    return 0;
}
int resume_function_chip1(struct platform_device *pdev)
{
    // Resume
    return 0;
}

struct my_platform_data {
    int (*sleep_function)(struct platform_device *);
    int (*resume_function)(struct platform_device *);
};

// Instance of my_platform_data for a particular hardware (called chip1 for now)
static struct my_platform_data my_platform_data_chip1 = {
    .sleep_function  = &sleep_function_chip1,
    .resume_function = &resume_function_chip1,
};

// Second instance of my_platform_data for a different hardware (called chip2 for now)
static struct my_platform_data my_platform_data_chip2 = {
    .sleep_function  = &sleep_function_chip2,
    .resume_function = &resume_function_chip2,
};

// Now include that data when you create the descriptor for
// your platform
static struct platform_device my_platform_device_chip1 = {
    .name       = "my_device",
    .id     = 0,
    .dev = {
        .platform_data = &my_platform_data_chip1,
    }
};

int some_driver_function() {
    struct platform_device *pdev;
    pdev = // wherever you store this

    // Any time you need that data, extract the platform_data pointer
    struct my_platform_data *pd = (struct my_platform_data*)pdev->dev.platform_data;

    // Call the function pointer
    pd->sleep_function(pdev);
}
于 2013-09-04T14:28:35.677 回答