diff options
Diffstat (limited to 'drivers/mfd/mc13xxx-core.c')
| -rw-r--r-- | drivers/mfd/mc13xxx-core.c | 66 | 
1 files changed, 29 insertions, 37 deletions
diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c index 2a9b100c482..acf5dd712eb 100644 --- a/drivers/mfd/mc13xxx-core.c +++ b/drivers/mfd/mc13xxx-core.c @@ -158,11 +158,6 @@ int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val)  {  	int ret; -	BUG_ON(!mutex_is_locked(&mc13xxx->lock)); - -	if (offset > MC13XXX_NUMREGS) -		return -EINVAL; -  	ret = regmap_read(mc13xxx->regmap, offset, val);  	dev_vdbg(mc13xxx->dev, "[0x%02x] -> 0x%06x\n", offset, *val); @@ -172,11 +167,9 @@ EXPORT_SYMBOL(mc13xxx_reg_read);  int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val)  { -	BUG_ON(!mutex_is_locked(&mc13xxx->lock)); -  	dev_vdbg(mc13xxx->dev, "[0x%02x] <- 0x%06x\n", offset, val); -	if (offset > MC13XXX_NUMREGS || val > 0xffffff) +	if (val >= BIT(24))  		return -EINVAL;  	return regmap_write(mc13xxx->regmap, offset, val); @@ -186,7 +179,6 @@ EXPORT_SYMBOL(mc13xxx_reg_write);  int mc13xxx_reg_rmw(struct mc13xxx *mc13xxx, unsigned int offset,  		u32 mask, u32 val)  { -	BUG_ON(!mutex_is_locked(&mc13xxx->lock));  	BUG_ON(val & ~mask);  	dev_vdbg(mc13xxx->dev, "[0x%02x] <- 0x%06x (mask: 0x%06x)\n",  			offset, val, mask); @@ -644,42 +636,36 @@ static inline int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx)  }  #endif -int mc13xxx_common_init(struct mc13xxx *mc13xxx, -		struct mc13xxx_platform_data *pdata, int irq) +int mc13xxx_common_init(struct device *dev)  { +	struct mc13xxx_platform_data *pdata = dev_get_platdata(dev); +	struct mc13xxx *mc13xxx = dev_get_drvdata(dev);  	int ret;  	u32 revision; -	mc13xxx_lock(mc13xxx); +	mc13xxx->dev = dev;  	ret = mc13xxx_reg_read(mc13xxx, MC13XXX_REVISION, &revision);  	if (ret) -		goto err_revision; +		return ret;  	mc13xxx->variant->print_revision(mc13xxx, revision);  	/* mask all irqs */  	ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK0, 0x00ffffff);  	if (ret) -		goto err_mask; +		return ret;  	ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK1, 0x00ffffff);  	if (ret) -		goto err_mask; - -	ret = request_threaded_irq(irq, NULL, mc13xxx_irq_thread, -			IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13xxx", mc13xxx); - -	if (ret) { -err_mask: -err_revision: -		mc13xxx_unlock(mc13xxx);  		return ret; -	} -	mc13xxx->irq = irq; +	mutex_init(&mc13xxx->lock); -	mc13xxx_unlock(mc13xxx); +	ret = request_threaded_irq(mc13xxx->irq, NULL, mc13xxx_irq_thread, +			IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13xxx", mc13xxx); +	if (ret) +		return ret;  	if (mc13xxx_probe_flags_dt(mc13xxx) < 0 && pdata)  		mc13xxx->flags = pdata->flags; @@ -687,17 +673,9 @@ err_revision:  	if (mc13xxx->flags & MC13XXX_USE_ADC)  		mc13xxx_add_subdevice(mc13xxx, "%s-adc"); -	if (mc13xxx->flags & MC13XXX_USE_CODEC) -		mc13xxx_add_subdevice_pdata(mc13xxx, "%s-codec", -					pdata->codec, sizeof(*pdata->codec)); -  	if (mc13xxx->flags & MC13XXX_USE_RTC)  		mc13xxx_add_subdevice(mc13xxx, "%s-rtc"); -	if (mc13xxx->flags & MC13XXX_USE_TOUCHSCREEN) -		mc13xxx_add_subdevice_pdata(mc13xxx, "%s-ts", -				&pdata->touch, sizeof(pdata->touch)); -  	if (pdata) {  		mc13xxx_add_subdevice_pdata(mc13xxx, "%s-regulator",  			&pdata->regulators, sizeof(pdata->regulators)); @@ -705,23 +683,37 @@ err_revision:  				pdata->leds, sizeof(*pdata->leds));  		mc13xxx_add_subdevice_pdata(mc13xxx, "%s-pwrbutton",  				pdata->buttons, sizeof(*pdata->buttons)); +		if (mc13xxx->flags & MC13XXX_USE_CODEC) +			mc13xxx_add_subdevice_pdata(mc13xxx, "%s-codec", +				pdata->codec, sizeof(*pdata->codec)); +		if (mc13xxx->flags & MC13XXX_USE_TOUCHSCREEN) +			mc13xxx_add_subdevice_pdata(mc13xxx, "%s-ts", +				&pdata->touch, sizeof(pdata->touch));  	} else {  		mc13xxx_add_subdevice(mc13xxx, "%s-regulator");  		mc13xxx_add_subdevice(mc13xxx, "%s-led");  		mc13xxx_add_subdevice(mc13xxx, "%s-pwrbutton"); +		if (mc13xxx->flags & MC13XXX_USE_CODEC) +			mc13xxx_add_subdevice(mc13xxx, "%s-codec"); +		if (mc13xxx->flags & MC13XXX_USE_TOUCHSCREEN) +			mc13xxx_add_subdevice(mc13xxx, "%s-ts");  	}  	return 0;  }  EXPORT_SYMBOL_GPL(mc13xxx_common_init); -void mc13xxx_common_cleanup(struct mc13xxx *mc13xxx) +int mc13xxx_common_exit(struct device *dev)  { +	struct mc13xxx *mc13xxx = dev_get_drvdata(dev); +  	free_irq(mc13xxx->irq, mc13xxx); +	mfd_remove_devices(dev); +	mutex_destroy(&mc13xxx->lock); -	mfd_remove_devices(mc13xxx->dev); +	return 0;  } -EXPORT_SYMBOL_GPL(mc13xxx_common_cleanup); +EXPORT_SYMBOL_GPL(mc13xxx_common_exit);  MODULE_DESCRIPTION("Core driver for Freescale MC13XXX PMIC");  MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>");  | 
