From fc268d55844d6a714ab1a6131dc5cc9b8043cca9 Mon Sep 17 00:00:00 2001 From: Marc Kleine-Budde Date: Wed, 9 Dec 2009 02:19:33 +0100 Subject: mc9sdz60: clean up driver interface Export mc9sdz60_reg_read, mc9sdz60_reg_write and mc9sdz60_set_bits function instead of exposing the i2c interface. Signed-off-by: Marc Kleine-Budde --- include/i2c/mc9sdz60.h | 61 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) (limited to 'include') diff --git a/include/i2c/mc9sdz60.h b/include/i2c/mc9sdz60.h index 04cfca04ab..4cc233e058 100644 --- a/include/i2c/mc9sdz60.h +++ b/include/i2c/mc9sdz60.h @@ -1,7 +1,64 @@ +/* + * Copyright (C) 2009 Marc Kleine-Budde + * + * This file is released under the GPLv2 + * + * Derived from: + * - mcu_max8660-bus.h -- contains interface of the mc9sdz60 and max8660 + * Copyright 2004-2009 Freescale Semiconductor, Inc. All Rights Reserved. + * + */ + #ifndef __ASM_ARCH_MC9SDZ60_H #define __ASM_ARCH_MC9SDZ60_H -extern struct i2c_client *mc9sdz60_get_client(void); +enum mc9sdz60_reg { + MC9SDZ60_REG_VERSION = 0x00, + MC9SDZ60_REG_SECS = 0x01, + MC9SDZ60_REG_MINS = 0x02, + MC9SDZ60_REG_HRS = 0x03, + MC9SDZ60_REG_DAY = 0x04, + MC9SDZ60_REG_DATE = 0x05, + MC9SDZ60_REG_MONTH = 0x06, + MC9SDZ60_REG_YEAR = 0x07, + MC9SDZ60_REG_ALARM_SECS = 0x08, + MC9SDZ60_REG_ALARM_MINS = 0x09, + MC9SDZ60_REG_ALARM_HRS = 0x0a, + MC9SDZ60_REG_TS_CONTROL = 0x0b, + MC9SDZ60_REG_X_LOW = 0x0c, + MC9SDZ60_REG_Y_LOW = 0x0d, + MC9SDZ60_REG_XY_HIGH = 0x0e, + MC9SDZ60_REG_X_LEFT_LOW = 0x0f, + MC9SDZ60_REG_X_LEFT_HIGH = 0x10, + MC9SDZ60_REG_X_RIGHT = 0x11, + MC9SDZ60_REG_Y_TOP_LOW = 0x12, + MC9SDZ60_REG_Y_TOP_HIGH = 0x13, + MC9SDZ60_REG_Y_BOTTOM = 0x14, + MC9SDZ60_REG_RESET_1 = 0x15, + MC9SDZ60_REG_RESET_2 = 0x16, + MC9SDZ60_REG_POWER_CTL = 0x17, + MC9SDZ60_REG_DELAY_CONFIG = 0x18, + MC9SDZ60_REG_GPIO_1 = 0x19, + MC9SDZ60_REG_GPIO_2 = 0x1a, + MC9SDZ60_REG_KPD_1 = 0x1b, + MC9SDZ60_REG_KPD_2 = 0x1c, + MC9SDZ60_REG_KPD_CONTROL = 0x1d, + MC9SDZ60_REG_INT_ENABLE_1 = 0x1e, + MC9SDZ60_REG_INT_ENABLE_2 = 0x1f, + MC9SDZ60_REG_INT_FLAG_1 = 0x20, + MC9SDZ60_REG_INT_FLAG_2 = 0x21, + MC9SDZ60_REG_DES_FLAG = 0x22, +}; -#endif /* __ASM_ARCH_MC9SDZ60_H */ +struct mc9sdz60 { + struct cdev cdev; + struct i2c_client *client; +}; + +extern struct mc9sdz60 *mc9sdz60_get(void); +extern int mc9sdz60_reg_read(struct mc9sdz60 *priv, enum mc9sdz60_reg reg, u8 *val); +extern int mc9sdz60_reg_write(struct mc9sdz60 *priv, enum mc9sdz60_reg reg, u8 val); +extern int mc9sdz60_set_bits(struct mc9sdz60 *priv, enum mc9sdz60_reg reg, u8 mask, u8 val); + +#endif /* __ASM_ARCH_MC9SDZ60_H */ -- cgit v1.2.3 From 23f4449b78851d8a21ca42ecec57f48982f9d0e3 Mon Sep 17 00:00:00 2001 From: Marc Kleine-Budde Date: Wed, 9 Dec 2009 02:05:07 +0100 Subject: mc13892: clean up driver interface Export mc13892_reg_read, mc13892_reg_write and mc13892_set_bits function instead of exposing the i2c interface. Signed-off-by: Marc Kleine-Budde --- drivers/i2c/mc13892.c | 91 ++++++++++++++++++++++++++++++++++++++++----------- include/i2c/mc13892.h | 90 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 160 insertions(+), 21 deletions(-) (limited to 'include') diff --git a/drivers/i2c/mc13892.c b/drivers/i2c/mc13892.c index 54661d4f5e..67d4232a23 100644 --- a/drivers/i2c/mc13892.c +++ b/drivers/i2c/mc13892.c @@ -26,47 +26,99 @@ #include #include - -#include +#include #define DRIVERNAME "mc13892" -struct mc_priv { - struct cdev cdev; - struct i2c_client *client; -}; - -#define to_mc_priv(a) container_of(a, struct mc_priv, cdev) +#define to_mc13892(a) container_of(a, struct mc13892, cdev) -static struct mc_priv *mc_dev; +static struct mc13892 *mc_dev; -struct i2c_client *mc13892_get_client(void) +struct mc13892 *mc13892_get(void) { if (!mc_dev) return NULL; - return mc_dev->client; + return mc_dev; +} +EXPORT_SYMBOL(mc13892_get); + +int mc13892_reg_read(struct mc13892 *mc13892, enum mc13892_reg reg, u32 *val) +{ + u8 buf[3]; + int ret; + + ret = i2c_read_reg(mc13892->client, reg, buf, 3); + *val = buf[0] << 16 | buf[1] << 8 | buf[2] << 0; + + return ret == 3 ? 0 : ret; } +EXPORT_SYMBOL(mc13892_reg_read) -static u32 mc_read_reg(struct mc_priv *mc, int reg) +int mc13892_reg_write(struct mc13892 *mc13892, enum mc13892_reg reg, u32 val) { - u32 buf; + u8 buf[] = { + val >> 16, + val >> 8, + val >> 0, + }; + int ret; + + ret = i2c_write_reg(mc13892->client, reg, buf, 3); + + return ret == 3 ? 0 : ret; +} +EXPORT_SYMBOL(mc13892_reg_write) + +int mc13892_set_bits(struct mc13892 *mc13892, enum mc13892_reg reg, u32 mask, u32 val) +{ + u32 tmp; + int err; + + err = mc13892_reg_read(mc13892, reg, &tmp); + tmp = (tmp & ~mask) | val; - i2c_read_reg(mc->client, reg, (u8 *)&buf, sizeof(buf)); + if (!err) + err = mc13892_reg_write(mc13892, reg, tmp); - return buf; + return err; } +EXPORT_SYMBOL(mc13892_set_bits); static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) { - struct mc_priv *priv = to_mc_priv(cdev); - int i = count >> 2; + struct mc13892 *priv = to_mc13892(cdev); u32 *buf = _buf; + size_t i = count >> 2; + int err; + + offset >>= 2; + + while (i) { + err = mc13892_reg_read(priv, offset, buf); + if (err) + return (ssize_t)err; + buf++; + i--; + offset++; + } + + return count; +} + +static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags) +{ + struct mc13892 *mc13892 = to_mc13892(cdev); + const u32 *buf = _buf; + size_t i = count >> 2; + int err; offset >>= 2; while (i) { - *buf = mc_read_reg(priv, offset); + err = mc13892_reg_write(mc13892, offset, *buf); + if (err) + return (ssize_t)err; buf++; i--; offset++; @@ -78,6 +130,7 @@ static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset static struct file_operations mc_fops = { .lseek = dev_lseek_default, .read = mc_read, + .write = mc_write, }; static int mc_probe(struct device_d *dev) @@ -85,7 +138,7 @@ static int mc_probe(struct device_d *dev) if (mc_dev) return -EBUSY; - mc_dev = xzalloc(sizeof(struct mc_priv)); + mc_dev = xzalloc(sizeof(struct mc13892)); mc_dev->cdev.name = DRIVERNAME; mc_dev->client = to_i2c_client(dev); mc_dev->cdev.size = 256; diff --git a/include/i2c/mc13892.h b/include/i2c/mc13892.h index 2f44f6c853..112d05ba69 100644 --- a/include/i2c/mc13892.h +++ b/include/i2c/mc13892.h @@ -1,7 +1,93 @@ +/* + * Copyright (C) 2009 Marc Kleine-Budde + * + * This file is released under the GPLv2 + * + * Derived from: + * - arch-mxc/pmic_external.h -- contains interface of the PMIC protocol driver + * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved. + * + */ + #ifndef __ASM_ARCH_MC13892_H #define __ASM_ARCH_MC13892_H -extern struct i2c_client *mc13892_get_client(void); +enum mc13892_reg { + MC13892_REG_INT_STATUS0 = 0x00, + MC13892_REG_INT_MASK0 = 0x01, + MC13892_REG_INT_SENSE0 = 0x02, + MC13892_REG_INT_STATUS1 = 0x03, + MC13892_REG_INT_MASK1 = 0x04, + MC13892_REG_INT_SENSE1 = 0x05, + MC13892_REG_PU_MODE_S = 0x06, + MC13892_REG_IDENTIFICATION = 0x07, + MC13892_REG_UNUSED0 = 0x08, + MC13892_REG_ACC0 = 0x09, + MC13892_REG_ACC1 = 0x0a, + MC13892_REG_UNUSED1 = 0x0b, + MC13892_REG_UNUSED2 = 0x0c, + MC13892_REG_POWER_CTL0 = 0x0d, + MC13892_REG_POWER_CTL1 = 0x0e, + MC13892_REG_POWER_CTL2 = 0x0f, + MC13892_REG_REGEN_ASSIGN = 0x10, + MC13892_REG_UNUSED3 = 0x11, + MC13892_REG_MEM_A = 0x12, + MC13892_REG_MEM_B = 0x13, + MC13892_REG_RTC_TIME = 0x14, + MC13892_REG_RTC_ALARM = 0x15, + MC13892_REG_RTC_DAY = 0x16, + MC13892_REG_RTC_DAY_ALARM = 0x17, + MC13892_REG_SW_0 = 0x18, + MC13892_REG_SW_1 = 0x19, + MC13892_REG_SW_2 = 0x1a, + MC13892_REG_SW_3 = 0x1b, + MC13892_REG_SW_4 = 0x1c, + MC13892_REG_SW_5 = 0x1d, + MC13892_REG_SETTING_0 = 0x1e, + MC13892_REG_SETTING_1 = 0x1f, + MC13892_REG_MODE_0 = 0x20, + MC13892_REG_MODE_1 = 0x21, + MC13892_REG_POWER_MISC = 0x22, + MC13892_REG_UNUSED4 = 0x23, + MC13892_REG_UNUSED5 = 0x24, + MC13892_REG_UNUSED6 = 0x25, + MC13892_REG_UNUSED7 = 0x26, + MC13892_REG_UNUSED8 = 0x27, + MC13892_REG_UNUSED9 = 0x28, + MC13892_REG_UNUSED10 = 0x29, + MC13892_REG_UNUSED11 = 0x2a, + MC13892_REG_ADC0 = 0x2b, + MC13892_REG_ADC1 = 0x2c, + MC13892_REG_ADC2 = 0x2d, + MC13892_REG_ADC3 = 0x2e, + MC13892_REG_ADC4 = 0x2f, + MC13892_REG_CHARGE = 0x30, + MC13892_REG_USB0 = 0x31, + MC13892_REG_USB1 = 0x32, + MC13892_REG_LED_CTL0 = 0x33, + MC13892_REG_LED_CTL1 = 0x34, + MC13892_REG_LED_CTL2 = 0x35, + MC13892_REG_LED_CTL3 = 0x36, + MC13892_REG_UNUSED12 = 0x37, + MC13892_REG_UNUSED13 = 0x38, + MC13892_REG_TRIM0 = 0x39, + MC13892_REG_TRIM1 = 0x3a, + MC13892_REG_TEST0 = 0x3b, + MC13892_REG_TEST1 = 0x3c, + MC13892_REG_TEST2 = 0x3d, + MC13892_REG_TEST3 = 0x3e, + MC13892_REG_TEST4 = 0x3f, +}; -#endif /* __ASM_ARCH_MC13892_H */ +struct mc13892 { + struct cdev cdev; + struct i2c_client *client; +}; + +extern struct mc13892 *mc13892_get(void); +extern int mc13892_reg_read(struct mc13892 *mc13892, enum mc13892_reg reg, u32 *val); +extern int mc13892_reg_write(struct mc13892 *mc13892, enum mc13892_reg reg, u32 val); +extern int mc13892_set_bits(struct mc13892 *mc13892, enum mc13892_reg reg, u32 mask, u32 val); + +#endif /* __ASM_ARCH_MC13892_H */ -- cgit v1.2.3