linux/drivers/rtc/rtc-ds1672.c
<<
n va8.1/spa v 8.1/form v 8.1a n va8. href="../linux+v3.8611/drivers/rtc/rtc-ds1672.c">n va8.1img src="../.static/gfx/right.png" alt=">>">n 1/spa vn 1spa class="lxr_search">n va ="+search" method="post" onsubmit="return do_search(this);">n va8.1input typ hidden" nam navtarget" on> ">n va8.1input typ text" nam search" id search">n va8.1buttptityp submit">Searchn va8.Prefsv 8.1/a>n 1/spa vva8. .1/div vva8. .1form ac > ="ajax+*" method="post" onsubmit="return false;">n 1input typ hidden" nam ajax_lookup" id ajax_lookup" on> ">nva8. .1/form vnva8. .1div class="headingbottpm">
v 1div id file_contents"
. .11/a>1spa  class="comment">/*1/spa  v. .21/a>1spa  class="comment"> * An rtc/i2c driver for the Dallas DS16721/spa  v. .31/a>1spa  class="comment"> * Copyright 2005-06 Tower Technologies1/spa  v. .41/a>1spa  class="comment"> *1/spa  v. .51/a>1spa  class="comment"> * Author: Alessandro Zummo <a.zummo@towertech.it>1/spa  v. .61/a>1spa  class="comment"> *1/spa  v. .71/a>1spa  class="comment"> * This program is free software; you ca  redistribute it and/or modify1/spa  v. .81/a>1spa  class="comment"> * it under the terms of the GNU General Public License versopti2 as1/spa  v. .91/a>1spa  class="comment"> * published by the Free Software Founda >
 .1/spa  v. 110"a>1spa  class="comment"> */1/spa  v. 111/a>v. 121/a>#include <linux/i2c.h1/a>>v. 131/a>#include <linux/rtc.h1/a>>v. 141/a>#include <linux/module.h1/a>>v. 151/a>v. 161/a>#define.1a href="+code=DRV_VERSION" class="sref">DRV_VERSION1/a> 1spa  class="string">"0.4"1/spa  v. 171/a>v. 181/a>1spa  class="comment">/* Registers */1/spa  v. 191/a>v. 201/a>#define.1a href="+code=DS1672_REG_CNT_BASE" class="sref">DS1672_REG_CNT_BASE1/a>     0v. 211/a>#define.1a href="+code=DS1672_REG_CONTROL" class="sref">DS1672_REG_CONTROL1/a>      4v. 221/a>#define.1a href="+code=DS1672_REG_TRICKLE" class="sref">DS1672_REG_TRICKLE1/a>      5v. 231/a>v. 241/a>#define.1a href="+code=DS1672_REG_CONTROL_EOSC" class="sref">DS1672_REG_CONTROL_EOSC1/a> 0x80v. 251/a>v. 261/a>static struct.1a href="+code=i2c_driver" class="sref">i2c_driver1/a> 1a href="+code=ds1672_driver" class="sref">ds1672_driver1/a>;v. 271/a>v. 281/a>1spa  class="comment">/*1/spa  v. 291/a>1spa  class="comment"> * In the routines that deal directly with the ds1672 hardware, we use1/spa  v. 310"a>1spa  class="comment"> * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch. 311/a>1spa  class="comment"> * Epoch is initialized as 2000. Time is set to UTC.1/spa  v. 321/a>1spa  class="comment"> */1/spa  v. 331/a>static int.1a href="+code=ds1672_get_da etime" class="sref">ds1672_get_da etime1/a>(struct.1a href="+code=i2c_client" class="sref">i2c_client1/a> *1a href="+code=client" class="sref">client1/a>, struct.1a href="+code=rtc_time" class="sref">rtc_time1/a> *1a href="+code=tm" class="sref">tm1/a>)v. 341/a>{v. 351/a>        unsigned long.1a href="+code=time" class="sref">time1/a>;v. 361/a>        unsigned char.1a href="+code=addr" class="sref">addr1/a> =.1a href="+code=DS1672_REG_CNT_BASE" class="sref">DS1672_REG_CNT_BASE1/a>;v. 371/a>        unsigned char.1a href="+code=buf" class="sref">buf1/a>[4];v. 381/a>v. 391/a>        struct.1a href="+code=i2c_msg" class="sref">i2c_msg1/a> 1a href="+code=msgs" class="sref">msgs1/a>[] =.{v. 401/a>                {1spa  class="comment">/* setup read ptr */1/spa  v. 411/a>                        .1a href="+code=addr" class="sref">addr1/a> =.1a href="+code=client" class="sref">client1/a>->1a href="+code=addr" class="sref">addr1/a>,v. 421/a>                        .1a href="+code=len" class="sref">len1/a> =.1,v. 431/a>                        .1a href="+code=buf" class="sref">buf1/a> =.&1a href="+code=addr" class="sref">addr1/a>v. 441/a>                },v. 451/a>                {1spa  class="comment">/* read da e */1/spa  v. 461/a>                        .1a href="+code=addr" class="sref">addr1/a> =.1a href="+code=client" class="sref">client1/a>->1a href="+code=addr" class="sref">addr1/a>,v. 471/a>                        .1a href="+code=flags" class="sref">flags1/a> =.1a href="+code=I2C_M_RD" class="sref">I2C_M_RD1/a>,v. 481/a>                        .1a href="+code=len" class="sref">len1/a> =.4,v. 491/a>                        .1a href="+code=buf" class="sref">buf1/a> =.1a href="+code=buf" class="sref">buf1/a>v. 501/a>                },v. 511/a>        };v. 521/a>v. 531/a>        1spa  class="comment">/* read da e registers */1/spa  v. 541/a>        if ((1a href="+code=i2c_transfer" class="sref">i2c_transfer1/a>(1a href="+code=client" class="sref">client1/a>->1a href="+code=adapter" class="sref">adapter1/a>, &1a href="+code=msgs" class="sref">msgs1/a>[0], 2)) != 2).{v. 551/a>                1a href="+code=dev_err" class="sref">dev_err1/a>(&1a href="+code=client" class="sref">client1/a>->1a href="+code=dev" class="sref">dev1/a>, 1spa  class="string">"%s: read error\n"1/spa  , 1a href="+code=__func__" class="sref">__func__1/a>);v. 561/a>                return -1a href="+code=EIO" class="sref">EIO1/a>;v. 571/a>        }v. 581/a>v. 591/a>        1a href="+code=dev_dbg" class="sref">dev_dbg1/a>(&1a href="+code=client" class="sref">client1/a>->1a href="+code=dev" class="sref">dev1/a>,v. 601/a>                1spa  class="string">"%s: raw read da a - counters=%02x,%02x,%02x,%02x\n"1/spa  ,v. 611/a>                1a href="+code=__func__" class="sref">__func__1/a>, 1a href="+code=buf" class="sref">buf1/a>[0], 1a href="+code=buf" class="sref">buf1/a>[1], 1a href="+code=buf" class="sref">buf1/a>[2], 1a href="+code=buf" class="sref">buf1/a>[3]);v. 621/a>v. 631/a>        1a href="+code=time" class="sref">time1/a> =.(1a href="+code=buf" class="sref">buf1/a>[3] << 24) |.(1a href="+code=buf" class="sref">buf1/a>[2] << 16) |.(1a href="+code=buf" class="sref">buf1/a>[1] << 8) |.1a href="+code=buf" class="sref">buf1/a>[0];v. 641/a>v. 651/a>        1a href="+code=rtc_time_to_tm" class="sref">rtc_time_to_tm1/a>(1a href="+code=time" class="sref">time1/a>, 1a href="+code=tm" class="sref">tm1/a>);v. 661/a>v. 671/a>        1a href="+code=dev_dbg" class="sref">dev_dbg1/a>(&1a href="+code=client" class="sref">client1/a>->1a href="+code=dev" class="sref">dev1/a>, 1spa  class="string">"%s: tm is secs=%d, mins=%d, hours=%d, "1/spa  v. 681/a>                1spa  class="string">"mday=%d, mon=%d, year=%d, wday=%d\n"1/spa  ,v. 691/a>                1a href="+code=__func__" class="sref">__func__1/a>, 1a href="+code=tm" class="sref">tm1/a>->1a href="+code=tm_sec" class="sref">tm_sec1/a>, 1a href="+code=tm" class="sref">tm1/a>->1a href="+code=tm_min" class="sref">tm_min1/a>, 1a href="+code=tm" class="sref">tm1/a>->1a href="+code=tm_hour" class="sref">tm_hour1/a>,v. 701/a>                1a href="+code=tm" class="sref">tm1/a>->1a href="+code=tm_mday" class="sref">tm_mday1/a>, 1a href="+code=tm" class="sref">tm1/a>->1a href="+code=tm_mon" class="sref">tm_mon1/a>, 1a href="+code=tm" class="sref">tm1/a>->1a href="+code=tm_year" class="sref">tm_year1/a>, 1a href="+code=tm" class="sref">tm1/a>->1a href="+code=tm_wday" class="sref">tm_wday1/a>);v. 711/a>v. 721/a>        return 0;v. 731/a>}v. 741/a>v. 751/a>static int.1a href="+code=ds1672_set_mmss" class="sref">ds1672_set_mmss1/a>(struct.1a href="+code=i2c_client" class="sref">i2c_client1/a> *1a href="+code=client" class="sref">client1/a>, unsigned long.1a href="+code=secs" class="sref">secs1/a>)v. 761/a>{v. 771/a>        int.1a href="+code=xfer" class="sref">xfer1/a>;v. 781/a>        unsigned char.1a href="+code=buf" class="sref">buf1/a>[6];v. 791/a>v. 801/a>        1a href="+code=buf" class="sref">buf1/a>[0] =.1a href="+code=DS1672_REG_CNT_BASE" class="sref">DS1672_REG_CNT_BASE1/a>;v. 811/a>        1a href="+code=buf" class="sref">buf1/a>[1] =.1a href="+code=secs" class="sref">secs1/a> & 0x000000FF;v. 821/a>        1a href="+code=buf" class="sref">buf1/a>[2] =.(1a href="+code=secs" class="sref">secs1/a> & 0x0000FF00) >> 8;v. 831/a>        1a href="+code=buf" class="sref">buf1/a>[3] =.(1a href="+code=secs" class="sref">secs1/a> & 0x00FF0000) >> 16;v. 841/a>        1a href="+code=buf" class="sref">buf1/a>[4] =.(1a href="+code=secs" class="sref">secs1/a> & 0xFF000000) >> 24;v. 851/a>        1a href="+code=buf" class="sref">buf1/a>[5] =.0;             1spa  class="comment">/* set control reg to enable counting */1/spa  v. 861/a>v. 871/a>        1a href="+code=xfer" class="sref">xfer1/a> =.1a href="+code=i2c_master_send" class="sref">i2c_master_send1/a>(1a href="+code=client" class="sref">client1/a>, 1a href="+code=buf" class="sref">buf1/a>, 6);v. 881/a>        if (1a href="+code=xfer" class="sref">xfer1/a> != 6).{v. 891/a>                1a href="+code=dev_err" class="sref">dev_err1/a>(&1a href="+code=client" class="sref">client1/a>->1a href="+code=dev" class="sref">dev1/a>, 1spa  class="string">"%s: send: %d\n"1/spa  , 1a href="+code=__func__" class="sref">__func__1/a>, 1a href="+code=xfer" class="sref">xfer1/a>);v. 901/a>                return -1a href="+code=EIO" class="sref">EIO1/a>;v. 911/a>        }v. 921/a>v. 931/a>        return 0;v. 941/a>}v. 951/a>v. 961/a>static int.1a href="+code=ds1672_rtc_read_time" class="sref">ds1672_rtc_read_time1/a>(struct.1a href="+code=device" class="sref">device1/a> *1a href="+code=dev" class="sref">dev1/a>, struct.1a href="+code=rtc_time" class="sref">rtc_time1/a> *1a href="+code=tm" class="sref">tm1/a>)v. 971/a>{v. 981/a>        return 1a href="+code=ds1672_get_da etime" class="sref">ds1672_get_da etime1/a>(1a href="+code=to_i2c_client" class="sref">to_i2c_client1/a>(1a href="+code=dev" class="sref">dev1/a>), 1a href="+code=tm" class="sref">tm1/a>);v. 991/a>}v.1001/a>v.1011/a>static int.1a href="+code=ds1672_rtc_set_mmss" class="sref">ds1672_rtc_set_mmss1/a>(struct.1a href="+code=device" class="sref">device1/a> *1a href="+code=dev" class="sref">dev1/a>, unsigned long.1a href="+code=secs" class="sref">secs1/a>)v.1021/a>{v.1031/a>        return 1a href="+code=ds1672_set_mmss" class="sref">ds1672_set_mmss1/a>(1a href="+code=to_i2c_client" class="sref">to_i2c_client1/a>(1a href="+code=dev" class="sref">dev1/a>), 1a href="+code=secs" class="sref">secs1/a>);v.1041/a>}v.1051/a>v.1061/a>static int.1a href="+code=ds1672_get_control" class="sref">ds1672_get_control1/a>(struct.1a href="+code=i2c_client" class="sref">i2c_client1/a> *1a href="+code=client" class="sref">client1/a>, 1a href="+code=u8" class="sref">u81/a> *1a href="+code=status" class="sref">status1/a>)v.1071/a>{v.1081/a>        unsigned char.1a href="+code=addr" class="sref">addr1/a> =.1a href="+code=DS1672_REG_CONTROL" class="sref">DS1672_REG_CONTROL1/a>;v.1091/a>v.1101/a>        struct.1a href="+code=i2c_msg" class="sref">i2c_msg1/a> 1a href="+code=msgs" class="sref">msgs1/a>[] =.{v.1111/a>                {1spa  class="comment">/* setup read ptr */1/spa  v.1121/a>                        .1a href="+code=addr" class="sref">addr1/a> =.1a href="+code=client" class="sref">client1/a>->1a href="+code=addr" class="sref">addr1/a>,v.1131/a>                        .1a href="+code=len" class="sref">len1/a> =.1,v.1141/a>                        .1a href="+code=buf" class="sref">buf1/a> =.&1a href="+code=addr" class="sref">addr1/a>v.1151/a>                },v.1161/a>                {1spa  class="comment">/* read control */1/spa  v.1171/a>                        .1a href="+code=addr" class="sref">addr1/a> =.1a href="+code=client" class="sref">client1/a>->1a href="+code=addr" class="sref">addr1/a>,v.1181/a>                        .1a href="+code=flags" class="sref">flags1/a> =.1a href="+code=I2C_M_RD" class="sref">I2C_M_RD1/a>,v.1191/a>                        .1a href="+code=len" class="sref">len1/a> =.1,v.1201/a>                        .1a href="+code=buf" class="sref">buf1/a> =.1a href="+code=status" class="sref">status1/a>v.1211/a>                },v.1221/a>        };v.1231/a>v.1241/a>        1spa  class="comment">/* read control register */1/spa  v.1251/a>        if ((1a href="+code=i2c_transfer" class="sref">i2c_transfer1/a>(1a href="+code=client" class="sref">client1/a>->1a href="+code=adapter" class="sref">adapter1/a>, &1a href="+code=msgs" class="sref">msgs1/a>[0], 2)) != 2).{v.1261/a>                1a href="+code=dev_err" class="sref">dev_err1/a>(&1a href="+code=client" class="sref">client1/a>->1a href="+code=dev" class="sref">dev1/a>, 1spa  class="string">"%s: read error\n"1/spa  , 1a href="+code=__func__" class="sref">__func__1/a>);v.1271/a>                return -1a href="+code=EIO" class="sref">EIO1/a>;v.1281/a>        }v.1291/a>v.1301/a>        return 0;v.1311/a>}v.1321/a>v.1331/a>1spa  class="comment">/* following are the sysfs callback func >
 s */1/spa  v.1341/a>static 1a href="+code=ssize_t" class="sref">ssize_t1/a> 1a href="+code=show_control" class="sref">show_control1/a>(struct.1a href="+code=device" class="sref">device1/a> *1a href="+code=dev" class="sref">dev1/a>, struct.1a href="+code=device_attribute" class="sref">device_attribute1/a> *1a href="+code=attr" class="sref">attr1/a>,v.1351/a>                            char.*1a href="+code=buf" class="sref">buf1/a>)v.1361/a>{v.1371/a>        struct.1a href="+code=i2c_client" class="sref">i2c_client1/a> *1a href="+code=client" class="sref">client1/a> =.1a href="+code=to_i2c_client" class="sref">to_i2c_client1/a>(1a href="+code=dev" class="sref">dev1/a>);v.1381/a>        1a href="+code=u8" class="sref">u81/a> 1a href="+code=control" class="sref">control1/a>;v.1391/a>        int.1a href="+code=err" class="sref">err1/a>;v.1401/a>v.1411/a>        1a href="+code=err" class="sref">err1/a> =.1a href="+code=ds1672_get_control" class="sref">ds1672_get_control1/a>(1a href="+code=client" class="sref">client1/a>, &1a href="+code=control" class="sref">control1/a>);v.1421/a>        if (1a href="+code=err" class="sref">err1/a>)v.1431/a>                return 1a href="+code=err" class="sref">err1/a>;v.1441/a>v.1451/a>        return 1a href="+code=sprintf" class="sref">sprintf1/a>(1a href="+code=buf" class="sref">buf1/a>, 1spa  class="string">"%s\n"1/spa  , (1a href="+code=control" class="sref">control1/a> & 1a href="+code=DS1672_REG_CONTROL_EOSC" class="sref">DS1672_REG_CONTROL_EOSC1/a>)v.1461/a>                       ? 1spa  class="string">"disabled"1/spa   : 1spa  class="string">"enabled"1/spa  );v.1471/a>}v.1481/a>v.1491/a>static 1a href="+code=DEVICE_ATTR" class="sref">DEVICE_ATTR1/a>(1a href="+code=control" class="sref">control1/a>, 1a href="+code=S_IRUGO" class="sref">S_IRUGO1/a>, 1a href="+code=show_control" class="sref">show_control1/a>, 1a href="+code=NULL" class="sref">NULL1/a>);v.1501/a>v.1511/a>static const struct.1a href="+code=rtc_class_ops" class="sref">rtc_class_ops1/a> 1a href="+code=ds1672_rtc_ops" class="sref">ds1672_rtc_ops1/a> =.{v.1521/a>        .1a href="+code=read_time" class="sref">read_time1/a> =.1a href="+code=ds1672_rtc_read_time" class="sref">ds1672_rtc_read_time1/a>,v.1531/a>        .1a href="+code=set_mmss" class="sref">set_mmss1/a> =.1a href="+code=ds1672_rtc_set_mmss" class="sref">ds1672_rtc_set_mmss1/a>,v.1541/a>};v.1551/a>v.1561/a>static int.1a href="+code=ds1672_remove" class="sref">ds1672_remove1/a>(struct.1a href="+code=i2c_client" class="sref">i2c_client1/a> *1a href="+code=client" class="sref">client1/a>)v.1571/a>{v.1581/a>        struct.1a href="+code=rtc_device" class="sref">rtc_device1/a> *1a href="+code=rtc" class="sref">rtc1/a> =.1a href="+code=i2c_get_clientda a" class="sref">i2c_get_clientda a1/a>(1a href="+code=client" class="sref">client1/a>);v.1591/a>v.1601/a>        if (1a href="+code=rtc" class="sref">rtc1/a>)v.1611/a>                1a href="+code=rtc_device_unregister" class="sref">rtc_device_unregister1/a>(1a href="+code=rtc" class="sref">rtc1/a>);v.1621/a>v.1631/a>        return 0;v.1641/a>}v.1651/a>v.1661/a>static int.1a href="+code=ds1672_probe" class="sref">ds1672_probe1/a>(struct.1a href="+code=i2c_client" class="sref">i2c_client1/a> *1a href="+code=client" class="sref">client1/a>,v.1671/a>                        const struct.1a href="+code=i2c_device_id" class="sref">i2c_device_id1/a> *1a href="+code=id" class="sref">id1/a>)v.1681/a>{v.1691/a>        int.1a href="+code=err" class="sref">err1/a> =.0;v.1701/a>        1a href="+code=u8" class="sref">u81/a> 1a href="+code=control" class="sref">control1/a>;v.1711/a>        struct.1a href="+code=rtc_device" class="sref">rtc_device1/a> *1a href="+code=rtc" class="sref">rtc1/a>;v.1721/a>v.1731/a>        1a href="+code=dev_dbg" class="sref">dev_dbg1/a>(&1a href="+code=client" class="sref">client1/a>->1a href="+code=dev" class="sref">dev1/a>, 1spa  class="string">"%s\n"1/spa  , 1a href="+code=__func__" class="sref">__func__1/a>);v.1741/a>v.1751/a>        if (!1a href="+code=i2c_check_func >
 ality" class="sref">i2c_check_func >
 ality1/a>(1a href="+code=client" class="sref">client1/a>->1a href="+code=adapter" class="sref">adapter1/a>, 1a href="+code=I2C_FUNC_I2C" class="sref">I2C_FUNC_I2C1/a>))v.1761/a>                return -1a href="+code=ENODEV" class="sref">ENODEV1/a>;v.1771/a>v.1781/a>        1a href="+code=dev_info" class="sref">dev_info1/a>(&1a href="+code=client" class="sref">client1/a>->1a href="+code=dev" class="sref">dev1/a>, 1spa  class="string">"chip found, driver versopti"1/spa   1a href="+code=DRV_VERSION" class="sref">DRV_VERSION1/a> 1spa  class="string">"\n"1/spa  );v.1791/a>v.1801/a>        1a href="+code=rtc" class="sref">rtc1/a> =.1a href="+code=rtc_device_register" class="sref">rtc_device_register1/a>(1a href="+code=ds1672_driver" class="sref">ds1672_driver1/a>.1a href="+code=driver" class="sref">driver1/a>.1a href="+code=nam " class="sref">nam 1/a>, &1a href="+code=client" class="sref">client1/a>->1a href="+code=dev" class="sref">dev1/a>,v.1811/a>                                  &1a href="+code=ds1672_rtc_ops" class="sref">ds1672_rtc_ops1/a>, 1a href="+code=THIS_MODULE" class="sref">THIS_MODULE1/a>);v.1821/a>v.1831/a>        if (1a href="+code=IS_ERR" class="sref">IS_ERR1/a>(1a href="+code=rtc" class="sref">rtc1/a>))v.1841/a>                return 1a href="+code=PTR_ERR" class="sref">PTR_ERR1/a>(1a href="+code=rtc" class="sref">rtc1/a>);v.1851/a>v.1861/a>        1a href="+code=i2c_set_clientda a" class="sref">i2c_set_clientda a1/a>(1a href="+code=client" class="sref">client1/a>, 1a href="+code=rtc" class="sref">rtc1/a>);v.1871/a>v.1881/a>        1spa  class="comment">/* read control register */1/spa  v.1891/a>        1a href="+code=err" class="sref">err1/a> =.1a href="+code=ds1672_get_control" class="sref">ds1672_get_control1/a>(1a href="+code=client" class="sref">client1/a>, &1a href="+code=control" class="sref">control1/a>);v.1901/a>        if (1a href="+code=err" class="sref">err1/a>)v.1911/a>                goto 1a href="+code=exit_devreg" class="sref">exit_devreg1/a>;v.1921/a>v.1931/a>        if (1a href="+code=control" class="sref">control1/a> & 1a href="+code=DS1672_REG_CONTROL_EOSC" class="sref">DS1672_REG_CONTROL_EOSC1/a>)v.1941/a>                1a href="+code=dev_warn" class="sref">dev_warn1/a>(&1a href="+code=client" class="sref">client1/a>->1a href="+code=dev" class="sref">dev1/a>, 1spa  class="string">"Oscillator not enabled. "1/spa  v.1951/a>                         1spa  class="string">"Set time to enable.\n"1/spa  );v.1961/a>v.1971/a>        1spa  class="comment">/* Register sysfs hooks */1/spa  v.1981/a>        1a href="+code=err" class="sref">err1/a> =.1a href="+code=device_create_file" class="sref">device_create_file1/a>(&1a href="+code=client" class="sref">client1/a>->1a href="+code=dev" class="sref">dev1/a>, &1a href="+code=dev_attr_control" class="sref">dev_attr_control1/a>);v.1991/a>        if (1a href="+code=err" class="sref">err1/a>)v.2001/a>                goto 1a href="+code=exit_devreg" class="sref">exit_devreg1/a>;v.2011/a>v.2021/a>        return 0;v.2031/a>v.2041/a> 1a href="+code=exit_devreg" class="sref">exit_devreg1/a>:v.2051/a>        1a href="+code=rtc_device_unregister" class="sref">rtc_device_unregister1/a>(1a href="+code=rtc" class="sref">rtc1/a>);v.2061/a>        return 1a href="+code=err" class="sref">err1/a>;v.2071/a>}v.2081/a>v.2091/a>static struct.1a href="+code=i2c_device_id" class="sref">i2c_device_id1/a> 1a href="+code=ds1672_id" class="sref">ds1672_id1/a>[] =.{v.2101/a>        { 1spa  class="string">"ds1672"1/spa  , 0 },v.2111/a>        { }v.2121/a>};v.2131/a>v.2141/a>static struct.1a href="+code=i2c_driver" class="sref">i2c_driver1/a> 1a href="+code=ds1672_driver" class="sref">ds1672_driver1/a> =.{v.2151/a>        .1a href="+code=driver" class="sref">driver1/a> =.{v.2161/a>                   .1a href="+code=nam " class="sref">nam 1/a> =.1spa  class="string">"rtc-ds1672"1/spa  ,v.2171/a>                   },v.2181/a>        .1a href="+code=probe" class="sref">probe1/a> =.&1a href="+code=ds1672_probe" class="sref">ds1672_probe1/a>,v.2191/a>        .1a href="+code=remove" class="sref">remove1/a> =.&1a href="+code=ds1672_remove" class="sref">ds1672_remove1/a>,v.2201/a>        .1a href="+code=id_table" class="sref">id_table1/a> =.1a href="+code=ds1672_id" class="sref">ds1672_id1/a>,v.2211/a>};v.2221/a>v.2231/a>1a href="+code=module_i2c_driver" class="sref">module_i2c_driver1/a>(1a href="+code=ds1672_driver" class="sref">ds1672_driver1/a>);v.2241/a>v.2251/a>1a href="+code=MODULE_AUTHOR" class="sref">MODULE_AUTHOR1/a>(1spa  class="string">"Alessandro Zummo <a.zummo@towertech.it>"1/spa  );v.2261/a>1a href="+code=MODULE_DESCRIPTION" class="sref">MODULE_DESCRIPTION1/a>(1spa  class="string">"Dallas/Maxim DS1672 timekeeper driver"1/spa  );v.2271/a>1a href="+code=MODULE_LICENSE" class="sref">MODULE_LICENSE1/a>(1spa  class="string">"GPL"1/spa  );v.2281/a>1a href="+code=MODULE_VERSION" class="sref">MODULE_VERSION1/a>(1a href="+code=DRV_VERSION" class="sref">DRV_VERSION1/a>);v.2291/a>
lxr.linux.no kindly hostediby Redpill Linpro AS1/a>, provider of Linux consulting and opera > s services since.1995.