diff options
author | Alexander Shiyan <shc_work@mail.ru> | 2012-04-10 23:44:16 +0400 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-04-11 09:51:01 +0200 |
commit | 6c727af2c27d84f26a04a8075890f575ebf91814 (patch) | |
tree | e99be7e11faf5939c933c7d9f3903376d68dadb0 /drivers | |
parent | e400e0b5925f14538f826ceeb5f0f0608c88d330 (diff) | |
download | barebox-6c727af2c27d84f26a04a8075890f575ebf91814.tar.gz barebox-6c727af2c27d84f26a04a8075890f575ebf91814.tar.xz |
Final switch to use combined driver mc13xxx
Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mfd/Kconfig | 4 | ||||
-rw-r--r-- | drivers/mfd/Makefile | 1 | ||||
-rw-r--r-- | drivers/mfd/mc13783.c | 237 |
3 files changed, 0 insertions, 242 deletions
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index ad7c2851b8..57f40031bd 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -34,8 +34,4 @@ config I2C_TWL6030 select I2C_TWLCORE bool "TWL6030 driver" -config DRIVER_SPI_MC13783 - depends on SPI - bool "MC13783 a.k.a. PMIC driver" - endmenu diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index a9a02878e4..e11223b1f9 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -6,4 +6,3 @@ obj-$(CONFIG_I2C_LP3972) += lp3972.o obj-$(CONFIG_I2C_TWLCORE) += twl-core.o obj-$(CONFIG_I2C_TWL4030) += twl4030.o obj-$(CONFIG_I2C_TWL6030) += twl6030.o -obj-$(CONFIG_DRIVER_SPI_MC13783) += mc13783.o diff --git a/drivers/mfd/mc13783.c b/drivers/mfd/mc13783.c deleted file mode 100644 index 19e2780920..0000000000 --- a/drivers/mfd/mc13783.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (C) 2007 Sascha Hauer, Pengutronix - * - * 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 <common.h> -#include <init.h> -#include <driver.h> -#include <spi/spi.h> -#include <xfuncs.h> -#include <errno.h> -#include <mach/pmic.h> - -#define REG_INTERRUPT_STATUS_0 0x0 -#define REG_INTERRUPT_MASK 0x1 -#define REG_INTERRUPT_SENSE_0 0x2 -#define REG_INTERRUPT_STATUS_1 0x3 -#define REG_INTERRUPT_MASK_1 0x4 -#define REG_INTERRUPT_SENSE_1 0x5 -#define REG_POWER_UP_MODE_SENSE 0x6 -#define REG_REVISION 0x7 -#define REG_SEMAPHORE 0x8 -#define REG_ARBITRATION_PERIPHERAL_AUDIO 0x9 -#define REG_ARBITRATION_SWITCHERS 0xa -#define REG_ARBITRATION_REGULATORS(x) (0xb + (x)) /* 0 .. 1 */ -#define REG_POWER_CONTROL(x) (0xd + (x)) /* 0 .. 2 */ -#define REG_REGEN_ASSIGNMENT 0x10 -#define REG_CONTROL_SPARE 0x11 -#define REG_MEMORY_A 0x12 -#define REG_MEMORY_B 0x13 -#define REG_RTC_TIME 0x14 -#define REG_RTC_ALARM 0x15 -#define REG_RTC_DAY 0x16 -#define REG_RTC_DAY_ALARM 0x17 -#define REG_SWITCHERS(x) (0x18 + (x)) /* 0 .. 5 */ -#define REG_REGULATOR_SETTING(x) (0x1e + (x)) /* 0 .. 1 */ -#define REG_REGULATOR_MODE(x) (0x20 + (x)) /* 0 .. 1 */ -#define REG_POWER_MISCELLANEOUS 0x22 -#define REG_POWER_SPARE 0x23 -#define REG_AUDIO_RX_0 0x24 -#define REG_AUDIO_RX_1 0x25 -#define REG_AUDIO_TX 0x26 -#define REG_AUDIO_SSI_NETWORK 0x27 -#define REG_AUDIO_CODEC 0x28 -#define REG_AUDIO_STEREO_DAC 0x29 -#define REG_AUDIO_SPARE 0x2a -#define REG_ADC(x) (0x2b + (x)) /* 0 .. 4 */ -#define REG_CHARGER 0x30 -#define REG_USB 0x31 -#define REG_CHARGE_USB_SPARE 0x32 -#define REG_LED_CONTROL(x) (0x33 + (x)) /* 0 .. 5 */ -#define REG_SPARE 0x39 -#define REG_TRIM(x) (0x3a + (x)) /* 0 .. 1 */ -#define REG_TEST(x) (0x3c + (x)) /* 0 .. 3 */ - -#define MXC_PMIC_REG_NUM(reg) (((reg) & 0x3f) << 25) -#define MXC_PMIC_WRITE (1 << 31) - -#define SWX_VOLTAGE(x) ((x) & 0x3f) -#define SWX_VOLTAGE_DVS(x) (((x) & 0x3f) << 6) -#define SWX_VOLTAGE_STANDBY(x) (((x) & 0x3f) << 12) -#define SWX_VOLTAGE_1_450 0x16 - -#define SWX_MODE_OFF 0 -#define SWX_MODE_NO_PULSE_SKIP 1 -#define SWX_MODE_PULSE_SKIP 2 -#define SWX_MODE_LOW_POWER_PFM 3 - -#define SW1A_MODE(x) (((x) & 0x3) << 0) -#define SW1A_MODE_STANDBY(x) (((x) & 0x3) << 2) -#define SW1B_MODE(x) (((x) & 0x3) << 10) -#define SW1B_MODE_STANDBY(x) (((x) & 0x3) << 12) -#define SW1A_SOFTSTART (1 << 9) -#define SW1B_SOFTSTART (1 << 17) -#define SW_PLL_FACTOR(x) (((x) - 28) << 19) - -struct pmic_priv { - struct cdev cdev; - struct spi_device *spi; -}; - -static int spi_rw(struct spi_device *spi, void * buf, size_t len) -{ - int ret; - - struct spi_transfer t = { - .tx_buf = (const void *)buf, - .rx_buf = buf, - .len = len, - .cs_change = 0, - .delay_usecs = 0, - }; - struct spi_message m; - - spi_message_init(&m); - spi_message_add_tail(&t, &m); - if ((ret = spi_sync(spi, &m))) - return ret; - return 0; -} - -static uint32_t pmic_read_reg(struct pmic_priv *pmic, int reg) -{ - uint32_t buf; - - buf = MXC_PMIC_REG_NUM(reg); - - spi_rw(pmic->spi, &buf, 4); - - return buf; -} - -static void pmic_write_reg(struct pmic_priv *pmic, int reg, uint32_t val) -{ - uint32_t buf = MXC_PMIC_REG_NUM(reg) | MXC_PMIC_WRITE | (val & 0xffffff); - - spi_rw(pmic->spi, &buf, 4); -} - -static struct pmic_priv *pmic_device; - -int pmic_power(void) -{ - if(!pmic_device) { - printf("%s: no pmic device available\n", __FUNCTION__); - return -ENODEV; - } - - pmic_write_reg(pmic_device, REG_SWITCHERS(0), - SWX_VOLTAGE(SWX_VOLTAGE_1_450) | - SWX_VOLTAGE_DVS(SWX_VOLTAGE_1_450) | - SWX_VOLTAGE_STANDBY(SWX_VOLTAGE_1_450)); - - pmic_write_reg(pmic_device, REG_SWITCHERS(4), - SW1A_MODE(SWX_MODE_NO_PULSE_SKIP) | - SW1A_MODE_STANDBY(SWX_MODE_NO_PULSE_SKIP)| - SW1A_SOFTSTART | - SW1B_MODE(SWX_MODE_NO_PULSE_SKIP) | - SW1B_MODE_STANDBY(SWX_MODE_NO_PULSE_SKIP) | - SW1B_SOFTSTART | - SW_PLL_FACTOR(32) - ); - - return 0; -} - -ssize_t pmic_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) -{ - int i = count >> 2; - uint32_t *buf = _buf; - - offset >>= 2; - - while (i) { - *buf = pmic_read_reg(pmic_device, offset); - buf++; - i--; - offset++; - } - - return count; -} - -ssize_t pmic_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags) -{ - int i = count >> 2; - const uint32_t *buf = _buf; - - offset >>= 2; - - while (i) { - pmic_write_reg(pmic_device, offset, *buf); - buf++; - i--; - offset++; - } - - return count; -} - -static struct file_operations pmic_fops = { - .lseek = dev_lseek_default, - .read = pmic_read, - .write = pmic_write, -}; - -static int pmic_probe(struct device_d *dev) -{ - struct spi_device *spi = (struct spi_device *)dev->type_data; - - if (pmic_device) - return -EBUSY; - - pmic_device = xzalloc(sizeof(*pmic_device)); - - pmic_device->cdev.name = "pmic"; - pmic_device->cdev.size = 256; - pmic_device->cdev.dev = dev; - pmic_device->cdev.ops = &pmic_fops; - - spi->mode = SPI_MODE_0 | SPI_CS_HIGH; - spi->bits_per_word = 32; - pmic_device->spi = spi; - - devfs_create(&pmic_device->cdev); - - return 0; -} - -static struct driver_d pmic_driver = { - .name = "mc13783", - .probe = pmic_probe, -}; - -static int pmic_init(void) -{ - register_driver(&pmic_driver); - return 0; -} - -device_initcall(pmic_init); - |