static int __devinit axp_mfd_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct axp_platform_data *pdata = client->dev.platform_data; struct axp_mfd_chip *chip; int ret; chip = kzalloc(sizeof(struct axp_mfd_chip), GFP_KERNEL); if (chip == NULL) return -ENOMEM; axp = client; axp_cfg_board = pdata->axp_cfg; chip->client = client; chip->dev = &client->dev; chip->ops = &axp_mfd_ops[id->driver_data]; mutex_init(&chip->lock); INIT_WORK(&chip->irq_work, axp_mfd_irq_work); BLOCKING_INIT_NOTIFIER_HEAD(&chip->notifier_list); i2c_set_clientdata(client, chip); ret = chip->ops->init_chip(chip); if (ret) goto out_free_chip; /* ret = request_irq(client->irq, axp_mfd_irq_handler, IRQF_DISABLED, "axp_mfd", chip); if (ret) { dev_err(&client->dev, "failed to request irq %d\n", client->irq); goto out_free_chip; } */ ret = axp_mfd_add_subdevs(chip, pdata); if (ret) goto out_free_irq; /* PM hookup */ if(!pm_power_off) pm_power_off = axp_power_off; ret = axp_mfd_create_attrs(chip); if(ret){ return ret; } return 0; out_free_irq: free_irq(client->irq, chip); out_free_chip: i2c_set_clientdata(client, NULL); kfree(chip); return ret; }
static int __devinit axp_mfd_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct axp_platform_data *pdata = client->dev.platform_data; struct axp_mfd_chip *chip; int ret; chip = kzalloc(sizeof(struct axp_mfd_chip), GFP_KERNEL); if (chip == NULL) return -ENOMEM; axp = client; chip->client = client; chip->dev = &client->dev; chip->ops = &axp_mfd_ops[id->driver_data]; mutex_init(&chip->lock); INIT_WORK(&chip->irq_work, axp_mfd_irq_work); BLOCKING_INIT_NOTIFIER_HEAD(&chip->notifier_list); i2c_set_clientdata(client, chip); ret = chip->ops->init_chip(chip); if (ret) goto out_free_chip; ret = request_irq(client->irq, axp_mfd_irq_handler, IRQF_DISABLED, "axp_mfd", chip); if (ret) { dev_err(&client->dev, "failed to request irq %d\n", client->irq); goto out_free_chip; } /* The irq for the A20 NMI pin needs to be enabled separately */ if (sunxi_is_sun7i() && client->irq == SW_INT_IRQNO_ENMI) { writel(0x01, NMI_IRQ_PEND_REG); /* Clear any pending irqs */ writel(0x01, NMI_IRQ_ENABLE_REG); /* Enable NMI irq pin */ } ret = axp_mfd_add_subdevs(chip, pdata); if (ret) goto out_free_irq; /* PM hookup */ if(!pm_power_off) pm_power_off = axp_power_off; ret = axp_mfd_create_attrs(chip); if(ret){ return ret; } /* set ac/usb_in shutdown mean restart */ ret = script_parser_fetch("target", "power_start", &power_start, sizeof(int)); if (ret) { printk("[AXP]axp driver uning configuration failed(%d)\n", __LINE__); power_start = 0; printk("[AXP]power_start = %d\n",power_start); } return 0; out_free_irq: free_irq(client->irq, chip); out_free_chip: i2c_set_clientdata(client, NULL); kfree(chip); return ret; }