Hi,

Please review and acknowledge this patch.

Regards
Priyanka

> -----Original Message-----
> From: Jain Priyanka-B32167
> Sent: Monday, November 22, 2010 9:24 AM
> To: 'Alessandro Zummo'
> Cc: 'rtc-li...@googlegroups.com'
> Subject: FW: [PATCH][v1] RTC driver(Linux) for PT7C4338 chip.
> 
> Hi,
> 
> Please review and acknowledge this patch.
> 
> Thanks and Regards
> Priyanka
> 
> 
> 
> -----Original Message-----
> From: Jain Priyanka-B32167
> Sent: Thursday, November 11, 2010 9:36 AM
> To: Jain Priyanka-B32167; rtc-li...@googlegroups.com; linuxppc-
> d...@lists.ozlabs.org
> Subject: RE: [PATCH][v1] RTC driver(Linux) for PT7C4338 chip.
> 
> Hi,
> 
> I am waiting for review comments and acknowledgement that this patch will
> be pick up for open source.
> Please acknowledge.
> 
> Regards
> Priyanka Jain
> 
> -----Original Message-----
> From: Jain Priyanka-B32167
> Sent: Tuesday, October 26, 2010 3:12 PM
> To: rtc-li...@googlegroups.com; linuxppc-dev@lists.ozlabs.org
> Cc: Jain Priyanka-B32167
> Subject: [PATCH][v1] RTC driver(Linux) for PT7C4338 chip.
> 
> PT7C4338 chip is being manufactured by Pericom Technology Inc.
> It is a serial real-time clock which provides:
> 1)Low-power clock/calendar.
> 2)Programmable square-wave output.
> It has 56 bytes of nonvolatile RAM.
> 
> Signed-off-by: Priyanka Jain <priyanka.j...@freescale.com>
> ---
>  PT7C4338 RTC driver is verified on Freescale P1010RDB.
> Changes for v1:
>       Incoperated Kumar Gala's review comments
>       -Removing board name from commit messages.
> 
>  drivers/rtc/Kconfig        |    9 ++
>  drivers/rtc/Makefile       |    1 +
>  drivers/rtc/rtc-pt7c4338.c |  215
> ++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 225 insertions(+), 0 deletions(-)  create mode 100644
> drivers/rtc/rtc-pt7c4338.c
> 
> diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index
> 10ba12c..6ff0901 100644
> --- a/drivers/rtc/Kconfig
> +++ b/drivers/rtc/Kconfig
> @@ -324,6 +324,15 @@ config RTC_DRV_RX8025
>         This driver can also be built as a module. If so, the module
>         will be called rtc-rx8025.
> 
> +config RTC_DRV_PT7C4338
> +     tristate "Pericom Technology Inc. PT7C4338 RTC"
> +     help
> +       If you say yes here you get support for the Pericom Technology
> +       Inc. PT7C4338 RTC chip.
> +
> +       This driver can also be built as a module. If so, the module
> +       will be called rtc-pt7c4338.
> +
>  endif # I2C
> 
>  comment "SPI RTC drivers"
> diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index
> 5adbba7..4014607 100644
> --- a/drivers/rtc/Makefile
> +++ b/drivers/rtc/Makefile
> @@ -70,6 +70,7 @@ obj-$(CONFIG_RTC_DRV_PCF50633)      += rtc-pcf50633.o
>  obj-$(CONFIG_RTC_DRV_PL030)  += rtc-pl030.o
>  obj-$(CONFIG_RTC_DRV_PL031)  += rtc-pl031.o
>  obj-$(CONFIG_RTC_DRV_PS3)    += rtc-ps3.o
> +obj-$(CONFIG_RTC_DRV_PT7C4338)       += rtc-pt7c4338.o
>  obj-$(CONFIG_RTC_DRV_PXA)    += rtc-pxa.o
>  obj-$(CONFIG_RTC_DRV_R9701)  += rtc-r9701.o
>  obj-$(CONFIG_RTC_DRV_RP5C01) += rtc-rp5c01.o
> diff --git a/drivers/rtc/rtc-pt7c4338.c b/drivers/rtc/rtc-pt7c4338.c new
> file mode 100644 index 0000000..fca52cd
> --- /dev/null
> +++ b/drivers/rtc/rtc-pt7c4338.c
> @@ -0,0 +1,215 @@
> +/*
> + * Copyright 2010 Freescale Semiconductor, Inc.
> + *
> + * Author:   Priyanka Jain <priyanka.j...@freescale.com>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * 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
> + */
> +
> +/*
> + * This file provides Date & Time support (no alarms) for PT7C4338 chip.
> + *
> + * This file is based on drivers/rtc/rtc-ds1307.c
> + *
> + * PT7C4338 chip is manufactured by Pericom Technology Inc.
> + * It is a serial real-time clock which provides
> + * 1)Low-power clock/calendar.
> + * 2)Programmable square-wave output.
> + * It has 56 bytes of nonvolatile RAM.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/i2c.h>
> +#include <linux/rtc.h>
> +#include <linux/bcd.h>
> +
> +/* RTC register addresses */
> +#define PT7C4338_REG_SECONDS          0x00
> +#define PT7C4338_REG_MINUTES          0x01
> +#define PT7C4338_REG_HOURS            0x02
> +#define PT7C4338_REG_AMPM             0x02
> +#define PT7C4338_REG_DAY              0x03
> +#define PT7C4338_REG_DATE             0x04
> +#define PT7C4338_REG_MONTH            0x05
> +#define PT7C4338_REG_YEAR             0x06
> +#define PT7C4338_REG_CTRL_STAT        0x07
> +
> +/* RTC second register address bit */
> +#define PT7C4338_SEC_BIT_CH           0x80   /*Clock Halt (in Register
> 0)*/
> +
> +/* RTC control and status register bits */
> +#define PT7C4338_CTRL_STAT_BIT_RS0    0x1    /*Rate select 0*/
> +#define PT7C4338_CTRL_STAT_BIT_RS1    0x2    /*Rate select 1*/
> +#define PT7C4338_CTRL_STAT_BIT_SQWE   0x10   /*Square Wave Enable*/
> +#define PT7C4338_CTRL_STAT_BIT_OSF    0x20   /*Oscillator Stop Flag*/
> +#define PT7C4338_CTRL_STAT_BIT_OUT    0x80   /*Output Level Control*/
> +
> +static const struct i2c_device_id pt7c4338_id[] = {
> +     { "pt7c4338", 0 },
> +     { }
> +};
> +MODULE_DEVICE_TABLE(i2c, pt7c4338_id);
> +
> +struct pt7c4338{
> +     struct i2c_client *client;
> +     struct rtc_device *rtc;
> +};
> +
> +static int pt7c4338_read_time(struct device *dev, struct rtc_time
> +*time) {
> +     struct i2c_client *client = to_i2c_client(dev);
> +     int ret;
> +     u8 buf[7];
> +     u8 year, month, day, hour, minute, second;
> +     u8 week, twelve_hr, am_pm;
> +
> +     ret = i2c_smbus_read_i2c_block_data(client,
> +                     PT7C4338_REG_SECONDS, 7, buf);
> +     if (ret < 0)
> +             return ret;
> +     if (ret < 7)
> +             return -EIO;
> +
> +     second = buf[0];
> +     minute = buf[1];
> +     hour = buf[2];
> +     week = buf[3];
> +     day = buf[4];
> +     month = buf[5];
> +     year = buf[6];
> +
> +     /* Extract additional information for AM/PM */
> +     twelve_hr = hour & 0x40;
> +     am_pm = hour & 0x20;
> +
> +     /* Write to rtc_time structure */
> +     time->tm_sec = bcd2bin(second & 0x7f);
> +     time->tm_min = bcd2bin(minute & 0x7f);
> +     if (twelve_hr) {
> +             /* Convert to 24 hr */
> +             if (am_pm)
> +                     time->tm_hour = bcd2bin(hour & 0x10) + 12;
> +             else
> +                     time->tm_hour = bcd2bin(hour & 0xBF);
> +     } else {
> +             time->tm_hour = bcd2bin(hour);
> +     }
> +
> +     time->tm_wday = bcd2bin(week & 0x07) - 1;
> +     time->tm_mday = bcd2bin(day & 0x3f);
> +     time->tm_mon = bcd2bin(month & 0x1F) - 1;
> +     /* assume 20YY not 19YY */
> +     time->tm_year = bcd2bin(year) + 100;
> +
> +     return 0;
> +}
> +
> +static int pt7c4338_set_time(struct device *dev, struct rtc_time *time)
> +{
> +     struct i2c_client *client = to_i2c_client(dev);
> +     u8 buf[7];
> +
> +     /* Extract time from rtc_time and load into pt7c4338*/
> +     buf[0] = bin2bcd(time->tm_sec);
> +     buf[1] = bin2bcd(time->tm_min);
> +     buf[2] = bin2bcd(time->tm_hour);
> +     buf[3] = bin2bcd(time->tm_wday + 1); /* Day of the week */
> +     buf[4] = bin2bcd(time->tm_mday); /* Date */
> +     buf[5] = bin2bcd(time->tm_mon + 1);
> +
> +     /* assume 20YY not 19YY */
> +     if (time->tm_year >= 100)
> +             buf[6] = bin2bcd(time->tm_year - 100);
> +     else
> +             buf[6] = bin2bcd(time->tm_year);
> +
> +     return i2c_smbus_write_i2c_block_data(client,
> +                                     PT7C4338_REG_SECONDS, 7, buf);
> +}
> +
> +static const struct rtc_class_ops pt7c4338_rtc_ops = {
> +     .read_time = pt7c4338_read_time,
> +     .set_time = pt7c4338_set_time,
> +};
> +
> +static int pt7c4338_probe(struct i2c_client *client,
> +             const struct i2c_device_id *id)
> +{
> +     struct pt7c4338 *pt7c4338;
> +     struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
> +     int ret;
> +
> +     pt7c4338 = kzalloc(sizeof(struct pt7c4338), GFP_KERNEL);
> +     if (!pt7c4338)
> +             return -ENOMEM;
> +
> +     pt7c4338->client = client;
> +     i2c_set_clientdata(client, pt7c4338);
> +     pt7c4338->rtc = rtc_device_register(client->name, &client->dev,
> +                                     &pt7c4338_rtc_ops, THIS_MODULE);
> +     if (IS_ERR(pt7c4338->rtc)) {
> +             ret = PTR_ERR(pt7c4338->rtc);
> +             dev_err(&client->dev, "unable to register the class
> device\n");
> +             goto out_free;
> +     }
> +
> +     return 0;
> +out_free:
> +     i2c_set_clientdata(client, NULL);
> +     kfree(pt7c4338);
> +     return ret;
> +}
> +
> +static int __devexit pt7c4338_remove(struct i2c_client *client) {
> +     struct pt7c4338 *pt7c4338 = i2c_get_clientdata(client);
> +
> +     rtc_device_unregister(pt7c4338->rtc);
> +     i2c_set_clientdata(client, NULL);
> +     kfree(pt7c4338);
> +     return 0;
> +}
> +
> +static struct i2c_driver pt7c4338_driver = {
> +     .driver = {
> +             .name = "rtc-pt7c4338",
> +             .owner = THIS_MODULE,
> +     },
> +     .probe = pt7c4338_probe,
> +     .remove = __devexit_p(pt7c4338_remove),
> +     .id_table = pt7c4338_id,
> +};
> +
> +static int __init pt7c4338_init(void)
> +{
> +     return i2c_add_driver(&pt7c4338_driver); }
> +
> +static void __exit pt7c4338_exit(void)
> +{
> +     i2c_del_driver(&pt7c4338_driver);
> +}
> +
> +module_init(pt7c4338_init);
> +module_exit(pt7c4338_exit);
> +
> +MODULE_AUTHOR("Priyanka Jain <priyanka.j...@freescale.com>");
> +MODULE_DESCRIPTION("pericom Technology Inc. PT7C4338 RTC Driver");
> +MODULE_LICENSE("GPL");
> --
> 1.6.5.6


_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to