pdata和isys的联系(二)

pdev->dev.platform_data

1
2
3
4
5
6
7
8
9
10
11
static struct  pdata = {
.subdevs = (struct intel_ipu4_isys_subdev_info *[]) {
&ov13858_crl_sd,
...
},
};

static void ipu4_quirk(struct pci_dev *pci_dev)
{
pci_dev->dev.platform_data = &pdata;
}

pdata->spdata

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static int intel_ipu4_pci_probe(struct pci_dev *pdev,
const struct pci_device_id *id)
isp->isys = intel_ipu4_isys_init(
pdev, &isp->isys_iommu->dev, &isp->isys_iommu->dev,
isys_base, isys_ipdata,
pdev->dev.platform_data,
0, is_intel_ipu_hw_fpga(isp) ?
INTEL_IPU4_ISYS_TYPE_INTEL_IPU4_FPGA :
INTEL_IPU4_ISYS_TYPE_INTEL_IPU4);
pdata->spdata = spdata;
return intel_ipu4_bus_add_device(pdev, parent, pdata, iommu, NULL,
INTEL_IPU4_ISYS_NAME, nr);
adev = kzalloc(sizeof(*adev), GFP_KERNEL);
adev->pdata = pdata;
}
1
2
3
4
5
6
7
8
9
10
11
static int isys_probe(struct intel_ipu4_bus_device *adev)
{
isys->pdata = adev->pdata;

rval = isys_register_devices(isys);
isys_register_ext_subdevs(isys);
struct *spdata = isys->pdata->spdata;
for (sd_info = spdata->subdevs; *sd_info; sd_info++)
isys_register_ext_subdev(isys, *sd_info, false);

}

所以sd_info就指向了ov13858_crl_sd,将依次遍历pdata->subdevs。