static int soc_button_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id) { const struct soc_button_info *button_info = (void *)id->driver_data; struct soc_button_data *priv; struct platform_device *pd; int i; int error; priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; pnp_set_drvdata(pdev, priv); for (i = 0; i < BUTTON_TYPES; i++) { pd = soc_button_device_create(pdev, button_info, i == 0); if (IS_ERR(pd)) { error = PTR_ERR(pd); if (error != -ENODEV) { soc_button_remove(pdev); return error; } continue; } priv->children[i] = pd; } if (!priv->children[0] && !priv->children[1]) return -ENODEV; return 0; }
static int soc_button_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; const struct acpi_device_id *id; struct soc_button_info *button_info; struct soc_button_data *priv; struct platform_device *pd; int i; int error; id = acpi_match_device(dev->driver->acpi_match_table, dev); if (!id) return -ENODEV; button_info = (struct soc_button_info *)id->driver_data; if (gpiod_count(dev, KBUILD_MODNAME) <= 0) { dev_dbg(dev, "no GPIO attached, ignoring...\n"); return -ENODEV; } priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; platform_set_drvdata(pdev, priv); for (i = 0; i < BUTTON_TYPES; i++) { pd = soc_button_device_create(pdev, button_info, i == 0); if (IS_ERR(pd)) { error = PTR_ERR(pd); if (error != -ENODEV) { soc_button_remove(pdev); return error; } continue; } priv->children[i] = pd; } if (!priv->children[0] && !priv->children[1]) return -ENODEV; return 0; }