<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, ®cfg);<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, ®cfg);<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>