/** * Create platform device during acpi scan attach handle. * Return value > 0 on success of creating device. */ static int acpi_apd_create_device(struct acpi_device *adev, const struct acpi_device_id *id) { const struct apd_device_desc *dev_desc = (void *)id->driver_data; struct apd_private_data *pdata; struct platform_device *pdev; int ret; if (!dev_desc) { pdev = acpi_create_platform_device(adev); return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1; } pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); if (!pdata) return -ENOMEM; pdata->adev = adev; pdata->dev_desc = dev_desc; if (dev_desc->setup) { ret = dev_desc->setup(pdata); if (ret) goto err_out; } if (dev_desc->properties) { ret = device_add_properties(&adev->dev, dev_desc->properties); if (ret) goto err_out; } adev->driver_data = pdata; pdev = acpi_create_platform_device(adev); if (!IS_ERR_OR_NULL(pdev)) return 1; ret = PTR_ERR(pdev); adev->driver_data = NULL; err_out: kfree(pdata); return ret; }
/* * Note this MUST be called before snd_soc_register_card(), so that the props * are in place before the codec component driver's probe function parses them. */ static int byt_rt5651_add_codec_device_props(struct device *i2c_dev) { struct property_entry props[MAX_NO_PROPS] = {}; int cnt = 0; props[cnt++] = PROPERTY_ENTRY_U32("realtek,jack-detect-source", BYT_RT5651_JDSRC(byt_rt5651_quirk)); props[cnt++] = PROPERTY_ENTRY_U32("realtek,over-current-threshold-microamp", BYT_RT5651_OVCD_TH(byt_rt5651_quirk) * 100); props[cnt++] = PROPERTY_ENTRY_U32("realtek,over-current-scale-factor", BYT_RT5651_OVCD_SF(byt_rt5651_quirk)); if (byt_rt5651_quirk & BYT_RT5651_DMIC_EN) props[cnt++] = PROPERTY_ENTRY_BOOL("realtek,dmic-en"); return device_add_properties(i2c_dev, props); }
/** * platform_device_add_properties - add built-in properties to a platform device * @pdev: platform device to add properties to * @properties: null terminated array of properties to add * * The function will take deep copy of @properties and attach the copy to the * platform device. The memory associated with properties will be freed when the * platform device is released. */ int platform_device_add_properties(struct platform_device *pdev, const struct property_entry *properties) { return device_add_properties(&pdev->dev, properties); }