static int sec_pmic_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct sec_platform_data *pdata = i2c->dev.platform_data; struct sec_pmic_dev *sec_pmic; int ret; sec_pmic = devm_kzalloc(&i2c->dev, sizeof(struct sec_pmic_dev), GFP_KERNEL); if (sec_pmic == NULL) return -ENOMEM; i2c_set_clientdata(i2c, sec_pmic); sec_pmic->dev = &i2c->dev; sec_pmic->i2c = i2c; sec_pmic->irq = i2c->irq; sec_pmic->type = sec_i2c_get_driver_data(i2c, id); mutex_init(&sec_pmic->iolock); if (sec_pmic->dev->of_node) { pdata = sec_pmic_i2c_parse_dt_pdata(sec_pmic->dev); if (IS_ERR(pdata)) { ret = PTR_ERR(pdata); return ret; } pdata->device_type = sec_pmic->type; } if (pdata) { sec_pmic->device_type = pdata->device_type; sec_pmic->ono = pdata->ono; sec_pmic->irq_base = pdata->irq_base; sec_pmic->wakeup = true; sec_pmic->pdata = pdata; sec_pmic->irq = i2c->irq; } sec_pmic->regmap = devm_regmap_init_i2c(i2c, &sec_regmap_config); if (IS_ERR(sec_pmic->regmap)) { ret = PTR_ERR(sec_pmic->regmap); dev_err(&i2c->dev, "Failed to allocate register map: %d\n", ret); return ret; } sec_pmic->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); if (!sec_pmic->rtc) { dev_err(&i2c->dev, "Failed to allocate I2C for RTC\n"); return -ENODEV; } if (pdata && pdata->ten_bit_address) sec_pmic->rtc->flags |= I2C_CLIENT_TEN; i2c_set_clientdata(sec_pmic->rtc, sec_pmic); sec_pmic->rtc_regmap = devm_regmap_init_i2c(sec_pmic->rtc, &sec_regmap_config); if (IS_ERR(sec_pmic->rtc_regmap)) { ret = PTR_ERR(sec_pmic->rtc_regmap); dev_err(&sec_pmic->rtc->dev, "Failed to allocate register map: %d\n", ret); return ret; } if (pdata && pdata->cfg_pmic_irq) pdata->cfg_pmic_irq(); sec_irq_init(sec_pmic); #ifdef CONFIG_EXYNOS_MBOX sec_pmic->ops = &exynos_apm_function_ops; register_apm_notifier(&exynos_apm_notifier); #endif pm_runtime_set_active(sec_pmic->dev); switch (sec_pmic->device_type) { case S5M8751X: ret = mfd_add_devices(sec_pmic->dev, -1, s5m8751_devs, ARRAY_SIZE(s5m8751_devs), NULL, 0, NULL); break; case S5M8763X: ret = mfd_add_devices(sec_pmic->dev, -1, s5m8763_devs, ARRAY_SIZE(s5m8763_devs), NULL, 0, NULL); break; case S5M8767X: ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs, ARRAY_SIZE(s5m8767_devs), NULL, 0, NULL); break; case S2MPS11X: ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs, ARRAY_SIZE(s2mps11_devs), NULL, 0, NULL); break; case S2MPS13X: ret = mfd_add_devices(sec_pmic->dev, -1, s2mps13_devs, ARRAY_SIZE(s2mps13_devs), NULL, 0, NULL); break; case S2MPS15X: ret = mfd_add_devices(sec_pmic->dev, -1, s2mps15_devs, ARRAY_SIZE(s2mps15_devs), NULL, 0, NULL); break; case S2MPU03X: ret = mfd_add_devices(sec_pmic->dev, -1, s2mpu03_devs, ARRAY_SIZE(s2mpu03_devs), NULL, 0, NULL); break; case S2MPS16X: ret = mfd_add_devices(sec_pmic->dev, -1, s2mps16_devs, ARRAY_SIZE(s2mps16_devs), NULL, 0, NULL); break; default: /* If this happens the probe function is problem */ BUG(); } if (ret < 0) goto err; return ret; err: mfd_remove_devices(sec_pmic->dev); sec_irq_exit(sec_pmic); i2c_unregister_device(sec_pmic->rtc); #ifdef CONFIG_EXYNOS_MBOX unregister_apm_notifier(&exynos_apm_notifier); #endif return ret; }
static int sec_pmic_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct sec_pmic_platform_data *pdata = i2c->dev.platform_data; struct sec_pmic_dev *sec_pmic; int ret = 0; sec_pmic = devm_kzalloc(&i2c->dev, sizeof(struct sec_pmic_dev), GFP_KERNEL); if (sec_pmic == NULL) return -ENOMEM; i2c_set_clientdata(i2c, sec_pmic); sec_pmic->dev = &i2c->dev; sec_pmic->i2c = i2c; sec_pmic->irq = i2c->irq; sec_pmic->type = id->driver_data; if (pdata) { sec_pmic->device_type = pdata->device_type; sec_pmic->ono = pdata->ono; sec_pmic->irq_base = pdata->irq_base; sec_pmic->wakeup = pdata->wakeup; } sec_pmic->regmap = regmap_init_i2c(i2c, &sec_regmap_config); if (IS_ERR(sec_pmic->regmap)) { ret = PTR_ERR(sec_pmic->regmap); dev_err(&i2c->dev, "Failed to allocate register map: %d\n", ret); goto err4; } mutex_init(&sec_pmic->iolock); sec_pmic->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); if (IS_ERR(sec_pmic->rtc)) { ret = PTR_ERR(sec_pmic->rtc); dev_err(&i2c->dev, "Address %02x unavailable\n", RTC_I2C_ADDR); goto err3; } i2c_set_clientdata(sec_pmic->rtc, sec_pmic); sec_pmic->rtc_regmap = regmap_init_i2c(sec_pmic->rtc, &sec_regmap_config); if (IS_ERR(sec_pmic->rtc_regmap)) { ret = PTR_ERR(sec_pmic->rtc_regmap); dev_err(&sec_pmic->rtc->dev, "Failed to allocate register map: %d\n", ret); goto err2; } if (pdata && pdata->cfg_pmic_irq) pdata->cfg_pmic_irq(); sec_irq_init(sec_pmic); pm_runtime_set_active(sec_pmic->dev); switch (sec_pmic->device_type) { case S5M8751X: ret = mfd_add_devices(sec_pmic->dev, -1, s5m8751_devs, ARRAY_SIZE(s5m8751_devs), NULL, 0); break; case S5M8763X: ret = mfd_add_devices(sec_pmic->dev, -1, s5m8763_devs, ARRAY_SIZE(s5m8763_devs), NULL, 0); break; case S5M8767X: ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs, ARRAY_SIZE(s5m8767_devs), NULL, 0); break; case S2MPS11X: ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs, ARRAY_SIZE(s2mps11_devs), NULL, 0); break; default: /* If this happens the probe function is problem */ BUG(); } if (ret < 0) goto err1; return ret; err1: sec_irq_exit(sec_pmic); regmap_exit(sec_pmic->rtc_regmap); err2: i2c_unregister_device(sec_pmic->rtc); err3: regmap_exit(sec_pmic->regmap); err4: return ret; }
static int sec_pmic_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct sec_platform_data *pdata = dev_get_platdata(&i2c->dev); const struct regmap_config *regmap; const struct mfd_cell *sec_devs; struct sec_pmic_dev *sec_pmic; unsigned long device_type; int ret, num_sec_devs; sec_pmic = devm_kzalloc(&i2c->dev, sizeof(struct sec_pmic_dev), GFP_KERNEL); if (sec_pmic == NULL) return -ENOMEM; i2c_set_clientdata(i2c, sec_pmic); sec_pmic->dev = &i2c->dev; sec_pmic->i2c = i2c; sec_pmic->irq = i2c->irq; device_type = sec_i2c_get_driver_data(i2c, id); if (sec_pmic->dev->of_node) { pdata = sec_pmic_i2c_parse_dt_pdata(sec_pmic->dev); if (IS_ERR(pdata)) { ret = PTR_ERR(pdata); return ret; } pdata->device_type = device_type; } if (pdata) { sec_pmic->device_type = pdata->device_type; sec_pmic->irq_base = pdata->irq_base; sec_pmic->wakeup = pdata->wakeup; sec_pmic->pdata = pdata; } switch (sec_pmic->device_type) { case S2MPA01: regmap = &s2mpa01_regmap_config; break; case S2MPS11X: regmap = &s2mps11_regmap_config; break; case S2MPS13X: regmap = &s2mps13_regmap_config; break; case S2MPS14X: regmap = &s2mps14_regmap_config; break; case S5M8763X: regmap = &s5m8763_regmap_config; break; case S5M8767X: regmap = &s5m8767_regmap_config; break; case S2MPU02: regmap = &s2mpu02_regmap_config; break; default: regmap = &sec_regmap_config; break; } sec_pmic->regmap_pmic = devm_regmap_init_i2c(i2c, regmap); if (IS_ERR(sec_pmic->regmap_pmic)) { ret = PTR_ERR(sec_pmic->regmap_pmic); dev_err(&i2c->dev, "Failed to allocate register map: %d\n", ret); return ret; } if (pdata && pdata->cfg_pmic_irq) pdata->cfg_pmic_irq(); sec_irq_init(sec_pmic); pm_runtime_set_active(sec_pmic->dev); switch (sec_pmic->device_type) { case S5M8751X: sec_devs = s5m8751_devs; num_sec_devs = ARRAY_SIZE(s5m8751_devs); break; case S5M8763X: sec_devs = s5m8763_devs; num_sec_devs = ARRAY_SIZE(s5m8763_devs); break; case S5M8767X: sec_devs = s5m8767_devs; num_sec_devs = ARRAY_SIZE(s5m8767_devs); break; case S2MPA01: sec_devs = s2mpa01_devs; num_sec_devs = ARRAY_SIZE(s2mpa01_devs); break; case S2MPS11X: sec_devs = s2mps11_devs; num_sec_devs = ARRAY_SIZE(s2mps11_devs); break; case S2MPS13X: sec_devs = s2mps13_devs; num_sec_devs = ARRAY_SIZE(s2mps13_devs); break; case S2MPS14X: sec_devs = s2mps14_devs; num_sec_devs = ARRAY_SIZE(s2mps14_devs); break; case S2MPU02: sec_devs = s2mpu02_devs; num_sec_devs = ARRAY_SIZE(s2mpu02_devs); break; default: /* If this happens the probe function is problem */ BUG(); } ret = mfd_add_devices(sec_pmic->dev, -1, sec_devs, num_sec_devs, NULL, 0, NULL); if (ret) goto err_mfd; device_init_wakeup(sec_pmic->dev, sec_pmic->wakeup); return ret; err_mfd: sec_irq_exit(sec_pmic); return ret; }
static int sec_pmic_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct sec_platform_data *pdata = dev_get_platdata(&i2c->dev); const struct regmap_config *regmap; struct sec_pmic_dev *sec_pmic; int ret; sec_pmic = devm_kzalloc(&i2c->dev, sizeof(struct sec_pmic_dev), GFP_KERNEL); if (sec_pmic == NULL) return -ENOMEM; i2c_set_clientdata(i2c, sec_pmic); sec_pmic->dev = &i2c->dev; sec_pmic->i2c = i2c; sec_pmic->irq = i2c->irq; sec_pmic->type = sec_i2c_get_driver_data(i2c, id); if (sec_pmic->dev->of_node) { pdata = sec_pmic_i2c_parse_dt_pdata(sec_pmic->dev); if (IS_ERR(pdata)) { ret = PTR_ERR(pdata); return ret; } pdata->device_type = sec_pmic->type; } if (pdata) { sec_pmic->device_type = pdata->device_type; sec_pmic->ono = pdata->ono; sec_pmic->irq_base = pdata->irq_base; sec_pmic->wakeup = pdata->wakeup; sec_pmic->pdata = pdata; } switch (sec_pmic->device_type) { case S2MPS11X: regmap = &s2mps11_regmap_config; break; case S5M8763X: regmap = &s5m8763_regmap_config; break; case S5M8767X: regmap = &s5m8767_regmap_config; break; default: regmap = &sec_regmap_config; break; } sec_pmic->regmap_pmic = devm_regmap_init_i2c(i2c, regmap); if (IS_ERR(sec_pmic->regmap_pmic)) { ret = PTR_ERR(sec_pmic->regmap_pmic); dev_err(&i2c->dev, "Failed to allocate register map: %d\n", ret); return ret; } sec_pmic->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); if (!sec_pmic->rtc) { dev_err(&i2c->dev, "Failed to allocate I2C for RTC\n"); return -ENODEV; } i2c_set_clientdata(sec_pmic->rtc, sec_pmic); sec_pmic->regmap_rtc = devm_regmap_init_i2c(sec_pmic->rtc, &sec_rtc_regmap_config); if (IS_ERR(sec_pmic->regmap_rtc)) { ret = PTR_ERR(sec_pmic->regmap_rtc); dev_err(&i2c->dev, "Failed to allocate RTC register map: %d\n", ret); return ret; } if (pdata && pdata->cfg_pmic_irq) pdata->cfg_pmic_irq(); sec_irq_init(sec_pmic); pm_runtime_set_active(sec_pmic->dev); switch (sec_pmic->device_type) { case S5M8751X: ret = mfd_add_devices(sec_pmic->dev, -1, s5m8751_devs, ARRAY_SIZE(s5m8751_devs), NULL, 0, NULL); break; case S5M8763X: ret = mfd_add_devices(sec_pmic->dev, -1, s5m8763_devs, ARRAY_SIZE(s5m8763_devs), NULL, 0, NULL); break; case S5M8767X: ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs, ARRAY_SIZE(s5m8767_devs), NULL, 0, NULL); break; case S2MPS11X: ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs, ARRAY_SIZE(s2mps11_devs), NULL, 0, NULL); break; default: /* If this happens the probe function is problem */ BUG(); } if (ret) goto err; device_init_wakeup(sec_pmic->dev, sec_pmic->wakeup); return ret; err: sec_irq_exit(sec_pmic); i2c_unregister_device(sec_pmic->rtc); return ret; }