diff options
Diffstat (limited to 'drivers/mfd/tps65217.c')
| -rw-r--r-- | drivers/mfd/tps65217.c | 130 | 
1 files changed, 43 insertions, 87 deletions
diff --git a/drivers/mfd/tps65217.c b/drivers/mfd/tps65217.c index 61c097a98f5..a95e9421b73 100644 --- a/drivers/mfd/tps65217.c +++ b/drivers/mfd/tps65217.c @@ -24,11 +24,18 @@  #include <linux/slab.h>  #include <linux/regmap.h>  #include <linux/err.h> -#include <linux/regulator/of_regulator.h> +#include <linux/of.h> +#include <linux/of_device.h>  #include <linux/mfd/core.h>  #include <linux/mfd/tps65217.h> +static struct mfd_cell tps65217s[] = { +	{ +		.name = "tps65217-pmic", +	}, +}; +  /**   * tps65217_reg_read: Read a single tps65217 register.   * @@ -133,83 +140,48 @@ int tps65217_clear_bits(struct tps65217 *tps, unsigned int reg,  }  EXPORT_SYMBOL_GPL(tps65217_clear_bits); -#ifdef CONFIG_OF -static struct of_regulator_match reg_matches[] = { -	{ .name = "dcdc1", .driver_data = (void *)TPS65217_DCDC_1 }, -	{ .name = "dcdc2", .driver_data = (void *)TPS65217_DCDC_2 }, -	{ .name = "dcdc3", .driver_data = (void *)TPS65217_DCDC_3 }, -	{ .name = "ldo1", .driver_data = (void *)TPS65217_LDO_1 }, -	{ .name = "ldo2", .driver_data = (void *)TPS65217_LDO_2 }, -	{ .name = "ldo3", .driver_data = (void *)TPS65217_LDO_3 }, -	{ .name = "ldo4", .driver_data = (void *)TPS65217_LDO_4 }, -}; - -static struct tps65217_board *tps65217_parse_dt(struct i2c_client *client) -{ -	struct device_node *node = client->dev.of_node; -	struct tps65217_board *pdata; -	struct device_node *regs; -	int count = ARRAY_SIZE(reg_matches); -	int ret, i; - -	regs = of_find_node_by_name(node, "regulators"); -	if (!regs) -		return NULL; - -	ret = of_regulator_match(&client->dev, regs, reg_matches, count); -	of_node_put(regs); -	if ((ret < 0) || (ret > count)) -		return NULL; - -	count = ret; -	pdata = devm_kzalloc(&client->dev, count * sizeof(*pdata), GFP_KERNEL); -	if (!pdata) -		return NULL; - -	for (i = 0; i < count; i++) { -		if (!reg_matches[i].init_data || !reg_matches[i].of_node) -			continue; - -		pdata->tps65217_init_data[i] = reg_matches[i].init_data; -		pdata->of_node[i] = reg_matches[i].of_node; -	} - -	return pdata; -} - -static struct of_device_id tps65217_of_match[] = { -	{ .compatible = "ti,tps65217", }, -	{ }, -}; -#else -static struct tps65217_board *tps65217_parse_dt(struct i2c_client *client) -{ -	return NULL; -} -#endif -  static struct regmap_config tps65217_regmap_config = {  	.reg_bits = 8,  	.val_bits = 8,  }; +static const struct of_device_id tps65217_of_match[] = { +	{ .compatible = "ti,tps65217", .data = (void *)TPS65217 }, +	{ /* sentinel */ }, +}; +  static int __devinit tps65217_probe(struct i2c_client *client,  				const struct i2c_device_id *ids)  {  	struct tps65217 *tps; -	struct regulator_init_data *reg_data; -	struct tps65217_board *pdata = client->dev.platform_data; -	int i, ret;  	unsigned int version; +	unsigned int chip_id = ids->driver_data; +	const struct of_device_id *match; +	int ret; + +	if (client->dev.of_node) { +		match = of_match_device(tps65217_of_match, &client->dev); +		if (!match) { +			dev_err(&client->dev, +				"Failed to find matching dt id\n"); +			return -EINVAL; +		} +		chip_id = (unsigned int)match->data; +	} -	if (!pdata && client->dev.of_node) -		pdata = tps65217_parse_dt(client); +	if (!chip_id) { +		dev_err(&client->dev, "id is null.\n"); +		return -ENODEV; +	}  	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);  	if (!tps)  		return -ENOMEM; -	tps->pdata = pdata; +	i2c_set_clientdata(client, tps); +	tps->dev = &client->dev; +	tps->id = chip_id; +  	tps->regmap = devm_regmap_init_i2c(client, &tps65217_regmap_config);  	if (IS_ERR(tps->regmap)) {  		ret = PTR_ERR(tps->regmap); @@ -218,8 +190,12 @@ static int __devinit tps65217_probe(struct i2c_client *client,  		return ret;  	} -	i2c_set_clientdata(client, tps); -	tps->dev = &client->dev; +	ret = mfd_add_devices(tps->dev, -1, tps65217s, +			      ARRAY_SIZE(tps65217s), NULL, 0, NULL); +	if (ret < 0) { +		dev_err(tps->dev, "mfd_add_devices failed: %d\n", ret); +		return ret; +	}  	ret = tps65217_reg_read(tps, TPS65217_REG_CHIPID, &version);  	if (ret < 0) { @@ -232,41 +208,21 @@ static int __devinit tps65217_probe(struct i2c_client *client,  			(version & TPS65217_CHIPID_CHIP_MASK) >> 4,  			version & TPS65217_CHIPID_REV_MASK); -	for (i = 0; i < TPS65217_NUM_REGULATOR; i++) { -		struct platform_device *pdev; - -		pdev = platform_device_alloc("tps65217-pmic", i); -		if (!pdev) { -			dev_err(tps->dev, "Cannot create regulator %d\n", i); -			continue; -		} - -		pdev->dev.parent = tps->dev; -		pdev->dev.of_node = pdata->of_node[i]; -		reg_data = pdata->tps65217_init_data[i]; -		platform_device_add_data(pdev, reg_data, sizeof(*reg_data)); -		tps->regulator_pdev[i] = pdev; - -		platform_device_add(pdev); -	} -  	return 0;  }  static int __devexit tps65217_remove(struct i2c_client *client)  {  	struct tps65217 *tps = i2c_get_clientdata(client); -	int i; -	for (i = 0; i < TPS65217_NUM_REGULATOR; i++) -		platform_device_unregister(tps->regulator_pdev[i]); +	mfd_remove_devices(tps->dev);  	return 0;  }  static const struct i2c_device_id tps65217_id_table[] = { -	{"tps65217", 0xF0}, -	{/* end of list */} +	{"tps65217", TPS65217}, +	{ /* sentinel */ }  };  MODULE_DEVICE_TABLE(i2c, tps65217_id_table);  |