Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 58028762 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6: (22 commits)
  regulator: Remove default DEBUG define from TPS6586x
  regulator: tps6507x - add missing platform_set_drvdata in tps6507x_pmic_probe
  regulator: tps6586x - add regulator_unregister() in tps6586x_regulator_remove()
  mfd: max8998 - fix incorrect kfree(i2c) in i2c_driver probe callback handler
  regulator: lp3971 - remove unnecessary ret value checking in lp3971_i2c_write()
  regulator: max8660 - fix a memory leak in max8660_remove()
  regulator: max1586 - fix a memory leak in max1586_pmic_remove()
  regulator: Default GPIO controlled WM8994 regulators to disabled
  regulator: lp3971 - remove unnecessary ret value checking in lp3971_i2c_write()
  max8998: fix off-by-one value range checking
  regulator: tps6586x: fix millivolt return values and SM2 table
  regulator: tps6586x: add dependancy on MFD_TPS6585x
  regulator: add TPS6586X regulator driver
  regulator: MAX8998: set_voltage bugfix. ramp_up delay and min/max voltage
  regulator: add support for regulators on the ab8500 MFD
  ab8500-mfd: add regulator support to ab8500 mfd device
  tps65023: Allow registering similar TPS65021
  drivers: regulators: depend on MFD_MAX8998
  drivers: regulator: add Maxim 8998 driver
  ISL6271A voltage regulator support.
  ...
parents e83ddb33 120be663
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -293,6 +293,16 @@ config MFD_MAX8925
	  accessing the device, additional drivers must be enabled in order
	  accessing the device, additional drivers must be enabled in order
	  to use the functionality of the device.
	  to use the functionality of the device.


config MFD_MAX8998
	bool "Maxim Semiconductor MAX8998 PMIC Support"
	depends on I2C=y
	select MFD_CORE
	help
	  Say yes here to support for Maxim Semiconductor MAX8998. This is
	  a Power Management IC. This driver provies common support for
	  accessing the device, additional drivers must be enabled in order
	  to use the functionality of the device.

config MFD_WM8400
config MFD_WM8400
	tristate "Support Wolfson Microelectronics WM8400"
	tristate "Support Wolfson Microelectronics WM8400"
	select MFD_CORE
	select MFD_CORE
+1 −0
Original line number Original line Diff line number Diff line
@@ -58,6 +58,7 @@ obj-$(CONFIG_UCB1400_CORE) += ucb1400_core.o
obj-$(CONFIG_PMIC_DA903X)	+= da903x.o
obj-$(CONFIG_PMIC_DA903X)	+= da903x.o
max8925-objs			:= max8925-core.o max8925-i2c.o
max8925-objs			:= max8925-core.o max8925-i2c.o
obj-$(CONFIG_MFD_MAX8925)	+= max8925.o
obj-$(CONFIG_MFD_MAX8925)	+= max8925.o
obj-$(CONFIG_MFD_MAX8998)	+= max8998.o


pcf50633-objs			:= pcf50633-core.o pcf50633-irq.o
pcf50633-objs			:= pcf50633-core.o pcf50633-irq.o
obj-$(CONFIG_MFD_PCF50633)	+= pcf50633.o
obj-$(CONFIG_MFD_PCF50633)	+= pcf50633.o
+3 −1
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <linux/mfd/core.h>
#include <linux/mfd/core.h>
#include <linux/mfd/ab8500.h>
#include <linux/mfd/ab8500.h>
#include <linux/regulator/ab8500.h>


/*
/*
 * Interrupt register offsets
 * Interrupt register offsets
@@ -352,6 +353,7 @@ static struct mfd_cell ab8500_devs[] = {
	{ .name = "ab8500-audio", },
	{ .name = "ab8500-audio", },
	{ .name = "ab8500-usb", },
	{ .name = "ab8500-usb", },
	{ .name = "ab8500-pwm", },
	{ .name = "ab8500-pwm", },
	{ .name = "ab8500-regulator", },
};
};


int __devinit ab8500_init(struct ab8500 *ab8500)
int __devinit ab8500_init(struct ab8500 *ab8500)
@@ -411,7 +413,7 @@ int __devinit ab8500_init(struct ab8500 *ab8500)
			goto out_removeirq;
			goto out_removeirq;
	}
	}


	ret = mfd_add_devices(ab8500->dev, -1, ab8500_devs,
	ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
			      ARRAY_SIZE(ab8500_devs), NULL,
			      ARRAY_SIZE(ab8500_devs), NULL,
			      ab8500->irq_base);
			      ab8500->irq_base);
	if (ret)
	if (ret)

drivers/mfd/max8998.c

0 → 100644
+158 −0
Original line number Original line Diff line number Diff line
/*
 * max8698.c - mfd core driver for the Maxim 8998
 *
 *  Copyright (C) 2009-2010 Samsung Electronics
 *  Kyungmin Park <kyungmin.park@samsung.com>
 *  Marek Szyprowski <m.szyprowski@samsung.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/mutex.h>
#include <linux/mfd/core.h>
#include <linux/mfd/max8998.h>
#include <linux/mfd/max8998-private.h>

static struct mfd_cell max8998_devs[] = {
	{
		.name = "max8998-pmic",
	}
};

static int max8998_i2c_device_read(struct max8998_dev *max8998, u8 reg, u8 *dest)
{
	struct i2c_client *client = max8998->i2c_client;
	int ret;

	mutex_lock(&max8998->iolock);
	ret = i2c_smbus_read_byte_data(client, reg);
	mutex_unlock(&max8998->iolock);
	if (ret < 0)
		return ret;

	ret &= 0xff;
	*dest = ret;
	return 0;
}

static int max8998_i2c_device_write(struct max8998_dev *max8998, u8 reg, u8 value)
{
	struct i2c_client *client = max8998->i2c_client;
	int ret;

	mutex_lock(&max8998->iolock);
	ret = i2c_smbus_write_byte_data(client, reg, value);
	mutex_unlock(&max8998->iolock);
	return ret;
}

static int max8998_i2c_device_update(struct max8998_dev *max8998, u8 reg,
				     u8 val, u8 mask)
{
	struct i2c_client *client = max8998->i2c_client;
	int ret;

	mutex_lock(&max8998->iolock);
	ret = i2c_smbus_read_byte_data(client, reg);
	if (ret >= 0) {
		u8 old_val = ret & 0xff;
		u8 new_val = (val & mask) | (old_val & (~mask));
		ret = i2c_smbus_write_byte_data(client, reg, new_val);
		if (ret >= 0)
			ret = 0;
	}
	mutex_unlock(&max8998->iolock);
	return ret;
}

static int max8998_i2c_probe(struct i2c_client *i2c,
			    const struct i2c_device_id *id)
{
	struct max8998_dev *max8998;
	int ret = 0;

	max8998 = kzalloc(sizeof(struct max8998_dev), GFP_KERNEL);
	if (max8998 == NULL)
		return -ENOMEM;

	i2c_set_clientdata(i2c, max8998);
	max8998->dev = &i2c->dev;
	max8998->i2c_client = i2c;
	max8998->dev_read = max8998_i2c_device_read;
	max8998->dev_write = max8998_i2c_device_write;
	max8998->dev_update = max8998_i2c_device_update;
	mutex_init(&max8998->iolock);

	ret = mfd_add_devices(max8998->dev, -1,
			      max8998_devs, ARRAY_SIZE(max8998_devs),
			      NULL, 0);
	if (ret < 0)
		goto err;

	return ret;

err:
	mfd_remove_devices(max8998->dev);
	kfree(max8998);
	return ret;
}

static int max8998_i2c_remove(struct i2c_client *i2c)
{
	struct max8998_dev *max8998 = i2c_get_clientdata(i2c);

	mfd_remove_devices(max8998->dev);
	kfree(max8998);

	return 0;
}

static const struct i2c_device_id max8998_i2c_id[] = {
       { "max8998", 0 },
       { }
};
MODULE_DEVICE_TABLE(i2c, max8998_i2c_id);

static struct i2c_driver max8998_i2c_driver = {
	.driver = {
		   .name = "max8998",
		   .owner = THIS_MODULE,
	},
	.probe = max8998_i2c_probe,
	.remove = max8998_i2c_remove,
	.id_table = max8998_i2c_id,
};

static int __init max8998_i2c_init(void)
{
	return i2c_add_driver(&max8998_i2c_driver);
}
/* init early so consumer devices can complete system boot */
subsys_initcall(max8998_i2c_init);

static void __exit max8998_i2c_exit(void)
{
	i2c_del_driver(&max8998_i2c_driver);
}
module_exit(max8998_i2c_exit);

MODULE_DESCRIPTION("MAXIM 8998 multi-function core driver");
MODULE_AUTHOR("Kyungmin Park <kyungmin.park@samsung.com>");
MODULE_LICENSE("GPL");
+34 −0
Original line number Original line Diff line number Diff line
@@ -100,6 +100,14 @@ config REGULATOR_MAX8925
	help
	help
	  Say y here to support the voltage regulaltor of Maxim MAX8925 PMIC.
	  Say y here to support the voltage regulaltor of Maxim MAX8925 PMIC.


config REGULATOR_MAX8998
	tristate "Maxim 8998 voltage regulator"
	depends on MFD_MAX8998
	help
	  This driver controls a Maxim 8998 voltage output regulator
	  via I2C bus. The provided regulator is suitable for S3C6410
	  and S5PC1XX chips to control VCC_CORE and VCC_USIM voltages.

config REGULATOR_TWL4030
config REGULATOR_TWL4030
	bool "TI TWL4030/TWL5030/TWL6030/TPS695x0 PMIC"
	bool "TI TWL4030/TWL5030/TWL6030/TPS695x0 PMIC"
	depends on TWL4030_CORE
	depends on TWL4030_CORE
@@ -201,5 +209,31 @@ config REGULATOR_88PM8607
	help
	help
	  This driver supports 88PM8607 voltage regulator chips.
	  This driver supports 88PM8607 voltage regulator chips.


config REGULATOR_ISL6271A
	tristate "Intersil ISL6271A Power regulator"
	depends on I2C
	help
	  This driver supports ISL6271A voltage regulator chip.

config REGULATOR_AD5398
	tristate "Analog Devices AD5398/AD5821 regulators"
	depends on I2C
	help
	  This driver supports AD5398 and AD5821 current regulator chips.
	  If building into module, its name is ad5398.ko.

config REGULATOR_AB8500
	bool "ST-Ericsson AB8500 Power Regulators"
	depends on AB8500_CORE
	help
	  This driver supports the regulators found on the ST-Ericsson mixed
	  signal AB8500 PMIC

config REGULATOR_TPS6586X
	tristate "TI TPS6586X Power regulators"
	depends on MFD_TPS6586X
	help
	  This driver supports TPS6586X voltage regulator chips.

endif
endif
Loading