<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">MAX3107/8 chip supports both SPI and I2C protocol. Currently, max310x
<o:p></o:p></p>
<p class="MsoNormal">driver support only SPI protocol. This patch adds I2C support to the
<o:p></o:p></p>
<p class="MsoNormal">driver. With I2C support, we have added bulk read/write functionality
<o:p></o:p></p>
<p class="MsoNormal">which can be enabled using BULK_RW_ENABLE variable.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Signed-off-by: Meghan Saitwal <a href="mailto:MeghanSaitwal@Eaton.com">
MeghanSaitwal@Eaton.com</a><o:p></o:p></p>
<p class="MsoNormal">Tested-by: Devidas Kalane <a href="mailto:DevidasKalane@Eaton.com">
DevidasKalane@Eaton.com</a><o:p></o:p></p>
<div style="mso-element:para-border-div;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 0in 1.0pt 0in">
<p class="MsoNormal" style="border:none;padding:0in">Suggested-by: Ashwin Patwekar
<a href="mailto:AshwinPatwekar@Eaton.com">AshwinPatwekar@Eaton.com</a><o:p></o:p></p>
</div>
<p class="MsoNormal" style="text-autospace:none">drivers/tty/serial/Kconfig   |   38 +++-<o:p></o:p></p>
<p class="MsoNormal" style="text-autospace:none">drivers/tty/serial/Makefile  |    2<o:p></o:p></p>
<p class="MsoNormal" style="text-autospace:none">drivers/tty/serial/max310x.c |  268 +++++++++++++++++++++++++++------<o:p></o:p></p>
<p class="MsoNormal">3 files changed, 254 insertions(+), 54 deletions(-)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">diff -purN a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig<o:p></o:p></p>
<p class="MsoNormal">--- a/drivers/tty/serial/Kconfig  2016-09-01 12:05:32.092474214 +0530<o:p></o:p></p>
<p class="MsoNormal">+++ b/drivers/tty/serial/Kconfig               2016-09-01 12:11:12.938507208 +0530<o:p></o:p></p>
<p class="MsoNormal">@@ -276,19 +276,45 @@ config SERIAL_MAX3100<o:p></o:p></p>
<p class="MsoNormal">               help<o:p></o:p></p>
<p class="MsoNormal">                 MAX3100 chip support<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">+config SERIAL_MAX310X_CORE<o:p></o:p></p>
<p class="MsoNormal">+             tristate<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">config SERIAL_MAX310X<o:p></o:p></p>
<p class="MsoNormal">-              bool "MAX310X support"<o:p></o:p></p>
<p class="MsoNormal">-              depends on SPI<o:p></o:p></p>
<p class="MsoNormal">+             tristate "MAX310X support"<o:p></o:p></p>
<p class="MsoNormal">+             depends on (SPI && !I2C) || I2C<o:p></o:p></p>
<p class="MsoNormal">               select SERIAL_CORE<o:p></o:p></p>
<p class="MsoNormal">-              select REGMAP_SPI if SPI<o:p></o:p></p>
<p class="MsoNormal">-              default n<o:p></o:p></p>
<p class="MsoNormal">               help<o:p></o:p></p>
<p class="MsoNormal">                 This selects support for an advanced UART from Maxim (Dallas).<o:p></o:p></p>
<p class="MsoNormal">                 Supported ICs are MAX3107, MAX3108.<o:p></o:p></p>
<p class="MsoNormal">                 Each IC contains 128 words each of receive and transmit FIFO<o:p></o:p></p>
<p class="MsoNormal">-                that can be controlled through I2C or high-speed SPI.<o:p></o:p></p>
<p class="MsoNormal">+               that can be controlled through I2C or high-speed SPI.
<o:p></o:p></p>
<p class="MsoNormal">+               Select SPI or I2C bus using options below.<o:p></o:p></p>
<p class="MsoNormal">+               <o:p></o:p></p>
<p class="MsoNormal">+config SERIAL_MAX310X_SPI<o:p></o:p></p>
<p class="MsoNormal">+             bool "MAX310x for spi interface"<o:p></o:p></p>
<p class="MsoNormal">+             depends on SERIAL_MAX310X<o:p></o:p></p>
<p class="MsoNormal">+             depends on SPI<o:p></o:p></p>
<p class="MsoNormal">+             select SERIAL_MAX310X_CORE if SERIAL_MAX310X<o:p></o:p></p>
<p class="MsoNormal">+             select REGMAP_SPI if SPI<o:p></o:p></p>
<p class="MsoNormal">+             default y<o:p></o:p></p>
<p class="MsoNormal">+             help<o:p></o:p></p>
<p class="MsoNormal">+                Enable MAX310x driver on SPI bus,<o:p></o:p></p>
<p class="MsoNormal">+                If required say y, and say n to spi if not required,<o:p></o:p></p>
<p class="MsoNormal">+                Enabled by default to support oldconfig.<o:p></o:p></p>
<p class="MsoNormal">+                You must select at least one bus for the driver to be built.<o:p></o:p></p>
<p class="MsoNormal">+               <o:p></o:p></p>
<p class="MsoNormal">+config SERIAL_MAX310X_I2C<o:p></o:p></p>
<p class="MsoNormal">+             bool "MAX310x for I2C interface"<o:p></o:p></p>
<p class="MsoNormal">+             depends on SERIAL_MAX310X<o:p></o:p></p>
<p class="MsoNormal">+             depends on I2C<o:p></o:p></p>
<p class="MsoNormal">+             select SERIAL_MAX310XX_CORE if SERIAL_MAX310X<o:p></o:p></p>
<p class="MsoNormal">+             select REGMAP_I2C if I2C<o:p></o:p></p>
<p class="MsoNormal">+             help<o:p></o:p></p>
<p class="MsoNormal">+                Enable MAX310x driver on I2C bus,<o:p></o:p></p>
<p class="MsoNormal">+                If required say y, and say n to i2c if not required,<o:p></o:p></p>
<p class="MsoNormal">+                This is additional support to existing driver.<o:p></o:p></p>
<p class="MsoNormal">+                You must select at least one bus for the driver to be built.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-                Say Y here if you want to support this ICs.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> config SERIAL_DZ<o:p></o:p></p>
<p class="MsoNormal">               bool "DECstation DZ serial driver"<o:p></o:p></p>
<p class="MsoNormal">diff -purN a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile<o:p></o:p></p>
<p class="MsoNormal">--- a/drivers/tty/serial/Makefile               2016-09-01 12:07:31.815485804 +0530<o:p></o:p></p>
<p class="MsoNormal">+++ b/drivers/tty/serial/Makefile            2016-09-01 12:11:40.576509884 +0530<o:p></o:p></p>
<p class="MsoNormal">@@ -28,7 +28,7 @@ obj-$(CONFIG_SERIAL_BFIN) += bfin_uart.o<o:p></o:p></p>
<p class="MsoNormal">obj-$(CONFIG_SERIAL_BFIN_SPORT) += bfin_sport_uart.o<o:p></o:p></p>
<p class="MsoNormal">obj-$(CONFIG_SERIAL_SAMSUNG) += samsung.o<o:p></o:p></p>
<p class="MsoNormal">obj-$(CONFIG_SERIAL_MAX3100) += max3100.o<o:p></o:p></p>
<p class="MsoNormal">-obj-$(CONFIG_SERIAL_MAX310X) += max310x.o<o:p></o:p></p>
<p class="MsoNormal">+obj-$(CONFIG_SERIAL_MAX310X_CORE) += max310x.o<o:p></o:p></p>
<p class="MsoNormal">obj-$(CONFIG_SERIAL_IP22_ZILOG) += ip22zilog.o<o:p></o:p></p>
<p class="MsoNormal">obj-$(CONFIG_SERIAL_MUX) += mux.o<o:p></o:p></p>
<p class="MsoNormal">obj-$(CONFIG_SERIAL_68328) += 68328serial.o<o:p></o:p></p>
<p class="MsoNormal">diff -purN a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c<o:p></o:p></p>
<p class="MsoNormal">--- a/drivers/tty/serial/max310x.c            2013-05-12 02:27:46.000000000 +0530<o:p></o:p></p>
<p class="MsoNormal">+++ b/drivers/tty/serial/max310x.c         2016-08-12 10:22:40.000000000 +0530<o:p></o:p></p>
<p class="MsoNormal">@@ -25,8 +25,11 @@<o:p></o:p></p>
<p class="MsoNormal">#include <linux/regmap.h><o:p></o:p></p>
<p class="MsoNormal">#include <linux/gpio.h><o:p></o:p></p>
<p class="MsoNormal">#include <linux/spi/spi.h><o:p></o:p></p>
<p class="MsoNormal">+#include <linux/i2c.h><o:p></o:p></p>
<p class="MsoNormal">#include <linux/platform_data/max310x.h><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">+#define BULK_RW_ENABLE      0<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">#define MAX310X_MAJOR                                         204<o:p></o:p></p>
<p class="MsoNormal">#define MAX310X_MINOR                                         209<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">@@ -272,6 +275,8 @@ struct max310x_port {<o:p></o:p></p>
<p class="MsoNormal">               const char                           *name;<o:p></o:p></p>
<p class="MsoNormal">               int                                           uartclk;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">+             unsigned char                    buf[MAX310X_FIFO_SIZE];<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">               unsigned int                       nr_gpio;<o:p></o:p></p>
<p class="MsoNormal">#ifdef CONFIG_GPIOLIB<o:p></o:p></p>
<p class="MsoNormal">               struct gpio_chip                gpio;<o:p></o:p></p>
<p class="MsoNormal">@@ -459,7 +464,7 @@ static int max310x_set_ref_clk(struct ma<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> static void max310x_handle_rx(struct max310x_port *s, unsigned int rxlen)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">-              unsigned int sts = 0, ch = 0, flag;<o:p></o:p></p>
<p class="MsoNormal">+             unsigned int sts = 0, ch = 0, flag, bytes_read, i;<o:p></o:p></p>
<p class="MsoNormal">               struct tty_struct *tty = tty_port_tty_get(&s->port.state->port);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                if (!tty)<o:p></o:p></p>
<p class="MsoNormal">@@ -473,7 +478,64 @@ static void max310x_handle_rx(struct max<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                dev_dbg(s->port.dev, "RX Len = %u\n", rxlen);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-              while (rxlen--) {<o:p></o:p></p>
<p class="MsoNormal">+             #if BULK_RW_ENABLE<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             while (rxlen) {<o:p></o:p></p>
<p class="MsoNormal">+                             regmap_read(s->regmap, MAX310X_LSR_IRQSTS_REG, &sts);<o:p></o:p></p>
<p class="MsoNormal">+                             sts &= MAX310X_LSR_RXPAR_BIT | MAX310X_LSR_FRERR_BIT |<o:p></o:p></p>
<p class="MsoNormal">+                                    MAX310X_LSR_RXOVR_BIT | MAX310X_LSR_RXBRK_BIT;<o:p></o:p></p>
<p class="MsoNormal">+                             if(sts)<o:p></o:p></p>
<p class="MsoNormal">+                             {<o:p></o:p></p>
<p class="MsoNormal">+                                             regmap_read(s->regmap,MAX310X_RHR_REG, s->buf);<o:p></o:p></p>
<p class="MsoNormal">+                                             bytes_read = 1;<o:p></o:p></p>
<p class="MsoNormal">+                             } else {<o:p></o:p></p>
<p class="MsoNormal">+                                             regcache_cache_bypass(s->regmap, true);<o:p></o:p></p>
<p class="MsoNormal">+                             regmap_raw_read(s->regmap, MAX310X_RHR_REG, s->buf, rxlen);<o:p></o:p></p>
<p class="MsoNormal">+                             regcache_cache_bypass(s->regmap, false);<o:p></o:p></p>
<p class="MsoNormal">+                                             bytes_read = rxlen;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             <o:p></o:p></p>
<p class="MsoNormal">+                             s->port.icount.rx++;<o:p></o:p></p>
<p class="MsoNormal">+                             flag = TTY_NORMAL;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             if (unlikely(sts)) {<o:p></o:p></p>
<p class="MsoNormal">+                                             if (sts & MAX310X_LSR_RXBRK_BIT) {<o:p></o:p></p>
<p class="MsoNormal">+                                                             s->port.icount.brk++;<o:p></o:p></p>
<p class="MsoNormal">+                                                             if (uart_handle_break(&s->port))<o:p></o:p></p>
<p class="MsoNormal">+                                                                             continue;<o:p></o:p></p>
<p class="MsoNormal">+                                             } else if (sts & MAX310X_LSR_RXPAR_BIT)<o:p></o:p></p>
<p class="MsoNormal">+                                                             s->port.icount.parity++;<o:p></o:p></p>
<p class="MsoNormal">+                                             else if (sts & MAX310X_LSR_FRERR_BIT)<o:p></o:p></p>
<p class="MsoNormal">+                                                             s->port.icount.frame++;<o:p></o:p></p>
<p class="MsoNormal">+                                             else if (sts & MAX310X_LSR_RXOVR_BIT)<o:p></o:p></p>
<p class="MsoNormal">+                                                             s->port.icount.overrun++;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             sts &= s->port.read_status_mask;<o:p></o:p></p>
<p class="MsoNormal">+                                             if (sts & MAX310X_LSR_RXBRK_BIT)<o:p></o:p></p>
<p class="MsoNormal">+                                                             flag = TTY_BREAK;<o:p></o:p></p>
<p class="MsoNormal">+                                             else if (sts & MAX310X_LSR_RXPAR_BIT)<o:p></o:p></p>
<p class="MsoNormal">+                                                             flag = TTY_PARITY;<o:p></o:p></p>
<p class="MsoNormal">+                                             else if (sts & MAX310X_LSR_FRERR_BIT)<o:p></o:p></p>
<p class="MsoNormal">+                                                             flag = TTY_FRAME;<o:p></o:p></p>
<p class="MsoNormal">+                                             else if (sts & MAX310X_LSR_RXOVR_BIT)<o:p></o:p></p>
<p class="MsoNormal">+                                                             flag = TTY_OVERRUN;<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             <o:p></o:p></p>
<p class="MsoNormal">+                             for(i=0; i< bytes_read; i++)<o:p></o:p></p>
<p class="MsoNormal">+                             {<o:p></o:p></p>
<p class="MsoNormal">+                                             if (uart_handle_sysrq_char(s->port, s->buf[i]))<o:p></o:p></p>
<p class="MsoNormal">+                                                             continue;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             if (sts & s->port.ignore_status_mask)<o:p></o:p></p>
<p class="MsoNormal">+                                                             continue;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                                             uart_insert_char(&s->port, sts, MAX310X_LSR_RXOVR_BIT,<o:p></o:p></p>
<p class="MsoNormal">+                                                             s->buf[i], flag);<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             rxlen -= bytes_read;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             #else<o:p></o:p></p>
<p class="MsoNormal">+                             while (rxlen--) {<o:p></o:p></p>
<p class="MsoNormal">                               regmap_read(s->regmap, MAX310X_RHR_REG, &ch);<o:p></o:p></p>
<p class="MsoNormal">                               regmap_read(s->regmap, MAX310X_LSR_IRQSTS_REG, &sts);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">@@ -514,8 +576,8 @@ static void max310x_handle_rx(struct max<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                uart_insert_char(&s->port, sts, MAX310X_LSR_RXOVR_BIT,<o:p></o:p></p>
<p class="MsoNormal">                                                                ch, flag);<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+             #endif<o:p></o:p></p>
<p class="MsoNormal">               tty_flip_buffer_push(tty);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                tty_kref_put(tty);<o:p></o:p></p>
<p class="MsoNormal">@@ -524,8 +586,7 @@ static void max310x_handle_rx(struct max<o:p></o:p></p>
<p class="MsoNormal">static void max310x_handle_tx(struct max310x_port *s)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">               struct circ_buf *xmit = &s->port.state->xmit;<o:p></o:p></p>
<p class="MsoNormal">-              unsigned int txlen = 0, to_send;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">+             unsigned int txlen = 0, to_send = 0, i;<o:p></o:p></p>
<p class="MsoNormal">               if (unlikely(s->port.x_char)) {<o:p></o:p></p>
<p class="MsoNormal">                               regmap_write(s->regmap, MAX310X_THR_REG, s->port.x_char);<o:p></o:p></p>
<p class="MsoNormal">                               s->port.icount.tx++;<o:p></o:p></p>
<p class="MsoNormal">@@ -545,7 +606,18 @@ static void max310x_handle_tx(struct max<o:p></o:p></p>
<p class="MsoNormal">                               to_send = (to_send > txlen) ? txlen : to_send;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                dev_dbg(s->port.dev, "TX Len = %u\n", to_send);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">+#if BULK_RW_ENABLE<o:p></o:p></p>
<p class="MsoNormal">+                             /* Add data to send */<o:p></o:p></p>
<p class="MsoNormal">+                             s->port.icount.tx += to_send;<o:p></o:p></p>
<p class="MsoNormal">+                             for(i=0; i < to_send; ++i)<o:p></o:p></p>
<p class="MsoNormal">+                             {<o:p></o:p></p>
<p class="MsoNormal">+                                             s->buf[i] = xmit->buf[xmit->tail];<o:p></o:p></p>
<p class="MsoNormal">+                                             xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);<o:p></o:p></p>
<p class="MsoNormal">+                             }<o:p></o:p></p>
<p class="MsoNormal">+                             regcache_cache_bypass(s->regmap, true);<o:p></o:p></p>
<p class="MsoNormal">+                             regmap_raw_write(s->regmap, MAX310X_THR_REG, s->buf, to_send);<o:p></o:p></p>
<p class="MsoNormal">+                             regcache_cache_bypass(s->regmap, false);<o:p></o:p></p>
<p class="MsoNormal">+#else <o:p></o:p></p>
<p class="MsoNormal">                                /* Add data to send */<o:p></o:p></p>
<p class="MsoNormal">                               s->port.icount.tx += to_send;<o:p></o:p></p>
<p class="MsoNormal">                               while (to_send--) {<o:p></o:p></p>
<p class="MsoNormal">@@ -553,6 +625,7 @@ static void max310x_handle_tx(struct max<o:p></o:p></p>
<p class="MsoNormal">                                                                    xmit->buf[xmit->tail]);<o:p></o:p></p>
<p class="MsoNormal">                                               xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);<o:p></o:p></p>
<p class="MsoNormal">                               };<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)<o:p></o:p></p>
<p class="MsoNormal">@@ -593,7 +666,7 @@ static irqreturn_t max310x_ist(int irq,<o:p></o:p></p>
<p class="MsoNormal">static void max310x_wq_proc(struct work_struct *ws)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">               struct max310x_port *s = container_of(ws, struct max310x_port, tx_work);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">               mutex_lock(&s->max310x_mutex);<o:p></o:p></p>
<p class="MsoNormal">               max310x_handle_tx(s);<o:p></o:p></p>
<p class="MsoNormal">               mutex_unlock(&s->max310x_mutex);<o:p></o:p></p>
<p class="MsoNormal">@@ -887,12 +960,12 @@ static struct uart_ops max310x_ops = {<o:p></o:p></p>
<p class="MsoNormal">               .verify_port        = max310x_verify_port,<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-static int max310x_suspend(struct spi_device *spi, pm_message_t state)<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_suspend(struct device *dev)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">               int ret;<o:p></o:p></p>
<p class="MsoNormal">-              struct max310x_port *s = dev_get_drvdata(&spi->dev);<o:p></o:p></p>
<p class="MsoNormal">+             struct max310x_port *s = dev_get_drvdata(dev);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-              dev_dbg(&spi->dev, "Suspend\n");<o:p></o:p></p>
<p class="MsoNormal">+             dev_dbg(dev, "Suspend\n");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                ret = uart_suspend_port(&s->uart, &s->port);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">@@ -911,11 +984,11 @@ static int max310x_suspend(struct spi_de<o:p></o:p></p>
<p class="MsoNormal">               return ret;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-static int max310x_resume(struct spi_device *spi)<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_resume(struct device *dev)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">-              struct max310x_port *s = dev_get_drvdata(&spi->dev);<o:p></o:p></p>
<p class="MsoNormal">+             struct max310x_port *s = dev_get_drvdata(dev);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-              dev_dbg(&spi->dev, "Resume\n");<o:p></o:p></p>
<p class="MsoNormal">+             dev_dbg(dev, "Resume\n");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                if (s->pdata->suspend)<o:p></o:p></p>
<p class="MsoNormal">                               s->pdata->suspend(0);<o:p></o:p></p>
<p class="MsoNormal">@@ -995,17 +1068,15 @@ static struct max310x_pdata generic_plat<o:p></o:p></p>
<p class="MsoNormal">               .frequency          = 26000000,<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-static int max310x_probe(struct spi_device *spi)<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_probe(struct device *dev, int chiptype, struct regmap *regmap, int irq)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">               struct max310x_port *s;<o:p></o:p></p>
<p class="MsoNormal">-              struct device *dev = &spi->dev;<o:p></o:p></p>
<p class="MsoNormal">-              int chiptype = spi_get_device_id(spi)->driver_data;<o:p></o:p></p>
<p class="MsoNormal">               struct max310x_pdata *pdata = dev->platform_data;<o:p></o:p></p>
<p class="MsoNormal">               unsigned int val = 0;<o:p></o:p></p>
<p class="MsoNormal">               int ret;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                /* Check for IRQ */<o:p></o:p></p>
<p class="MsoNormal">-              if (spi->irq <= 0) {<o:p></o:p></p>
<p class="MsoNormal">+             if (irq <= 0) {<o:p></o:p></p>
<p class="MsoNormal">                               dev_err(dev, "No IRQ specified\n");<o:p></o:p></p>
<p class="MsoNormal">                               return -ENOTSUPP;<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal">@@ -1023,6 +1094,7 @@ static int max310x_probe(struct spi_devi<o:p></o:p></p>
<p class="MsoNormal">                               pdata = &generic_plat_data;<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal">               s->pdata = pdata;<o:p></o:p></p>
<p class="MsoNormal">+    s->regmap = regmap;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                /* Individual chip settings */<o:p></o:p></p>
<p class="MsoNormal">               switch (chiptype) {<o:p></o:p></p>
<p class="MsoNormal">@@ -1030,13 +1102,11 @@ static int max310x_probe(struct spi_devi<o:p></o:p></p>
<p class="MsoNormal">                               s->name = "MAX3107";<o:p></o:p></p>
<p class="MsoNormal">                               s->nr_gpio = 4;<o:p></o:p></p>
<p class="MsoNormal">                               s->uart.nr = 1;<o:p></o:p></p>
<p class="MsoNormal">-                              s->regcfg.max_register = 0x1f;<o:p></o:p></p>
<p class="MsoNormal">                               break;<o:p></o:p></p>
<p class="MsoNormal">               case MAX310X_TYPE_MAX3108:<o:p></o:p></p>
<p class="MsoNormal">                               s->name = "MAX3108";<o:p></o:p></p>
<p class="MsoNormal">                               s->nr_gpio = 4;<o:p></o:p></p>
<p class="MsoNormal">                               s->uart.nr = 1;<o:p></o:p></p>
<p class="MsoNormal">-                              s->regcfg.max_register = 0x1e;<o:p></o:p></p>
<p class="MsoNormal">                               break;<o:p></o:p></p>
<p class="MsoNormal">               default:<o:p></o:p></p>
<p class="MsoNormal">                               dev_err(dev, "Unsupported chip type %i\n", chiptype);<o:p></o:p></p>
<p class="MsoNormal">@@ -1054,32 +1124,16 @@ static int max310x_probe(struct spi_devi<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                mutex_init(&s->max310x_mutex);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-              /* Setup SPI bus */<o:p></o:p></p>
<p class="MsoNormal">-              spi->mode                          = SPI_MODE_0;<o:p></o:p></p>
<p class="MsoNormal">-              spi->bits_per_word        = 8;<o:p></o:p></p>
<p class="MsoNormal">-              spi->max_speed_hz       = 26000000;<o:p></o:p></p>
<p class="MsoNormal">-              spi_setup(spi);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              /* Setup regmap */<o:p></o:p></p>
<p class="MsoNormal">-              s->regcfg.reg_bits                           = 8;<o:p></o:p></p>
<p class="MsoNormal">-              s->regcfg.val_bits                            = 8;<o:p></o:p></p>
<p class="MsoNormal">-              s->regcfg.read_flag_mask           = 0x00;<o:p></o:p></p>
<p class="MsoNormal">-              s->regcfg.write_flag_mask          = 0x80;<o:p></o:p></p>
<p class="MsoNormal">-              s->regcfg.cache_type                    = REGCACHE_RBTREE;<o:p></o:p></p>
<p class="MsoNormal">-              s->regcfg.writeable_reg                               = max3107_8_reg_writeable;<o:p></o:p></p>
<p class="MsoNormal">-              s->regcfg.volatile_reg                    = max310x_reg_volatile;<o:p></o:p></p>
<p class="MsoNormal">-              s->regcfg.precious_reg                 = max310x_reg_precious;<o:p></o:p></p>
<p class="MsoNormal">-              s->regmap = devm_regmap_init_spi(spi, &s->regcfg);<o:p></o:p></p>
<p class="MsoNormal">               if (IS_ERR(s->regmap)) {<o:p></o:p></p>
<p class="MsoNormal">                               ret = PTR_ERR(s->regmap);<o:p></o:p></p>
<p class="MsoNormal">                               dev_err(dev, "Failed to initialize register map\n");<o:p></o:p></p>
<p class="MsoNormal">                               goto err_out;<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-              /* Reset chip & check SPI function */<o:p></o:p></p>
<p class="MsoNormal">+             /* Reset chip & check SPI/I2C function */<o:p></o:p></p>
<p class="MsoNormal">               ret = regmap_write(s->regmap, MAX310X_MODE2_REG, MAX310X_MODE2_RST_BIT);<o:p></o:p></p>
<p class="MsoNormal">               if (ret) {<o:p></o:p></p>
<p class="MsoNormal">-                              dev_err(dev, "SPI transfer failed\n");<o:p></o:p></p>
<p class="MsoNormal">+                             dev_err(dev, "SPI/I2C transfer failed\n");<o:p></o:p></p>
<p class="MsoNormal">                               goto err_out;<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal">               /* Clear chip reset */<o:p></o:p></p>
<p class="MsoNormal">@@ -1129,11 +1183,12 @@ static int max310x_probe(struct spi_devi<o:p></o:p></p>
<p class="MsoNormal">               regmap_write(s->regmap, MAX310X_MODE1_REG, val);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                /* Setup interrupt */<o:p></o:p></p>
<p class="MsoNormal">-              ret = devm_request_threaded_irq(dev, spi->irq, NULL, max310x_ist,<o:p></o:p></p>
<p class="MsoNormal">+             /* Used IRQF_TRIGGER_LOW in case of I2C */<o:p></o:p></p>
<p class="MsoNormal">+             ret = devm_request_threaded_irq(dev, irq, NULL, max310x_ist,<o:p></o:p></p>
<p class="MsoNormal">                                                                               IRQF_TRIGGER_FALLING | IRQF_ONESHOT,<o:p></o:p></p>
<p class="MsoNormal">                                                                               dev_name(dev), s);<o:p></o:p></p>
<p class="MsoNormal">               if (ret) {<o:p></o:p></p>
<p class="MsoNormal">-                              dev_err(dev, "Unable to reguest IRQ %i\n", spi->irq);<o:p></o:p></p>
<p class="MsoNormal">+                             dev_err(dev, "Unable to reguest IRQ %i\n", irq);<o:p></o:p></p>
<p class="MsoNormal">                               goto err_out;<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">@@ -1156,7 +1211,7 @@ static int max310x_probe(struct spi_devi<o:p></o:p></p>
<p class="MsoNormal">               /* Initialize UART port data */<o:p></o:p></p>
<p class="MsoNormal">               s->port.line                        = 0;<o:p></o:p></p>
<p class="MsoNormal">               s->port.dev                        = dev;<o:p></o:p></p>
<p class="MsoNormal">-              s->port.irq                          = spi->irq;<o:p></o:p></p>
<p class="MsoNormal">+             s->port.irq                          = irq;<o:p></o:p></p>
<p class="MsoNormal">               s->port.type                      = PORT_MAX310X;<o:p></o:p></p>
<p class="MsoNormal">               s->port.fifosize = MAX310X_FIFO_SIZE;<o:p></o:p></p>
<p class="MsoNormal">               s->port.flags                      = UPF_SKIP_TEST | UPF_FIXED_TYPE;<o:p></o:p></p>
<p class="MsoNormal">@@ -1203,9 +1258,8 @@ err_out:<o:p></o:p></p>
<p class="MsoNormal">               return ret;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-static int max310x_remove(struct spi_device *spi)<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_remove(struct device *dev)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">-              struct device *dev = &spi->dev;<o:p></o:p></p>
<p class="MsoNormal">               struct max310x_port *s = dev_get_drvdata(dev);<o:p></o:p></p>
<p class="MsoNormal">               int ret = 0;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">@@ -1237,6 +1291,63 @@ static int max310x_remove(struct spi_dev<o:p></o:p></p>
<p class="MsoNormal">               return ret;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">+static struct regmap_config regcfg = {<o:p></o:p></p>
<p class="MsoNormal">+    .reg_bits = 8,<o:p></o:p></p>
<p class="MsoNormal">+    .val_bits = 8,<o:p></o:p></p>
<p class="MsoNormal">+    .read_flag_mask = 0x00,<o:p></o:p></p>
<p class="MsoNormal">+    .write_flag_mask = 0x80,      // may need to remove this mask<o:p></o:p></p>
<p class="MsoNormal">+    .cache_type = REGCACHE_RBTREE,<o:p></o:p></p>
<p class="MsoNormal">+    .writeable_reg = max3107_8_reg_writeable,<o:p></o:p></p>
<p class="MsoNormal">+    .volatile_reg = max310x_reg_volatile,<o:p></o:p></p>
<p class="MsoNormal">+    .precious_reg = max310x_reg_precious,<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef CONFIG_SERIAL_MAX310X_SPI<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_spi_probe(struct spi_device *spi)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             struct regmap *regmap;<o:p></o:p></p>
<p class="MsoNormal">+    int chiptype = spi_get_device_id(spi)->driver_data;<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+             /* Setup SPI bus */<o:p></o:p></p>
<p class="MsoNormal">+             spi->mode                          = SPI_MODE_0;<o:p></o:p></p>
<p class="MsoNormal">+             spi->bits_per_word        = 8;<o:p></o:p></p>
<p class="MsoNormal">+             spi->max_speed_hz       = 26000000;<o:p></o:p></p>
<p class="MsoNormal">+             spi_setup(spi);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+             switch (chiptype) {<o:p></o:p></p>
<p class="MsoNormal">+             case MAX310X_TYPE_MAX3107:<o:p></o:p></p>
<p class="MsoNormal">+                             regcfg.max_register = 0x1f;<o:p></o:p></p>
<p class="MsoNormal">+                             break;<o:p></o:p></p>
<p class="MsoNormal">+             case MAX310X_TYPE_MAX3108:<o:p></o:p></p>
<p class="MsoNormal">+                             regcfg.max_register = 0x1e;<o:p></o:p></p>
<p class="MsoNormal">+                             break;<o:p></o:p></p>
<p class="MsoNormal">+             default:<o:p></o:p></p>
<p class="MsoNormal">+                             dev_err(&spi->dev, "Unsupported chip type %i\n", chiptype);<o:p></o:p></p>
<p class="MsoNormal">+                             return -ENOTSUPP;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+             regmap = devm_regmap_init_spi(spi, &regcfg);<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+    return max310x_probe(&spi->dev, chiptype, regmap, spi->irq);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_spi_remove(struct spi_device *spi)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return max310x_remove(&spi->dev);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_suspend(struct spi_device *spi, pm_message_t state)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    return max310x_suspend(&spi->dev);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_resume(struct spi_device *spi)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    return max310x_resume(&spi->dev);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">static const struct spi_device_id max310x_id_table[] = {<o:p></o:p></p>
<p class="MsoNormal">               { "max3107",      MAX310X_TYPE_MAX3107 },<o:p></o:p></p>
<p class="MsoNormal">               { "max3108",      MAX310X_TYPE_MAX3108 },<o:p></o:p></p>
<p class="MsoNormal">@@ -1249,13 +1360,76 @@ static struct spi_driver max310x_driver<o:p></o:p></p>
<p class="MsoNormal">                               .name   = "max310x",<o:p></o:p></p>
<p class="MsoNormal">                               .owner = THIS_MODULE,<o:p></o:p></p>
<p class="MsoNormal">               },<o:p></o:p></p>
<p class="MsoNormal">-              .probe                  = max310x_probe,<o:p></o:p></p>
<p class="MsoNormal">-              .remove                               = max310x_remove,<o:p></o:p></p>
<p class="MsoNormal">-              .suspend             = max310x_suspend,<o:p></o:p></p>
<p class="MsoNormal">-              .resume                               = max310x_resume,<o:p></o:p></p>
<p class="MsoNormal">+             .probe                  = max310x_spi_probe,<o:p></o:p></p>
<p class="MsoNormal">+             .remove                               = max310x_spi_remove,<o:p></o:p></p>
<p class="MsoNormal">+             .suspend             = max310x_spi_suspend,<o:p></o:p></p>
<p class="MsoNormal">+             .resume                               = max310x_spi_resume,<o:p></o:p></p>
<p class="MsoNormal">               .id_table              = max310x_id_table,<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal">module_spi_driver(max310x_driver);<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifdef CONFIG_SERIAL_MAX310X_I2C<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_i2c_probe(struct i2c_client *i2c,const struct i2c_device_id *id)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    struct regmap *regmap;<o:p></o:p></p>
<p class="MsoNormal">+             int chiptype = id->driver_data;<o:p></o:p></p>
<p class="MsoNormal">+    printk("chiptype = %d \n",chiptype);<o:p></o:p></p>
<p class="MsoNormal">+             switch (chiptype) {<o:p></o:p></p>
<p class="MsoNormal">+             case MAX310X_TYPE_MAX3107:<o:p></o:p></p>
<p class="MsoNormal">+                             regcfg.max_register = 0x1f;<o:p></o:p></p>
<p class="MsoNormal">+                             break;<o:p></o:p></p>
<p class="MsoNormal">+             case MAX310X_TYPE_MAX3108:<o:p></o:p></p>
<p class="MsoNormal">+                             regcfg.max_register = 0x1e;<o:p></o:p></p>
<p class="MsoNormal">+                             break;<o:p></o:p></p>
<p class="MsoNormal">+             default:<o:p></o:p></p>
<p class="MsoNormal">+                             dev_err(&i2c->dev, "Unsupported chip type %i\n", chiptype);<o:p></o:p></p>
<p class="MsoNormal">+                             return -ENOTSUPP;<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    regmap = devm_regmap_init_i2c(i2c, &regcfg);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+    return max310x_probe(&i2c->dev, chiptype, regmap,  i2c->irq);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_i2c_remove(struct i2c_client *i2c)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             return max310x_remove(&i2c->dev);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_i2c_suspend(struct i2c_client *i2c, pm_message_t state)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    return max310x_suspend(&i2c->dev);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static int max310x_i2c_resume(struct i2c_client *i2c)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+    return max310x_resume(&i2c->dev);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static const struct i2c_device_id max310x_id_table[] = {<o:p></o:p></p>
<p class="MsoNormal">+             { "max3107",      MAX310X_TYPE_MAX3107 },<o:p></o:p></p>
<p class="MsoNormal">+             { "max3108",      MAX310X_TYPE_MAX3108 },<o:p></o:p></p>
<p class="MsoNormal">+             { }<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+MODULE_DEVICE_TABLE(i2c, max310x_id_table);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+static struct i2c_driver max310x_driver = {<o:p></o:p></p>
<p class="MsoNormal">+             .driver = {<o:p></o:p></p>
<p class="MsoNormal">+                             .name   = "max310x",<o:p></o:p></p>
<p class="MsoNormal">+                             .owner = THIS_MODULE,<o:p></o:p></p>
<p class="MsoNormal">+             },<o:p></o:p></p>
<p class="MsoNormal">+             .probe                  = max310x_i2c_probe,<o:p></o:p></p>
<p class="MsoNormal">+             .remove                               = max310x_i2c_remove,<o:p></o:p></p>
<p class="MsoNormal">+             .suspend             = max310x_i2c_suspend,<o:p></o:p></p>
<p class="MsoNormal">+             .resume                               = max310x_i2c_resume,<o:p></o:p></p>
<p class="MsoNormal">+             .id_table              = max310x_id_table,<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+module_i2c_driver(max310x_driver);<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> MODULE_LICENSE("GPL v2");<o:p></o:p></p>
<p class="MsoNormal">MODULE_AUTHOR("Alexander Shiyan <<a href="mailto:shc_work@mail.ru">shc_work@mail.ru</a>>");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>