[PATCH 0/3] Remove obsolete tnetv107x drivers

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PATCH 0/3] Remove obsolete tnetv107x drivers

Arnd Bergmann
I have applied the platform removal patch with the Ack
from Kevin and Sekhar. Please apply these other patches
through the input/mfd/spi trees.

Arnd Bergmann (3):
  spi: remove obsolete spi-ti-ssp driver
  mfd: remove obsolete ti-ssp driver
  input: remove obsolete tnetv107x drivers

 drivers/input/keyboard/Kconfig            |  10 -
 drivers/input/keyboard/Makefile           |   1 -
 drivers/input/keyboard/tnetv107x-keypad.c | 329 ---------------------
 drivers/input/touchscreen/Kconfig         |   9 -
 drivers/input/touchscreen/Makefile        |   1 -
 drivers/input/touchscreen/tnetv107x-ts.c  | 384 ------------------------
 drivers/mfd/Kconfig                       |  11 -
 drivers/mfd/Makefile                      |   1 -
 drivers/mfd/ti-ssp.c                      | 465 ------------------------------
 drivers/spi/Kconfig                       |   7 -
 drivers/spi/Makefile                      |   1 -
 drivers/spi/spi-ti-ssp.c                  | 378 ------------------------
 12 files changed, 1597 deletions(-)
 delete mode 100644 drivers/input/keyboard/tnetv107x-keypad.c
 delete mode 100644 drivers/input/touchscreen/tnetv107x-ts.c
 delete mode 100644 drivers/mfd/ti-ssp.c
 delete mode 100644 drivers/spi/spi-ti-ssp.c

Cc: Mark Brown <[hidden email]>
Cc: [hidden email]
Cc: Samuel Ortiz <[hidden email]>
Cc: Lee Jones <[hidden email]>
Cc: Dmitry Torokhov <[hidden email]>
Cc: [hidden email]

--
1.8.3.2

_______________________________________________
Davinci-linux-open-source mailing list
[hidden email]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PATCH 1/3] spi: remove obsolete spi-ti-ssp driver

Arnd Bergmann
The tnetv107x platform is getting removed, so this driver
will not be needed any more.

Signed-off-by: Arnd Bergmann <[hidden email]>
Acked-by: Sekhar Nori <[hidden email]>
Acked-by: Kevin Hilman <[hidden email]>
Cc: Mark Brown <[hidden email]>
Cc: [hidden email]
---
 drivers/spi/Kconfig      |   7 -
 drivers/spi/Makefile     |   1 -
 drivers/spi/spi-ti-ssp.c | 378 -----------------------------------------------
 3 files changed, 386 deletions(-)
 delete mode 100644 drivers/spi/spi-ti-ssp.c

diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
index 581ee2a..b243f2f 100644
--- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig
@@ -478,13 +478,6 @@ config SPI_TEGRA20_SLINK
  help
   SPI driver for Nvidia Tegra20/Tegra30 SLINK Controller interface.
 
-config SPI_TI_SSP
- tristate "TI Sequencer Serial Port - SPI Support"
- depends on MFD_TI_SSP
- help
-  This selects an SPI master implementation using a TI sequencer
-  serial port.
-
 config SPI_TOPCLIFF_PCH
  tristate "Intel EG20T PCH/LAPIS Semicon IOH(ML7213/ML7223/ML7831) SPI"
  depends on PCI
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
index 95af48d..7da53af 100644
--- a/drivers/spi/Makefile
+++ b/drivers/spi/Makefile
@@ -73,7 +73,6 @@ obj-$(CONFIG_SPI_SIRF) += spi-sirf.o
 obj-$(CONFIG_SPI_TEGRA114) += spi-tegra114.o
 obj-$(CONFIG_SPI_TEGRA20_SFLASH) += spi-tegra20-sflash.o
 obj-$(CONFIG_SPI_TEGRA20_SLINK) += spi-tegra20-slink.o
-obj-$(CONFIG_SPI_TI_SSP) += spi-ti-ssp.o
 obj-$(CONFIG_SPI_TLE62X0) += spi-tle62x0.o
 obj-$(CONFIG_SPI_TOPCLIFF_PCH) += spi-topcliff-pch.o
 obj-$(CONFIG_SPI_TXX9) += spi-txx9.o
diff --git a/drivers/spi/spi-ti-ssp.c b/drivers/spi/spi-ti-ssp.c
deleted file mode 100644
index 7d20e12..0000000
--- a/drivers/spi/spi-ti-ssp.c
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Sequencer Serial Port (SSP) based SPI master driver
- *
- * Copyright (C) 2010 Texas Instruments Inc
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <linux/kernel.h>
-#include <linux/err.h>
-#include <linux/completion.h>
-#include <linux/delay.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/spi/spi.h>
-#include <linux/mfd/ti_ssp.h>
-
-#define MODE_BITS (SPI_CPHA | SPI_CPOL | SPI_CS_HIGH)
-
-struct ti_ssp_spi {
- struct spi_master *master;
- struct device *dev;
- spinlock_t lock;
- struct list_head msg_queue;
- struct completion complete;
- bool shutdown;
- struct workqueue_struct *workqueue;
- struct work_struct work;
- u8 mode, bpw;
- int cs_active;
- u32 pc_en, pc_dis, pc_wr, pc_rd;
- void (*select)(int cs);
-};
-
-static u32 ti_ssp_spi_rx(struct ti_ssp_spi *hw)
-{
- u32 ret;
-
- ti_ssp_run(hw->dev, hw->pc_rd, 0, &ret);
- return ret;
-}
-
-static void ti_ssp_spi_tx(struct ti_ssp_spi *hw, u32 data)
-{
- ti_ssp_run(hw->dev, hw->pc_wr, data << (32 - hw->bpw), NULL);
-}
-
-static int ti_ssp_spi_txrx(struct ti_ssp_spi *hw, struct spi_message *msg,
-       struct spi_transfer *t)
-{
- int count;
-
- if (hw->bpw <= 8) {
- u8 *rx = t->rx_buf;
- const u8 *tx = t->tx_buf;
-
- for (count = 0; count < t->len; count += 1) {
- if (t->tx_buf)
- ti_ssp_spi_tx(hw, *tx++);
- if (t->rx_buf)
- *rx++ = ti_ssp_spi_rx(hw);
- }
- } else if (hw->bpw <= 16) {
- u16 *rx = t->rx_buf;
- const u16 *tx = t->tx_buf;
-
- for (count = 0; count < t->len; count += 2) {
- if (t->tx_buf)
- ti_ssp_spi_tx(hw, *tx++);
- if (t->rx_buf)
- *rx++ = ti_ssp_spi_rx(hw);
- }
- } else {
- u32 *rx = t->rx_buf;
- const u32 *tx = t->tx_buf;
-
- for (count = 0; count < t->len; count += 4) {
- if (t->tx_buf)
- ti_ssp_spi_tx(hw, *tx++);
- if (t->rx_buf)
- *rx++ = ti_ssp_spi_rx(hw);
- }
- }
-
- msg->actual_length += count; /* bytes transferred */
-
- dev_dbg(&msg->spi->dev, "xfer %s%s, %d bytes, %d bpw, count %d%s\n",
- t->tx_buf ? "tx" : "", t->rx_buf ? "rx" : "", t->len,
- hw->bpw, count, (count < t->len) ? " (under)" : "");
-
- return (count < t->len) ? -EIO : 0; /* left over data */
-}
-
-static void ti_ssp_spi_chip_select(struct ti_ssp_spi *hw, int cs_active)
-{
- cs_active = !!cs_active;
- if (cs_active == hw->cs_active)
- return;
- ti_ssp_run(hw->dev, cs_active ? hw->pc_en : hw->pc_dis, 0, NULL);
- hw->cs_active = cs_active;
-}
-
-#define __SHIFT_OUT(bits) (SSP_OPCODE_SHIFT | SSP_OUT_MODE | \
- cs_en | clk | SSP_COUNT((bits) * 2 - 1))
-#define __SHIFT_IN(bits) (SSP_OPCODE_SHIFT | SSP_IN_MODE  | \
- cs_en | clk | SSP_COUNT((bits) * 2 - 1))
-
-static int ti_ssp_spi_setup_transfer(struct ti_ssp_spi *hw, u8 bpw, u8 mode)
-{
- int error, idx = 0;
- u32 seqram[16];
- u32 cs_en, cs_dis, clk;
- u32 topbits, botbits;
-
- mode &= MODE_BITS;
- if (mode == hw->mode && bpw == hw->bpw)
- return 0;
-
- cs_en  = (mode & SPI_CS_HIGH) ? SSP_CS_HIGH : SSP_CS_LOW;
- cs_dis = (mode & SPI_CS_HIGH) ? SSP_CS_LOW  : SSP_CS_HIGH;
- clk    = (mode & SPI_CPOL)    ? SSP_CLK_HIGH : SSP_CLK_LOW;
-
- /* Construct instructions */
-
- /* Disable Chip Select */
- hw->pc_dis = idx;
- seqram[idx++] = SSP_OPCODE_DIRECT | SSP_OUT_MODE | cs_dis | clk;
- seqram[idx++] = SSP_OPCODE_STOP   | SSP_OUT_MODE | cs_dis | clk;
-
- /* Enable Chip Select */
- hw->pc_en = idx;
- seqram[idx++] = SSP_OPCODE_DIRECT | SSP_OUT_MODE | cs_en | clk;
- seqram[idx++] = SSP_OPCODE_STOP   | SSP_OUT_MODE | cs_en | clk;
-
- /* Reads and writes need to be split for bpw > 16 */
- topbits = (bpw > 16) ? 16 : bpw;
- botbits = bpw - topbits;
-
- /* Write */
- hw->pc_wr = idx;
- seqram[idx++] = __SHIFT_OUT(topbits) | SSP_ADDR_REG;
- if (botbits)
- seqram[idx++] = __SHIFT_OUT(botbits)  | SSP_DATA_REG;
- seqram[idx++] = SSP_OPCODE_STOP | SSP_OUT_MODE | cs_en | clk;
-
- /* Read */
- hw->pc_rd = idx;
- if (botbits)
- seqram[idx++] = __SHIFT_IN(botbits) | SSP_ADDR_REG;
- seqram[idx++] = __SHIFT_IN(topbits) | SSP_DATA_REG;
- seqram[idx++] = SSP_OPCODE_STOP | SSP_OUT_MODE | cs_en | clk;
-
- error = ti_ssp_load(hw->dev, 0, seqram, idx);
- if (error < 0)
- return error;
-
- error = ti_ssp_set_mode(hw->dev, ((mode & SPI_CPHA) ?
-  0 : SSP_EARLY_DIN));
- if (error < 0)
- return error;
-
- hw->bpw = bpw;
- hw->mode = mode;
-
- return error;
-}
-
-static void ti_ssp_spi_work(struct work_struct *work)
-{
- struct ti_ssp_spi *hw = container_of(work, struct ti_ssp_spi, work);
-
- spin_lock(&hw->lock);
-
- while (!list_empty(&hw->msg_queue)) {
- struct spi_message *m;
- struct spi_device *spi;
- struct spi_transfer *t = NULL;
- int status = 0;
-
- m = container_of(hw->msg_queue.next, struct spi_message,
- queue);
-
- list_del_init(&m->queue);
-
- spin_unlock(&hw->lock);
-
- spi = m->spi;
-
- if (hw->select)
- hw->select(spi->chip_select);
-
- list_for_each_entry(t, &m->transfers, transfer_list) {
- int bpw = spi->bits_per_word;
- int xfer_status;
-
- if (t->bits_per_word)
- bpw = t->bits_per_word;
-
- if (ti_ssp_spi_setup_transfer(hw, bpw, spi->mode) < 0)
- break;
-
- ti_ssp_spi_chip_select(hw, 1);
-
- xfer_status = ti_ssp_spi_txrx(hw, m, t);
- if (xfer_status < 0)
- status = xfer_status;
-
- if (t->delay_usecs)
- udelay(t->delay_usecs);
-
- if (t->cs_change)
- ti_ssp_spi_chip_select(hw, 0);
- }
-
- ti_ssp_spi_chip_select(hw, 0);
- m->status = status;
- m->complete(m->context);
-
- spin_lock(&hw->lock);
- }
-
- if (hw->shutdown)
- complete(&hw->complete);
-
- spin_unlock(&hw->lock);
-}
-
-static int ti_ssp_spi_transfer(struct spi_device *spi, struct spi_message *m)
-{
- struct ti_ssp_spi *hw;
- struct spi_transfer *t;
- int error = 0;
-
- m->actual_length = 0;
- m->status = -EINPROGRESS;
-
- hw = spi_master_get_devdata(spi->master);
-
- if (list_empty(&m->transfers) || !m->complete)
- return -EINVAL;
-
- list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->len && !(t->rx_buf || t->tx_buf)) {
- dev_err(&spi->dev, "invalid xfer, no buffer\n");
- return -EINVAL;
- }
-
- if (t->len && t->rx_buf && t->tx_buf) {
- dev_err(&spi->dev, "invalid xfer, full duplex\n");
- return -EINVAL;
- }
- }
-
- spin_lock(&hw->lock);
- if (hw->shutdown) {
- error = -ESHUTDOWN;
- goto error_unlock;
- }
- list_add_tail(&m->queue, &hw->msg_queue);
- queue_work(hw->workqueue, &hw->work);
-error_unlock:
- spin_unlock(&hw->lock);
- return error;
-}
-
-static int ti_ssp_spi_probe(struct platform_device *pdev)
-{
- const struct ti_ssp_spi_data *pdata;
- struct ti_ssp_spi *hw;
- struct spi_master *master;
- struct device *dev = &pdev->dev;
- int error = 0;
-
- pdata = dev_get_platdata(dev);
- if (!pdata) {
- dev_err(dev, "platform data not found\n");
- return -EINVAL;
- }
-
- master = spi_alloc_master(dev, sizeof(struct ti_ssp_spi));
- if (!master) {
- dev_err(dev, "cannot allocate SPI master\n");
- return -ENOMEM;
- }
-
- hw = spi_master_get_devdata(master);
- platform_set_drvdata(pdev, hw);
-
- hw->master = master;
- hw->dev = dev;
- hw->select = pdata->select;
-
- spin_lock_init(&hw->lock);
- init_completion(&hw->complete);
- INIT_LIST_HEAD(&hw->msg_queue);
- INIT_WORK(&hw->work, ti_ssp_spi_work);
-
- hw->workqueue = create_singlethread_workqueue(dev_name(dev));
- if (!hw->workqueue) {
- error = -ENOMEM;
- dev_err(dev, "work queue creation failed\n");
- goto error_wq;
- }
-
- error = ti_ssp_set_iosel(hw->dev, pdata->iosel);
- if (error < 0) {
- dev_err(dev, "io setup failed\n");
- goto error_iosel;
- }
-
- master->bus_num = pdev->id;
- master->num_chipselect = pdata->num_cs;
- master->mode_bits = MODE_BITS;
- master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32);
- master->flags = SPI_MASTER_HALF_DUPLEX;
- master->transfer = ti_ssp_spi_transfer;
-
- error = spi_register_master(master);
- if (error) {
- dev_err(dev, "master registration failed\n");
- goto error_reg;
- }
-
- return 0;
-
-error_reg:
-error_iosel:
- destroy_workqueue(hw->workqueue);
-error_wq:
- spi_master_put(master);
- return error;
-}
-
-static int ti_ssp_spi_remove(struct platform_device *pdev)
-{
- struct ti_ssp_spi *hw = platform_get_drvdata(pdev);
- int error;
-
- hw->shutdown = 1;
- while (!list_empty(&hw->msg_queue)) {
- error = wait_for_completion_interruptible(&hw->complete);
- if (error < 0) {
- hw->shutdown = 0;
- return error;
- }
- }
- destroy_workqueue(hw->workqueue);
- spi_unregister_master(hw->master);
-
- return 0;
-}
-
-static struct platform_driver ti_ssp_spi_driver = {
- .probe = ti_ssp_spi_probe,
- .remove = ti_ssp_spi_remove,
- .driver = {
- .name = "ti-ssp-spi",
- .owner = THIS_MODULE,
- },
-};
-module_platform_driver(ti_ssp_spi_driver);
-
-MODULE_DESCRIPTION("SSP SPI Master");
-MODULE_AUTHOR("Cyril Chemparathy");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:ti-ssp-spi");
--
1.8.3.2

_______________________________________________
Davinci-linux-open-source mailing list
[hidden email]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PATCH 2/3] mfd: remove obsolete ti-ssp driver

Arnd Bergmann
In reply to this post by Arnd Bergmann
The tnetv107x platform is getting removed, so this driver
is not needed any more.

Signed-off-by: Arnd Bergmann <[hidden email]>
Acked-by: Sekhar Nori <[hidden email]>
Acked-by: Kevin Hilman <[hidden email]>
Cc: Samuel Ortiz <[hidden email]>
Cc: Lee Jones <[hidden email]>
---
 drivers/mfd/Kconfig  |  11 --
 drivers/mfd/Makefile |   1 -
 drivers/mfd/ti-ssp.c | 465 ---------------------------------------------------
 3 files changed, 477 deletions(-)
 delete mode 100644 drivers/mfd/ti-ssp.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 49bb445..e0f61e3 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -774,17 +774,6 @@ config MFD_PALMAS
   If you say yes here you get support for the Palmas
   series of PMIC chips from Texas Instruments.
 
-config MFD_TI_SSP
- tristate "TI Sequencer Serial Port support"
- depends on ARCH_DAVINCI_TNETV107X
- select MFD_CORE
- ---help---
-  Say Y here if you want support for the Sequencer Serial Port
-  in a Texas Instruments TNETV107X SoC.
-
-  To compile this driver as a module, choose M here: the
-  module will be called ti-ssp.
-
 config TPS6105X
  tristate "TI TPS61050/61052 Boost Converters"
  depends on I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 5aea5ef..40e2a6d 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -21,7 +21,6 @@ obj-$(CONFIG_HTC_I2CPLD) += htc-i2cpld.o
 
 obj-$(CONFIG_MFD_DAVINCI_VOICECODEC) += davinci_voicecodec.o
 obj-$(CONFIG_MFD_DM355EVM_MSP) += dm355evm_msp.o
-obj-$(CONFIG_MFD_TI_SSP) += ti-ssp.o
 obj-$(CONFIG_MFD_TI_AM335X_TSCADC) += ti_am335x_tscadc.o
 
 obj-$(CONFIG_MFD_STA2X11) += sta2x11-mfd.o
diff --git a/drivers/mfd/ti-ssp.c b/drivers/mfd/ti-ssp.c
deleted file mode 100644
index a542457..0000000
--- a/drivers/mfd/ti-ssp.c
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
- * Sequencer Serial Port (SSP) driver for Texas Instruments' SoCs
- *
- * Copyright (C) 2010 Texas Instruments Inc
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/err.h>
-#include <linux/init.h>
-#include <linux/wait.h>
-#include <linux/clk.h>
-#include <linux/interrupt.h>
-#include <linux/device.h>
-#include <linux/spinlock.h>
-#include <linux/platform_device.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/sched.h>
-#include <linux/mfd/core.h>
-#include <linux/mfd/ti_ssp.h>
-
-/* Register Offsets */
-#define REG_REV 0x00
-#define REG_IOSEL_1 0x04
-#define REG_IOSEL_2 0x08
-#define REG_PREDIV 0x0c
-#define REG_INTR_ST 0x10
-#define REG_INTR_EN 0x14
-#define REG_TEST_CTRL 0x18
-
-/* Per port registers */
-#define PORT_CFG_2 0x00
-#define PORT_ADDR 0x04
-#define PORT_DATA 0x08
-#define PORT_CFG_1 0x0c
-#define PORT_STATE 0x10
-
-#define SSP_PORT_CONFIG_MASK (SSP_EARLY_DIN | SSP_DELAY_DOUT)
-#define SSP_PORT_CLKRATE_MASK 0x0f
-
-#define SSP_SEQRAM_WR_EN BIT(4)
-#define SSP_SEQRAM_RD_EN BIT(5)
-#define SSP_START BIT(15)
-#define SSP_BUSY BIT(10)
-#define SSP_PORT_ASL BIT(7)
-#define SSP_PORT_CFO1 BIT(6)
-
-#define SSP_PORT_SEQRAM_SIZE 32
-
-static const int ssp_port_base[]   = {0x040, 0x080};
-static const int ssp_port_seqram[] = {0x100, 0x180};
-
-struct ti_ssp {
- struct resource *res;
- struct device *dev;
- void __iomem *regs;
- spinlock_t lock;
- struct clk *clk;
- int irq;
- wait_queue_head_t wqh;
-
- /*
- * Some of the iosel2 register bits always read-back as 0, we need to
- * remember these values so that we don't clobber previously set
- * values.
- */
- u32 iosel2;
-};
-
-static inline struct ti_ssp *dev_to_ssp(struct device *dev)
-{
- return dev_get_drvdata(dev->parent);
-}
-
-static inline int dev_to_port(struct device *dev)
-{
- return to_platform_device(dev)->id;
-}
-
-/* Register Access Helpers, rmw() functions need to run locked */
-static inline u32 ssp_read(struct ti_ssp *ssp, int reg)
-{
- return __raw_readl(ssp->regs + reg);
-}
-
-static inline void ssp_write(struct ti_ssp *ssp, int reg, u32 val)
-{
- __raw_writel(val, ssp->regs + reg);
-}
-
-static inline void ssp_rmw(struct ti_ssp *ssp, int reg, u32 mask, u32 bits)
-{
- ssp_write(ssp, reg, (ssp_read(ssp, reg) & ~mask) | bits);
-}
-
-static inline u32 ssp_port_read(struct ti_ssp *ssp, int port, int reg)
-{
- return ssp_read(ssp, ssp_port_base[port] + reg);
-}
-
-static inline void ssp_port_write(struct ti_ssp *ssp, int port, int reg,
-  u32 val)
-{
- ssp_write(ssp, ssp_port_base[port] + reg, val);
-}
-
-static inline void ssp_port_rmw(struct ti_ssp *ssp, int port, int reg,
- u32 mask, u32 bits)
-{
- ssp_rmw(ssp, ssp_port_base[port] + reg, mask, bits);
-}
-
-static inline void ssp_port_clr_bits(struct ti_ssp *ssp, int port, int reg,
-     u32 bits)
-{
- ssp_port_rmw(ssp, port, reg, bits, 0);
-}
-
-static inline void ssp_port_set_bits(struct ti_ssp *ssp, int port, int reg,
-     u32 bits)
-{
- ssp_port_rmw(ssp, port, reg, 0, bits);
-}
-
-/* Called to setup port clock mode, caller must hold ssp->lock */
-static int __set_mode(struct ti_ssp *ssp, int port, int mode)
-{
- mode &= SSP_PORT_CONFIG_MASK;
- ssp_port_rmw(ssp, port, PORT_CFG_1, SSP_PORT_CONFIG_MASK, mode);
-
- return 0;
-}
-
-int ti_ssp_set_mode(struct device *dev, int mode)
-{
- struct ti_ssp *ssp = dev_to_ssp(dev);
- int port = dev_to_port(dev);
- int ret;
-
- spin_lock(&ssp->lock);
- ret = __set_mode(ssp, port, mode);
- spin_unlock(&ssp->lock);
-
- return ret;
-}
-EXPORT_SYMBOL(ti_ssp_set_mode);
-
-/* Called to setup iosel2, caller must hold ssp->lock */
-static void __set_iosel2(struct ti_ssp *ssp, u32 mask, u32 val)
-{
- ssp->iosel2 = (ssp->iosel2 & ~mask) | val;
- ssp_write(ssp, REG_IOSEL_2, ssp->iosel2);
-}
-
-/* Called to setup port iosel, caller must hold ssp->lock */
-static void __set_iosel(struct ti_ssp *ssp, int port, u32 iosel)
-{
- unsigned val, shift = port ? 16 : 0;
-
- /* IOSEL1 gets the least significant 16 bits */
- val = ssp_read(ssp, REG_IOSEL_1);
- val &= 0xffff << (port ? 0 : 16);
- val |= (iosel & 0xffff) << (port ? 16 : 0);
- ssp_write(ssp, REG_IOSEL_1, val);
-
- /* IOSEL2 gets the most significant 16 bits */
- val = (iosel >> 16) & 0x7;
- __set_iosel2(ssp, 0x7 << shift, val << shift);
-}
-
-int ti_ssp_set_iosel(struct device *dev, u32 iosel)
-{
- struct ti_ssp *ssp = dev_to_ssp(dev);
- int port = dev_to_port(dev);
-
- spin_lock(&ssp->lock);
- __set_iosel(ssp, port, iosel);
- spin_unlock(&ssp->lock);
-
- return 0;
-}
-EXPORT_SYMBOL(ti_ssp_set_iosel);
-
-int ti_ssp_load(struct device *dev, int offs, u32* prog, int len)
-{
- struct ti_ssp *ssp = dev_to_ssp(dev);
- int port = dev_to_port(dev);
- int i;
-
- if (len > SSP_PORT_SEQRAM_SIZE)
- return -ENOSPC;
-
- spin_lock(&ssp->lock);
-
- /* Enable SeqRAM access */
- ssp_port_set_bits(ssp, port, PORT_CFG_2, SSP_SEQRAM_WR_EN);
-
- /* Copy code */
- for (i = 0; i < len; i++) {
- __raw_writel(prog[i], ssp->regs + offs + 4*i +
-     ssp_port_seqram[port]);
- }
-
- /* Disable SeqRAM access */
- ssp_port_clr_bits(ssp, port, PORT_CFG_2, SSP_SEQRAM_WR_EN);
-
- spin_unlock(&ssp->lock);
-
- return 0;
-}
-EXPORT_SYMBOL(ti_ssp_load);
-
-int ti_ssp_raw_read(struct device *dev)
-{
- struct ti_ssp *ssp = dev_to_ssp(dev);
- int port = dev_to_port(dev);
- int shift = port ? 27 : 11;
-
- return (ssp_read(ssp, REG_IOSEL_2) >> shift) & 0xf;
-}
-EXPORT_SYMBOL(ti_ssp_raw_read);
-
-int ti_ssp_raw_write(struct device *dev, u32 val)
-{
- struct ti_ssp *ssp = dev_to_ssp(dev);
- int port = dev_to_port(dev), shift;
-
- spin_lock(&ssp->lock);
-
- shift = port ? 22 : 6;
- val &= 0xf;
- __set_iosel2(ssp, 0xf << shift, val << shift);
-
- spin_unlock(&ssp->lock);
-
- return 0;
-}
-EXPORT_SYMBOL(ti_ssp_raw_write);
-
-static inline int __xfer_done(struct ti_ssp *ssp, int port)
-{
- return !(ssp_port_read(ssp, port, PORT_CFG_1) & SSP_BUSY);
-}
-
-int ti_ssp_run(struct device *dev, u32 pc, u32 input, u32 *output)
-{
- struct ti_ssp *ssp = dev_to_ssp(dev);
- int port = dev_to_port(dev);
- int ret;
-
- if (pc & ~(0x3f))
- return -EINVAL;
-
- /* Grab ssp->lock to serialize rmw on ssp registers */
- spin_lock(&ssp->lock);
-
- ssp_port_write(ssp, port, PORT_ADDR, input >> 16);
- ssp_port_write(ssp, port, PORT_DATA, input & 0xffff);
- ssp_port_rmw(ssp, port, PORT_CFG_1, 0x3f, pc);
-
- /* grab wait queue head lock to avoid race with the isr */
- spin_lock_irq(&ssp->wqh.lock);
-
- /* kick off sequence execution in hardware */
- ssp_port_set_bits(ssp, port, PORT_CFG_1, SSP_START);
-
- /* drop ssp lock; no register writes beyond this */
- spin_unlock(&ssp->lock);
-
- ret = wait_event_interruptible_locked_irq(ssp->wqh,
-  __xfer_done(ssp, port));
- spin_unlock_irq(&ssp->wqh.lock);
-
- if (ret < 0)
- return ret;
-
- if (output) {
- *output = (ssp_port_read(ssp, port, PORT_ADDR) << 16) |
-  (ssp_port_read(ssp, port, PORT_DATA) &  0xffff);
- }
-
- ret = ssp_port_read(ssp, port, PORT_STATE) & 0x3f; /* stop address */
-
- return ret;
-}
-EXPORT_SYMBOL(ti_ssp_run);
-
-static irqreturn_t ti_ssp_interrupt(int irq, void *dev_data)
-{
- struct ti_ssp *ssp = dev_data;
-
- spin_lock(&ssp->wqh.lock);
-
- ssp_write(ssp, REG_INTR_ST, 0x3);
- wake_up_locked(&ssp->wqh);
-
- spin_unlock(&ssp->wqh.lock);
-
- return IRQ_HANDLED;
-}
-
-static int ti_ssp_probe(struct platform_device *pdev)
-{
- static struct ti_ssp *ssp;
- const struct ti_ssp_data *pdata = dev_get_platdata(&pdev->dev);
- int error = 0, prediv = 0xff, id;
- unsigned long sysclk;
- struct device *dev = &pdev->dev;
- struct mfd_cell cells[2];
-
- ssp = kzalloc(sizeof(*ssp), GFP_KERNEL);
- if (!ssp) {
- dev_err(dev, "cannot allocate device info\n");
- return -ENOMEM;
- }
-
- ssp->dev = dev;
- dev_set_drvdata(dev, ssp);
-
- ssp->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!ssp->res) {
- error = -ENODEV;
- dev_err(dev, "cannot determine register area\n");
- goto error_res;
- }
-
- if (!request_mem_region(ssp->res->start, resource_size(ssp->res),
- pdev->name)) {
- error = -ENOMEM;
- dev_err(dev, "cannot claim register memory\n");
- goto error_res;
- }
-
- ssp->regs = ioremap(ssp->res->start, resource_size(ssp->res));
- if (!ssp->regs) {
- error = -ENOMEM;
- dev_err(dev, "cannot map register memory\n");
- goto error_map;
- }
-
- ssp->clk = clk_get(dev, NULL);
- if (IS_ERR(ssp->clk)) {
- error = PTR_ERR(ssp->clk);
- dev_err(dev, "cannot claim device clock\n");
- goto error_clk;
- }
-
- ssp->irq = platform_get_irq(pdev, 0);
- if (ssp->irq < 0) {
- error = -ENODEV;
- dev_err(dev, "unknown irq\n");
- goto error_irq;
- }
-
- error = request_threaded_irq(ssp->irq, NULL, ti_ssp_interrupt, 0,
-     dev_name(dev), ssp);
- if (error < 0) {
- dev_err(dev, "cannot acquire irq\n");
- goto error_irq;
- }
-
- spin_lock_init(&ssp->lock);
- init_waitqueue_head(&ssp->wqh);
-
- /* Power on and initialize SSP */
- error = clk_enable(ssp->clk);
- if (error) {
- dev_err(dev, "cannot enable device clock\n");
- goto error_enable;
- }
-
- /* Reset registers to a sensible known state */
- ssp_write(ssp, REG_IOSEL_1, 0);
- ssp_write(ssp, REG_IOSEL_2, 0);
- ssp_write(ssp, REG_INTR_EN, 0x3);
- ssp_write(ssp, REG_INTR_ST, 0x3);
- ssp_write(ssp, REG_TEST_CTRL, 0);
- ssp_port_write(ssp, 0, PORT_CFG_1, SSP_PORT_ASL);
- ssp_port_write(ssp, 1, PORT_CFG_1, SSP_PORT_ASL);
- ssp_port_write(ssp, 0, PORT_CFG_2, SSP_PORT_CFO1);
- ssp_port_write(ssp, 1, PORT_CFG_2, SSP_PORT_CFO1);
-
- sysclk = clk_get_rate(ssp->clk);
- if (pdata && pdata->out_clock)
- prediv = (sysclk / pdata->out_clock) - 1;
- prediv = clamp(prediv, 0, 0xff);
- ssp_rmw(ssp, REG_PREDIV, 0xff, prediv);
-
- memset(cells, 0, sizeof(cells));
- for (id = 0; id < 2; id++) {
- const struct ti_ssp_dev_data *data = &pdata->dev_data[id];
-
- cells[id].id = id;
- cells[id].name = data->dev_name;
- cells[id].platform_data = data->pdata;
- }
-
- error = mfd_add_devices(dev, 0, cells, 2, NULL, 0, NULL);
- if (error < 0) {
- dev_err(dev, "cannot add mfd cells\n");
- goto error_enable;
- }
-
- return 0;
-
-error_enable:
- free_irq(ssp->irq, ssp);
-error_irq:
- clk_put(ssp->clk);
-error_clk:
- iounmap(ssp->regs);
-error_map:
- release_mem_region(ssp->res->start, resource_size(ssp->res));
-error_res:
- kfree(ssp);
- return error;
-}
-
-static int ti_ssp_remove(struct platform_device *pdev)
-{
- struct device *dev = &pdev->dev;
- struct ti_ssp *ssp = dev_get_drvdata(dev);
-
- mfd_remove_devices(dev);
- clk_disable(ssp->clk);
- free_irq(ssp->irq, ssp);
- clk_put(ssp->clk);
- iounmap(ssp->regs);
- release_mem_region(ssp->res->start, resource_size(ssp->res));
- kfree(ssp);
- return 0;
-}
-
-static struct platform_driver ti_ssp_driver = {
- .probe = ti_ssp_probe,
- .remove = ti_ssp_remove,
- .driver = {
- .name = "ti-ssp",
- .owner = THIS_MODULE,
- }
-};
-
-module_platform_driver(ti_ssp_driver);
-
-MODULE_DESCRIPTION("Sequencer Serial Port (SSP) Driver");
-MODULE_AUTHOR("Cyril Chemparathy");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:ti-ssp");
--
1.8.3.2

_______________________________________________
Davinci-linux-open-source mailing list
[hidden email]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PATCH 3/3] input: remove obsolete tnetv107x drivers

Arnd Bergmann
In reply to this post by Arnd Bergmann
The tnetv107x platform is getting removed, so the touchscreen
and keypad drivers for this platform will no longer be needed
either.

Signed-off-by: Arnd Bergmann <[hidden email]>
Acked-by: Sekhar Nori <[hidden email]>
Acked-by: Kevin Hilman <[hidden email]>
Cc: Dmitry Torokhov <[hidden email]>
Cc: [hidden email]
---
 drivers/input/keyboard/Kconfig            |  10 -
 drivers/input/keyboard/Makefile           |   1 -
 drivers/input/keyboard/tnetv107x-keypad.c | 329 -------------------------
 drivers/input/touchscreen/Kconfig         |   9 -
 drivers/input/touchscreen/Makefile        |   1 -
 drivers/input/touchscreen/tnetv107x-ts.c  | 384 ------------------------------
 6 files changed, 734 deletions(-)
 delete mode 100644 drivers/input/keyboard/tnetv107x-keypad.c
 delete mode 100644 drivers/input/touchscreen/tnetv107x-ts.c

diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index a673c9f..935dcaf 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -595,16 +595,6 @@ config KEYBOARD_TC3589X
   To compile this driver as a module, choose M here: the
   module will be called tc3589x-keypad.
 
-config KEYBOARD_TNETV107X
- tristate "TI TNETV107X keypad support"
- depends on ARCH_DAVINCI_TNETV107X
- select INPUT_MATRIXKMAP
- help
-  Say Y here if you want to use the TNETV107X keypad.
-
-  To compile this driver as a module, choose M here: the
-  module will be called tnetv107x-keypad.
-
 config KEYBOARD_TWL4030
  tristate "TI TWL4030/TWL5030/TPS659x0 keypad support"
  depends on TWL4030_CORE
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
index a699b61..81014d9 100644
--- a/drivers/input/keyboard/Makefile
+++ b/drivers/input/keyboard/Makefile
@@ -53,7 +53,6 @@ obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o
 obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o
 obj-$(CONFIG_KEYBOARD_TC3589X) += tc3589x-keypad.o
 obj-$(CONFIG_KEYBOARD_TEGRA) += tegra-kbc.o
-obj-$(CONFIG_KEYBOARD_TNETV107X) += tnetv107x-keypad.o
 obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o
 obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o
 obj-$(CONFIG_KEYBOARD_W90P910) += w90p910_keypad.o
diff --git a/drivers/input/keyboard/tnetv107x-keypad.c b/drivers/input/keyboard/tnetv107x-keypad.c
deleted file mode 100644
index 086511c..0000000
--- a/drivers/input/keyboard/tnetv107x-keypad.c
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Texas Instruments TNETV107X Keypad Driver
- *
- * Copyright (C) 2010 Texas Instruments
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation version 2.
- *
- * This program is distributed "as is" WITHOUT ANY WARRANTY of any
- * kind, whether express or implied; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <linux/kernel.h>
-#include <linux/err.h>
-#include <linux/errno.h>
-#include <linux/input.h>
-#include <linux/platform_device.h>
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/clk.h>
-#include <linux/input/matrix_keypad.h>
-#include <linux/module.h>
-
-#define BITS(x) (BIT(x) - 1)
-
-#define KEYPAD_ROWS 9
-#define KEYPAD_COLS 9
-
-#define DEBOUNCE_MIN 0x400ul
-#define DEBOUNCE_MAX 0x3ffffffful
-
-struct keypad_regs {
- u32 rev;
- u32 mode;
- u32 mask;
- u32 pol;
- u32 dclock;
- u32 rclock;
- u32 stable_cnt;
- u32 in_en;
- u32 out;
- u32 out_en;
- u32 in;
- u32 lock;
- u32 pres[3];
-};
-
-#define keypad_read(kp, reg) __raw_readl(&(kp)->regs->reg)
-#define keypad_write(kp, reg, val) __raw_writel(val, &(kp)->regs->reg)
-
-struct keypad_data {
- struct input_dev *input_dev;
- struct resource *res;
- struct keypad_regs __iomem *regs;
- struct clk *clk;
- struct device *dev;
- spinlock_t lock;
- int irq_press;
- int irq_release;
- int rows, cols, row_shift;
- int debounce_ms, active_low;
- u32 prev_keys[3];
- unsigned short keycodes[];
-};
-
-static irqreturn_t keypad_irq(int irq, void *data)
-{
- struct keypad_data *kp = data;
- int i, bit, val, row, col, code;
- unsigned long flags;
- u32 curr_keys[3];
- u32 change;
-
- spin_lock_irqsave(&kp->lock, flags);
-
- memset(curr_keys, 0, sizeof(curr_keys));
- if (irq == kp->irq_press)
- for (i = 0; i < 3; i++)
- curr_keys[i] = keypad_read(kp, pres[i]);
-
- for (i = 0; i < 3; i++) {
- change = curr_keys[i] ^ kp->prev_keys[i];
-
- while (change) {
- bit     = fls(change) - 1;
- change ^= BIT(bit);
- val     = curr_keys[i] & BIT(bit);
- bit    += i * 32;
- row     = bit / KEYPAD_COLS;
- col     = bit % KEYPAD_COLS;
-
- code = MATRIX_SCAN_CODE(row, col, kp->row_shift);
- input_event(kp->input_dev, EV_MSC, MSC_SCAN, code);
- input_report_key(kp->input_dev, kp->keycodes[code],
- val);
- }
- }
- input_sync(kp->input_dev);
- memcpy(kp->prev_keys, curr_keys, sizeof(curr_keys));
-
- if (irq == kp->irq_press)
- keypad_write(kp, lock, 0); /* Allow hardware updates */
-
- spin_unlock_irqrestore(&kp->lock, flags);
-
- return IRQ_HANDLED;
-}
-
-static int keypad_start(struct input_dev *dev)
-{
- struct keypad_data *kp = input_get_drvdata(dev);
- unsigned long mask, debounce, clk_rate_khz;
- unsigned long flags;
-
- clk_enable(kp->clk);
- clk_rate_khz = clk_get_rate(kp->clk) / 1000;
-
- spin_lock_irqsave(&kp->lock, flags);
-
- /* Initialize device registers */
- keypad_write(kp, mode, 0);
-
- mask  = BITS(kp->rows) << KEYPAD_COLS;
- mask |= BITS(kp->cols);
- keypad_write(kp, mask, ~mask);
-
- keypad_write(kp, pol, kp->active_low ? 0 : 0x3ffff);
- keypad_write(kp, stable_cnt, 3);
-
- debounce = kp->debounce_ms * clk_rate_khz;
- debounce = clamp(debounce, DEBOUNCE_MIN, DEBOUNCE_MAX);
- keypad_write(kp, dclock, debounce);
- keypad_write(kp, rclock, 4 * debounce);
-
- keypad_write(kp, in_en, 1);
-
- spin_unlock_irqrestore(&kp->lock, flags);
-
- return 0;
-}
-
-static void keypad_stop(struct input_dev *dev)
-{
- struct keypad_data *kp = input_get_drvdata(dev);
-
- synchronize_irq(kp->irq_press);
- synchronize_irq(kp->irq_release);
- clk_disable(kp->clk);
-}
-
-static int keypad_probe(struct platform_device *pdev)
-{
- const struct matrix_keypad_platform_data *pdata;
- const struct matrix_keymap_data *keymap_data;
- struct device *dev = &pdev->dev;
- struct keypad_data *kp;
- int error = 0, sz, row_shift;
- u32 rev = 0;
-
- pdata = dev_get_platdata(&pdev->dev);
- if (!pdata) {
- dev_err(dev, "cannot find device data\n");
- return -EINVAL;
- }
-
- keymap_data = pdata->keymap_data;
- if (!keymap_data) {
- dev_err(dev, "cannot find keymap data\n");
- return -EINVAL;
- }
-
- row_shift = get_count_order(pdata->num_col_gpios);
- sz  = offsetof(struct keypad_data, keycodes);
- sz += (pdata->num_row_gpios << row_shift) * sizeof(kp->keycodes[0]);
- kp = kzalloc(sz, GFP_KERNEL);
- if (!kp) {
- dev_err(dev, "cannot allocate device info\n");
- return -ENOMEM;
- }
-
- kp->dev  = dev;
- kp->rows = pdata->num_row_gpios;
- kp->cols = pdata->num_col_gpios;
- kp->row_shift = row_shift;
- platform_set_drvdata(pdev, kp);
- spin_lock_init(&kp->lock);
-
- kp->irq_press   = platform_get_irq_byname(pdev, "press");
- kp->irq_release = platform_get_irq_byname(pdev, "release");
- if (kp->irq_press < 0 || kp->irq_release < 0) {
- dev_err(dev, "cannot determine device interrupts\n");
- error = -ENODEV;
- goto error_res;
- }
-
- kp->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!kp->res) {
- dev_err(dev, "cannot determine register area\n");
- error = -ENODEV;
- goto error_res;
- }
-
- if (!request_mem_region(kp->res->start, resource_size(kp->res),
- pdev->name)) {
- dev_err(dev, "cannot claim register memory\n");
- kp->res = NULL;
- error = -EINVAL;
- goto error_res;
- }
-
- kp->regs = ioremap(kp->res->start, resource_size(kp->res));
- if (!kp->regs) {
- dev_err(dev, "cannot map register memory\n");
- error = -ENOMEM;
- goto error_map;
- }
-
- kp->clk = clk_get(dev, NULL);
- if (IS_ERR(kp->clk)) {
- dev_err(dev, "cannot claim device clock\n");
- error = PTR_ERR(kp->clk);
- goto error_clk;
- }
-
- error = request_threaded_irq(kp->irq_press, NULL, keypad_irq,
-     IRQF_ONESHOT, dev_name(dev), kp);
- if (error < 0) {
- dev_err(kp->dev, "Could not allocate keypad press key irq\n");
- goto error_irq_press;
- }
-
- error = request_threaded_irq(kp->irq_release, NULL, keypad_irq,
-     IRQF_ONESHOT, dev_name(dev), kp);
- if (error < 0) {
- dev_err(kp->dev, "Could not allocate keypad release key irq\n");
- goto error_irq_release;
- }
-
- kp->input_dev = input_allocate_device();
- if (!kp->input_dev) {
- dev_err(dev, "cannot allocate input device\n");
- error = -ENOMEM;
- goto error_input;
- }
-
- kp->input_dev->name  = pdev->name;
- kp->input_dev->dev.parent = &pdev->dev;
- kp->input_dev->open  = keypad_start;
- kp->input_dev->close  = keypad_stop;
-
- clk_enable(kp->clk);
- rev = keypad_read(kp, rev);
- kp->input_dev->id.bustype = BUS_HOST;
- kp->input_dev->id.product = ((rev >>  8) & 0x07);
- kp->input_dev->id.version = ((rev >> 16) & 0xfff);
- clk_disable(kp->clk);
-
- error = matrix_keypad_build_keymap(keymap_data, NULL,
-   kp->rows, kp->cols,
-   kp->keycodes, kp->input_dev);
- if (error) {
- dev_err(dev, "Failed to build keymap\n");
- goto error_reg;
- }
-
- if (!pdata->no_autorepeat)
- kp->input_dev->evbit[0] |= BIT_MASK(EV_REP);
- input_set_capability(kp->input_dev, EV_MSC, MSC_SCAN);
-
- input_set_drvdata(kp->input_dev, kp);
-
- error = input_register_device(kp->input_dev);
- if (error < 0) {
- dev_err(dev, "Could not register input device\n");
- goto error_reg;
- }
-
- return 0;
-
-
-error_reg:
- input_free_device(kp->input_dev);
-error_input:
- free_irq(kp->irq_release, kp);
-error_irq_release:
- free_irq(kp->irq_press, kp);
-error_irq_press:
- clk_put(kp->clk);
-error_clk:
- iounmap(kp->regs);
-error_map:
- release_mem_region(kp->res->start, resource_size(kp->res));
-error_res:
- kfree(kp);
- return error;
-}
-
-static int keypad_remove(struct platform_device *pdev)
-{
- struct keypad_data *kp = platform_get_drvdata(pdev);
-
- free_irq(kp->irq_press, kp);
- free_irq(kp->irq_release, kp);
- input_unregister_device(kp->input_dev);
- clk_put(kp->clk);
- iounmap(kp->regs);
- release_mem_region(kp->res->start, resource_size(kp->res));
- kfree(kp);
-
- return 0;
-}
-
-static struct platform_driver keypad_driver = {
- .probe = keypad_probe,
- .remove = keypad_remove,
- .driver.name = "tnetv107x-keypad",
- .driver.owner = THIS_MODULE,
-};
-module_platform_driver(keypad_driver);
-
-MODULE_AUTHOR("Cyril Chemparathy");
-MODULE_DESCRIPTION("TNETV107X Keypad Driver");
-MODULE_ALIAS("platform:tnetv107x-keypad");
-MODULE_LICENSE("GPL");
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 07e9e82..68edc9d 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -514,15 +514,6 @@ config TOUCHSCREEN_MIGOR
   To compile this driver as a module, choose M here: the
   module will be called migor_ts.
 
-config TOUCHSCREEN_TNETV107X
- tristate "TI TNETV107X touchscreen support"
- depends on ARCH_DAVINCI_TNETV107X
- help
-  Say Y here if you want to use the TNETV107X touchscreen.
-
-  To compile this driver as a module, choose M here: the
-  module will be called tnetv107x-ts.
-
 config TOUCHSCREEN_TOUCHRIGHT
  tristate "Touchright serial touchscreen"
  select SERIO
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
index 62801f2..4bc954b 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -56,7 +56,6 @@ obj-$(CONFIG_TOUCHSCREEN_ST1232) += st1232.o
 obj-$(CONFIG_TOUCHSCREEN_STMPE) += stmpe-ts.o
 obj-$(CONFIG_TOUCHSCREEN_SUR40) += sur40.o
 obj-$(CONFIG_TOUCHSCREEN_TI_AM335X_TSC) += ti_am335x_tsc.o
-obj-$(CONFIG_TOUCHSCREEN_TNETV107X) += tnetv107x-ts.o
 obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o
 obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o
 obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o
diff --git a/drivers/input/touchscreen/tnetv107x-ts.c b/drivers/input/touchscreen/tnetv107x-ts.c
deleted file mode 100644
index c47827a..0000000
--- a/drivers/input/touchscreen/tnetv107x-ts.c
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * Texas Instruments TNETV107X Touchscreen Driver
- *
- * Copyright (C) 2010 Texas Instruments
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation version 2.
- *
- * This program is distributed "as is" WITHOUT ANY WARRANTY of any
- * kind, whether express or implied; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/err.h>
-#include <linux/errno.h>
-#include <linux/input.h>
-#include <linux/platform_device.h>
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-#include <linux/delay.h>
-#include <linux/ctype.h>
-#include <linux/io.h>
-#include <linux/clk.h>
-
-#include <mach/tnetv107x.h>
-
-#define TSC_PENUP_POLL (HZ / 5)
-#define IDLE_TIMEOUT 100 /* msec */
-
-/*
- * The first and last samples of a touch interval are usually garbage and need
- * to be filtered out with these devices.  The following definitions control
- * the number of samples skipped.
- */
-#define TSC_HEAD_SKIP 1
-#define TSC_TAIL_SKIP 1
-#define TSC_SKIP (TSC_HEAD_SKIP + TSC_TAIL_SKIP + 1)
-#define TSC_SAMPLES (TSC_SKIP + 1)
-
-/* Register Offsets */
-struct tsc_regs {
- u32 rev;
- u32 tscm;
- u32 bwcm;
- u32 swc;
- u32 adcchnl;
- u32 adcdata;
- u32 chval[4];
-};
-
-/* TSC Mode Configuration Register (tscm) bits */
-#define WMODE BIT(0)
-#define TSKIND BIT(1)
-#define ZMEASURE_EN BIT(2)
-#define IDLE BIT(3)
-#define TSC_EN BIT(4)
-#define STOP BIT(5)
-#define ONE_SHOT BIT(6)
-#define SINGLE BIT(7)
-#define AVG BIT(8)
-#define AVGNUM(x) (((x) & 0x03) <<  9)
-#define PVSTC(x) (((x) & 0x07) << 11)
-#define PON BIT(14)
-#define PONBG BIT(15)
-#define AFERST BIT(16)
-
-/* ADC DATA Capture Register bits */
-#define DATA_VALID BIT(16)
-
-/* Register Access Macros */
-#define tsc_read(ts, reg) __raw_readl(&(ts)->regs->reg)
-#define tsc_write(ts, reg, val) __raw_writel(val, &(ts)->regs->reg);
-#define tsc_set_bits(ts, reg, val) \
- tsc_write(ts, reg, tsc_read(ts, reg) | (val))
-#define tsc_clr_bits(ts, reg, val) \
- tsc_write(ts, reg, tsc_read(ts, reg) & ~(val))
-
-struct sample {
- int x, y, p;
-};
-
-struct tsc_data {
- struct input_dev *input_dev;
- struct resource *res;
- struct tsc_regs __iomem *regs;
- struct timer_list timer;
- spinlock_t lock;
- struct clk *clk;
- struct device *dev;
- int sample_count;
- struct sample samples[TSC_SAMPLES];
- int tsc_irq;
-};
-
-static int tsc_read_sample(struct tsc_data *ts, struct sample* sample)
-{
- int x, y, z1, z2, t, p = 0;
- u32 val;
-
- val = tsc_read(ts, chval[0]);
- if (val & DATA_VALID)
- x = val & 0xffff;
- else
- return -EINVAL;
-
- y  = tsc_read(ts, chval[1]) & 0xffff;
- z1 = tsc_read(ts, chval[2]) & 0xffff;
- z2 = tsc_read(ts, chval[3]) & 0xffff;
-
- if (z1) {
- t = ((600 * x) * (z2 - z1));
- p = t / (u32) (z1 << 12);
- if (p < 0)
- p = 0;
- }
-
- sample->x  = x;
- sample->y  = y;
- sample->p  = p;
-
- return 0;
-}
-
-static void tsc_poll(unsigned long data)
-{
- struct tsc_data *ts = (struct tsc_data *)data;
- unsigned long flags;
- int i, val, x, y, p;
-
- spin_lock_irqsave(&ts->lock, flags);
-
- if (ts->sample_count >= TSC_SKIP) {
- input_report_abs(ts->input_dev, ABS_PRESSURE, 0);
- input_report_key(ts->input_dev, BTN_TOUCH, 0);
- input_sync(ts->input_dev);
- } else if (ts->sample_count > 0) {
- /*
- * A touch event lasted less than our skip count.  Salvage and
- * report anyway.
- */
- for (i = 0, val = 0; i < ts->sample_count; i++)
- val += ts->samples[i].x;
- x = val / ts->sample_count;
-
- for (i = 0, val = 0; i < ts->sample_count; i++)
- val += ts->samples[i].y;
- y = val / ts->sample_count;
-
- for (i = 0, val = 0; i < ts->sample_count; i++)
- val += ts->samples[i].p;
- p = val / ts->sample_count;
-
- input_report_abs(ts->input_dev, ABS_X, x);
- input_report_abs(ts->input_dev, ABS_Y, y);
- input_report_abs(ts->input_dev, ABS_PRESSURE, p);
- input_report_key(ts->input_dev, BTN_TOUCH, 1);
- input_sync(ts->input_dev);
- }
-
- ts->sample_count = 0;
-
- spin_unlock_irqrestore(&ts->lock, flags);
-}
-
-static irqreturn_t tsc_irq(int irq, void *dev_id)
-{
- struct tsc_data *ts = (struct tsc_data *)dev_id;
- struct sample *sample;
- int index;
-
- spin_lock(&ts->lock);
-
- index = ts->sample_count % TSC_SAMPLES;
- sample = &ts->samples[index];
- if (tsc_read_sample(ts, sample) < 0)
- goto out;
-
- if (++ts->sample_count >= TSC_SKIP) {
- index = (ts->sample_count - TSC_TAIL_SKIP - 1) % TSC_SAMPLES;
- sample = &ts->samples[index];
-
- input_report_abs(ts->input_dev, ABS_X, sample->x);
- input_report_abs(ts->input_dev, ABS_Y, sample->y);
- input_report_abs(ts->input_dev, ABS_PRESSURE, sample->p);
- if (ts->sample_count == TSC_SKIP)
- input_report_key(ts->input_dev, BTN_TOUCH, 1);
- input_sync(ts->input_dev);
- }
- mod_timer(&ts->timer, jiffies + TSC_PENUP_POLL);
-out:
- spin_unlock(&ts->lock);
- return IRQ_HANDLED;
-}
-
-static int tsc_start(struct input_dev *dev)
-{
- struct tsc_data *ts = input_get_drvdata(dev);
- unsigned long timeout = jiffies + msecs_to_jiffies(IDLE_TIMEOUT);
- u32 val;
-
- clk_enable(ts->clk);
-
- /* Go to idle mode, before any initialization */
- while (time_after(timeout, jiffies)) {
- if (tsc_read(ts, tscm) & IDLE)
- break;
- }
-
- if (time_before(timeout, jiffies)) {
- dev_warn(ts->dev, "timeout waiting for idle\n");
- clk_disable(ts->clk);
- return -EIO;
- }
-
- /* Configure TSC Control register*/
- val = (PONBG | PON | PVSTC(4) | ONE_SHOT | ZMEASURE_EN);
- tsc_write(ts, tscm, val);
-
- /* Bring TSC out of reset: Clear AFE reset bit */
- val &= ~(AFERST);
- tsc_write(ts, tscm, val);
-
- /* Configure all pins for hardware control*/
- tsc_write(ts, bwcm, 0);
-
- /* Finally enable the TSC */
- tsc_set_bits(ts, tscm, TSC_EN);
-
- return 0;
-}
-
-static void tsc_stop(struct input_dev *dev)
-{
- struct tsc_data *ts = input_get_drvdata(dev);
-
- tsc_clr_bits(ts, tscm, TSC_EN);
- synchronize_irq(ts->tsc_irq);
- del_timer_sync(&ts->timer);
- clk_disable(ts->clk);
-}
-
-static int tsc_probe(struct platform_device *pdev)
-{
- struct device *dev = &pdev->dev;
- struct tsc_data *ts;
- int error = 0;
- u32 rev = 0;
-
- ts = kzalloc(sizeof(struct tsc_data), GFP_KERNEL);
- if (!ts) {
- dev_err(dev, "cannot allocate device info\n");
- return -ENOMEM;
- }
-
- ts->dev = dev;
- spin_lock_init(&ts->lock);
- setup_timer(&ts->timer, tsc_poll, (unsigned long)ts);
- platform_set_drvdata(pdev, ts);
-
- ts->tsc_irq = platform_get_irq(pdev, 0);
- if (ts->tsc_irq < 0) {
- dev_err(dev, "cannot determine device interrupt\n");
- error = -ENODEV;
- goto error_res;
- }
-
- ts->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!ts->res) {
- dev_err(dev, "cannot determine register area\n");
- error = -ENODEV;
- goto error_res;
- }
-
- if (!request_mem_region(ts->res->start, resource_size(ts->res),
- pdev->name)) {
- dev_err(dev, "cannot claim register memory\n");
- ts->res = NULL;
- error = -EINVAL;
- goto error_res;
- }
-
- ts->regs = ioremap(ts->res->start, resource_size(ts->res));
- if (!ts->regs) {
- dev_err(dev, "cannot map register memory\n");
- error = -ENOMEM;
- goto error_map;
- }
-
- ts->clk = clk_get(dev, NULL);
- if (IS_ERR(ts->clk)) {
- dev_err(dev, "cannot claim device clock\n");
- error = PTR_ERR(ts->clk);
- goto error_clk;
- }
-
- error = request_threaded_irq(ts->tsc_irq, NULL, tsc_irq, IRQF_ONESHOT,
-     dev_name(dev), ts);
- if (error < 0) {
- dev_err(ts->dev, "Could not allocate ts irq\n");
- goto error_irq;
- }
-
- ts->input_dev = input_allocate_device();
- if (!ts->input_dev) {
- dev_err(dev, "cannot allocate input device\n");
- error = -ENOMEM;
- goto error_input;
- }
- input_set_drvdata(ts->input_dev, ts);
-
- ts->input_dev->name       = pdev->name;
- ts->input_dev->id.bustype = BUS_HOST;
- ts->input_dev->dev.parent = &pdev->dev;
- ts->input_dev->open  = tsc_start;
- ts->input_dev->close  = tsc_stop;
-
- clk_enable(ts->clk);
- rev = tsc_read(ts, rev);
- ts->input_dev->id.product = ((rev >>  8) & 0x07);
- ts->input_dev->id.version = ((rev >> 16) & 0xfff);
- clk_disable(ts->clk);
-
- __set_bit(EV_KEY,    ts->input_dev->evbit);
- __set_bit(EV_ABS,    ts->input_dev->evbit);
- __set_bit(BTN_TOUCH, ts->input_dev->keybit);
-
- input_set_abs_params(ts->input_dev, ABS_X, 0, 0xffff, 5, 0);
- input_set_abs_params(ts->input_dev, ABS_Y, 0, 0xffff, 5, 0);
- input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 4095, 128, 0);
-
- error = input_register_device(ts->input_dev);
- if (error < 0) {
- dev_err(dev, "failed input device registration\n");
- goto error_reg;
- }
-
- return 0;
-
-error_reg:
- input_free_device(ts->input_dev);
-error_input:
- free_irq(ts->tsc_irq, ts);
-error_irq:
- clk_put(ts->clk);
-error_clk:
- iounmap(ts->regs);
-error_map:
- release_mem_region(ts->res->start, resource_size(ts->res));
-error_res:
- kfree(ts);
-
- return error;
-}
-
-static int tsc_remove(struct platform_device *pdev)
-{
- struct tsc_data *ts = platform_get_drvdata(pdev);
-
- input_unregister_device(ts->input_dev);
- free_irq(ts->tsc_irq, ts);
- clk_put(ts->clk);
- iounmap(ts->regs);
- release_mem_region(ts->res->start, resource_size(ts->res));
- kfree(ts);
-
- return 0;
-}
-
-static struct platform_driver tsc_driver = {
- .probe = tsc_probe,
- .remove = tsc_remove,
- .driver.name = "tnetv107x-ts",
- .driver.owner = THIS_MODULE,
-};
-module_platform_driver(tsc_driver);
-
-MODULE_AUTHOR("Cyril Chemparathy");
-MODULE_DESCRIPTION("TNETV107X Touchscreen Driver");
-MODULE_ALIAS("platform:tnetv107x-ts");
-MODULE_LICENSE("GPL");
--
1.8.3.2

_______________________________________________
Davinci-linux-open-source mailing list
[hidden email]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: [PATCH 1/3] spi: remove obsolete spi-ti-ssp driver

Mark Brown
In reply to this post by Arnd Bergmann
On Tue, Mar 18, 2014 at 03:55:59PM +0100, Arnd Bergmann wrote:
> The tnetv107x platform is getting removed, so this driver
> will not be needed any more.

Applied, thanks.

_______________________________________________
Davinci-linux-open-source mailing list
[hidden email]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

signature.asc (853 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: [PATCH 2/3] mfd: remove obsolete ti-ssp driver

Lee Jones
In reply to this post by Arnd Bergmann
> The tnetv107x platform is getting removed, so this driver
> is not needed any more.
>
> Signed-off-by: Arnd Bergmann <[hidden email]>
> Acked-by: Sekhar Nori <[hidden email]>
> Acked-by: Kevin Hilman <[hidden email]>
> Cc: Samuel Ortiz <[hidden email]>
> Cc: Lee Jones <[hidden email]>
> ---
>  drivers/mfd/Kconfig  |  11 --
>  drivers/mfd/Makefile |   1 -
>  drivers/mfd/ti-ssp.c | 465 ---------------------------------------------------
>  3 files changed, 477 deletions(-)
>  delete mode 100644 drivers/mfd/ti-ssp.c

Re-applied, thanks.

--
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
_______________________________________________
Davinci-linux-open-source mailing list
[hidden email]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: [PATCH 3/3] input: remove obsolete tnetv107x drivers

Dmitry Torokhov
In reply to this post by Arnd Bergmann
On Tue, Mar 18, 2014 at 03:56:01PM +0100, Arnd Bergmann wrote:
> The tnetv107x platform is getting removed, so the touchscreen
> and keypad drivers for this platform will no longer be needed
> either.
>
> Signed-off-by: Arnd Bergmann <[hidden email]>
> Acked-by: Sekhar Nori <[hidden email]>
> Acked-by: Kevin Hilman <[hidden email]>
> Cc: Dmitry Torokhov <[hidden email]>
> Cc: [hidden email]

Applied, thank you.

> ---
>  drivers/input/keyboard/Kconfig            |  10 -
>  drivers/input/keyboard/Makefile           |   1 -
>  drivers/input/keyboard/tnetv107x-keypad.c | 329 -------------------------
>  drivers/input/touchscreen/Kconfig         |   9 -
>  drivers/input/touchscreen/Makefile        |   1 -
>  drivers/input/touchscreen/tnetv107x-ts.c  | 384 ------------------------------
>  6 files changed, 734 deletions(-)
>  delete mode 100644 drivers/input/keyboard/tnetv107x-keypad.c
>  delete mode 100644 drivers/input/touchscreen/tnetv107x-ts.c
>
> diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
> index a673c9f..935dcaf 100644
> --- a/drivers/input/keyboard/Kconfig
> +++ b/drivers/input/keyboard/Kconfig
> @@ -595,16 +595,6 @@ config KEYBOARD_TC3589X
>    To compile this driver as a module, choose M here: the
>    module will be called tc3589x-keypad.
>  
> -config KEYBOARD_TNETV107X
> - tristate "TI TNETV107X keypad support"
> - depends on ARCH_DAVINCI_TNETV107X
> - select INPUT_MATRIXKMAP
> - help
> -  Say Y here if you want to use the TNETV107X keypad.
> -
> -  To compile this driver as a module, choose M here: the
> -  module will be called tnetv107x-keypad.
> -
>  config KEYBOARD_TWL4030
>   tristate "TI TWL4030/TWL5030/TPS659x0 keypad support"
>   depends on TWL4030_CORE
> diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
> index a699b61..81014d9 100644
> --- a/drivers/input/keyboard/Makefile
> +++ b/drivers/input/keyboard/Makefile
> @@ -53,7 +53,6 @@ obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o
>  obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o
>  obj-$(CONFIG_KEYBOARD_TC3589X) += tc3589x-keypad.o
>  obj-$(CONFIG_KEYBOARD_TEGRA) += tegra-kbc.o
> -obj-$(CONFIG_KEYBOARD_TNETV107X) += tnetv107x-keypad.o
>  obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o
>  obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o
>  obj-$(CONFIG_KEYBOARD_W90P910) += w90p910_keypad.o
> diff --git a/drivers/input/keyboard/tnetv107x-keypad.c b/drivers/input/keyboard/tnetv107x-keypad.c
> deleted file mode 100644
> index 086511c..0000000
> --- a/drivers/input/keyboard/tnetv107x-keypad.c
> +++ /dev/null
> @@ -1,329 +0,0 @@
> -/*
> - * Texas Instruments TNETV107X Keypad Driver
> - *
> - * Copyright (C) 2010 Texas Instruments
> - *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU General Public License as
> - * published by the Free Software Foundation version 2.
> - *
> - * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> - * kind, whether express or implied; without even the implied warranty
> - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - */
> -
> -#include <linux/kernel.h>
> -#include <linux/err.h>
> -#include <linux/errno.h>
> -#include <linux/input.h>
> -#include <linux/platform_device.h>
> -#include <linux/interrupt.h>
> -#include <linux/slab.h>
> -#include <linux/delay.h>
> -#include <linux/io.h>
> -#include <linux/clk.h>
> -#include <linux/input/matrix_keypad.h>
> -#include <linux/module.h>
> -
> -#define BITS(x) (BIT(x) - 1)
> -
> -#define KEYPAD_ROWS 9
> -#define KEYPAD_COLS 9
> -
> -#define DEBOUNCE_MIN 0x400ul
> -#define DEBOUNCE_MAX 0x3ffffffful
> -
> -struct keypad_regs {
> - u32 rev;
> - u32 mode;
> - u32 mask;
> - u32 pol;
> - u32 dclock;
> - u32 rclock;
> - u32 stable_cnt;
> - u32 in_en;
> - u32 out;
> - u32 out_en;
> - u32 in;
> - u32 lock;
> - u32 pres[3];
> -};
> -
> -#define keypad_read(kp, reg) __raw_readl(&(kp)->regs->reg)
> -#define keypad_write(kp, reg, val) __raw_writel(val, &(kp)->regs->reg)
> -
> -struct keypad_data {
> - struct input_dev *input_dev;
> - struct resource *res;
> - struct keypad_regs __iomem *regs;
> - struct clk *clk;
> - struct device *dev;
> - spinlock_t lock;
> - int irq_press;
> - int irq_release;
> - int rows, cols, row_shift;
> - int debounce_ms, active_low;
> - u32 prev_keys[3];
> - unsigned short keycodes[];
> -};
> -
> -static irqreturn_t keypad_irq(int irq, void *data)
> -{
> - struct keypad_data *kp = data;
> - int i, bit, val, row, col, code;
> - unsigned long flags;
> - u32 curr_keys[3];
> - u32 change;
> -
> - spin_lock_irqsave(&kp->lock, flags);
> -
> - memset(curr_keys, 0, sizeof(curr_keys));
> - if (irq == kp->irq_press)
> - for (i = 0; i < 3; i++)
> - curr_keys[i] = keypad_read(kp, pres[i]);
> -
> - for (i = 0; i < 3; i++) {
> - change = curr_keys[i] ^ kp->prev_keys[i];
> -
> - while (change) {
> - bit     = fls(change) - 1;
> - change ^= BIT(bit);
> - val     = curr_keys[i] & BIT(bit);
> - bit    += i * 32;
> - row     = bit / KEYPAD_COLS;
> - col     = bit % KEYPAD_COLS;
> -
> - code = MATRIX_SCAN_CODE(row, col, kp->row_shift);
> - input_event(kp->input_dev, EV_MSC, MSC_SCAN, code);
> - input_report_key(kp->input_dev, kp->keycodes[code],
> - val);
> - }
> - }
> - input_sync(kp->input_dev);
> - memcpy(kp->prev_keys, curr_keys, sizeof(curr_keys));
> -
> - if (irq == kp->irq_press)
> - keypad_write(kp, lock, 0); /* Allow hardware updates */
> -
> - spin_unlock_irqrestore(&kp->lock, flags);
> -
> - return IRQ_HANDLED;
> -}
> -
> -static int keypad_start(struct input_dev *dev)
> -{
> - struct keypad_data *kp = input_get_drvdata(dev);
> - unsigned long mask, debounce, clk_rate_khz;
> - unsigned long flags;
> -
> - clk_enable(kp->clk);
> - clk_rate_khz = clk_get_rate(kp->clk) / 1000;
> -
> - spin_lock_irqsave(&kp->lock, flags);
> -
> - /* Initialize device registers */
> - keypad_write(kp, mode, 0);
> -
> - mask  = BITS(kp->rows) << KEYPAD_COLS;
> - mask |= BITS(kp->cols);
> - keypad_write(kp, mask, ~mask);
> -
> - keypad_write(kp, pol, kp->active_low ? 0 : 0x3ffff);
> - keypad_write(kp, stable_cnt, 3);
> -
> - debounce = kp->debounce_ms * clk_rate_khz;
> - debounce = clamp(debounce, DEBOUNCE_MIN, DEBOUNCE_MAX);
> - keypad_write(kp, dclock, debounce);
> - keypad_write(kp, rclock, 4 * debounce);
> -
> - keypad_write(kp, in_en, 1);
> -
> - spin_unlock_irqrestore(&kp->lock, flags);
> -
> - return 0;
> -}
> -
> -static void keypad_stop(struct input_dev *dev)
> -{
> - struct keypad_data *kp = input_get_drvdata(dev);
> -
> - synchronize_irq(kp->irq_press);
> - synchronize_irq(kp->irq_release);
> - clk_disable(kp->clk);
> -}
> -
> -static int keypad_probe(struct platform_device *pdev)
> -{
> - const struct matrix_keypad_platform_data *pdata;
> - const struct matrix_keymap_data *keymap_data;
> - struct device *dev = &pdev->dev;
> - struct keypad_data *kp;
> - int error = 0, sz, row_shift;
> - u32 rev = 0;
> -
> - pdata = dev_get_platdata(&pdev->dev);
> - if (!pdata) {
> - dev_err(dev, "cannot find device data\n");
> - return -EINVAL;
> - }
> -
> - keymap_data = pdata->keymap_data;
> - if (!keymap_data) {
> - dev_err(dev, "cannot find keymap data\n");
> - return -EINVAL;
> - }
> -
> - row_shift = get_count_order(pdata->num_col_gpios);
> - sz  = offsetof(struct keypad_data, keycodes);
> - sz += (pdata->num_row_gpios << row_shift) * sizeof(kp->keycodes[0]);
> - kp = kzalloc(sz, GFP_KERNEL);
> - if (!kp) {
> - dev_err(dev, "cannot allocate device info\n");
> - return -ENOMEM;
> - }
> -
> - kp->dev  = dev;
> - kp->rows = pdata->num_row_gpios;
> - kp->cols = pdata->num_col_gpios;
> - kp->row_shift = row_shift;
> - platform_set_drvdata(pdev, kp);
> - spin_lock_init(&kp->lock);
> -
> - kp->irq_press   = platform_get_irq_byname(pdev, "press");
> - kp->irq_release = platform_get_irq_byname(pdev, "release");
> - if (kp->irq_press < 0 || kp->irq_release < 0) {
> - dev_err(dev, "cannot determine device interrupts\n");
> - error = -ENODEV;
> - goto error_res;
> - }
> -
> - kp->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> - if (!kp->res) {
> - dev_err(dev, "cannot determine register area\n");
> - error = -ENODEV;
> - goto error_res;
> - }
> -
> - if (!request_mem_region(kp->res->start, resource_size(kp->res),
> - pdev->name)) {
> - dev_err(dev, "cannot claim register memory\n");
> - kp->res = NULL;
> - error = -EINVAL;
> - goto error_res;
> - }
> -
> - kp->regs = ioremap(kp->res->start, resource_size(kp->res));
> - if (!kp->regs) {
> - dev_err(dev, "cannot map register memory\n");
> - error = -ENOMEM;
> - goto error_map;
> - }
> -
> - kp->clk = clk_get(dev, NULL);
> - if (IS_ERR(kp->clk)) {
> - dev_err(dev, "cannot claim device clock\n");
> - error = PTR_ERR(kp->clk);
> - goto error_clk;
> - }
> -
> - error = request_threaded_irq(kp->irq_press, NULL, keypad_irq,
> -     IRQF_ONESHOT, dev_name(dev), kp);
> - if (error < 0) {
> - dev_err(kp->dev, "Could not allocate keypad press key irq\n");
> - goto error_irq_press;
> - }
> -
> - error = request_threaded_irq(kp->irq_release, NULL, keypad_irq,
> -     IRQF_ONESHOT, dev_name(dev), kp);
> - if (error < 0) {
> - dev_err(kp->dev, "Could not allocate keypad release key irq\n");
> - goto error_irq_release;
> - }
> -
> - kp->input_dev = input_allocate_device();
> - if (!kp->input_dev) {
> - dev_err(dev, "cannot allocate input device\n");
> - error = -ENOMEM;
> - goto error_input;
> - }
> -
> - kp->input_dev->name  = pdev->name;
> - kp->input_dev->dev.parent = &pdev->dev;
> - kp->input_dev->open  = keypad_start;
> - kp->input_dev->close  = keypad_stop;
> -
> - clk_enable(kp->clk);
> - rev = keypad_read(kp, rev);
> - kp->input_dev->id.bustype = BUS_HOST;
> - kp->input_dev->id.product = ((rev >>  8) & 0x07);
> - kp->input_dev->id.version = ((rev >> 16) & 0xfff);
> - clk_disable(kp->clk);
> -
> - error = matrix_keypad_build_keymap(keymap_data, NULL,
> -   kp->rows, kp->cols,
> -   kp->keycodes, kp->input_dev);
> - if (error) {
> - dev_err(dev, "Failed to build keymap\n");
> - goto error_reg;
> - }
> -
> - if (!pdata->no_autorepeat)
> - kp->input_dev->evbit[0] |= BIT_MASK(EV_REP);
> - input_set_capability(kp->input_dev, EV_MSC, MSC_SCAN);
> -
> - input_set_drvdata(kp->input_dev, kp);
> -
> - error = input_register_device(kp->input_dev);
> - if (error < 0) {
> - dev_err(dev, "Could not register input device\n");
> - goto error_reg;
> - }
> -
> - return 0;
> -
> -
> -error_reg:
> - input_free_device(kp->input_dev);
> -error_input:
> - free_irq(kp->irq_release, kp);
> -error_irq_release:
> - free_irq(kp->irq_press, kp);
> -error_irq_press:
> - clk_put(kp->clk);
> -error_clk:
> - iounmap(kp->regs);
> -error_map:
> - release_mem_region(kp->res->start, resource_size(kp->res));
> -error_res:
> - kfree(kp);
> - return error;
> -}
> -
> -static int keypad_remove(struct platform_device *pdev)
> -{
> - struct keypad_data *kp = platform_get_drvdata(pdev);
> -
> - free_irq(kp->irq_press, kp);
> - free_irq(kp->irq_release, kp);
> - input_unregister_device(kp->input_dev);
> - clk_put(kp->clk);
> - iounmap(kp->regs);
> - release_mem_region(kp->res->start, resource_size(kp->res));
> - kfree(kp);
> -
> - return 0;
> -}
> -
> -static struct platform_driver keypad_driver = {
> - .probe = keypad_probe,
> - .remove = keypad_remove,
> - .driver.name = "tnetv107x-keypad",
> - .driver.owner = THIS_MODULE,
> -};
> -module_platform_driver(keypad_driver);
> -
> -MODULE_AUTHOR("Cyril Chemparathy");
> -MODULE_DESCRIPTION("TNETV107X Keypad Driver");
> -MODULE_ALIAS("platform:tnetv107x-keypad");
> -MODULE_LICENSE("GPL");
> diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
> index 07e9e82..68edc9d 100644
> --- a/drivers/input/touchscreen/Kconfig
> +++ b/drivers/input/touchscreen/Kconfig
> @@ -514,15 +514,6 @@ config TOUCHSCREEN_MIGOR
>    To compile this driver as a module, choose M here: the
>    module will be called migor_ts.
>  
> -config TOUCHSCREEN_TNETV107X
> - tristate "TI TNETV107X touchscreen support"
> - depends on ARCH_DAVINCI_TNETV107X
> - help
> -  Say Y here if you want to use the TNETV107X touchscreen.
> -
> -  To compile this driver as a module, choose M here: the
> -  module will be called tnetv107x-ts.
> -
>  config TOUCHSCREEN_TOUCHRIGHT
>   tristate "Touchright serial touchscreen"
>   select SERIO
> diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
> index 62801f2..4bc954b 100644
> --- a/drivers/input/touchscreen/Makefile
> +++ b/drivers/input/touchscreen/Makefile
> @@ -56,7 +56,6 @@ obj-$(CONFIG_TOUCHSCREEN_ST1232) += st1232.o
>  obj-$(CONFIG_TOUCHSCREEN_STMPE) += stmpe-ts.o
>  obj-$(CONFIG_TOUCHSCREEN_SUR40) += sur40.o
>  obj-$(CONFIG_TOUCHSCREEN_TI_AM335X_TSC) += ti_am335x_tsc.o
> -obj-$(CONFIG_TOUCHSCREEN_TNETV107X) += tnetv107x-ts.o
>  obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o
>  obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o
>  obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o
> diff --git a/drivers/input/touchscreen/tnetv107x-ts.c b/drivers/input/touchscreen/tnetv107x-ts.c
> deleted file mode 100644
> index c47827a..0000000
> --- a/drivers/input/touchscreen/tnetv107x-ts.c
> +++ /dev/null
> @@ -1,384 +0,0 @@
> -/*
> - * Texas Instruments TNETV107X Touchscreen Driver
> - *
> - * Copyright (C) 2010 Texas Instruments
> - *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU General Public License as
> - * published by the Free Software Foundation version 2.
> - *
> - * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> - * kind, whether express or implied; without even the implied warranty
> - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - */
> -
> -#include <linux/module.h>
> -#include <linux/kernel.h>
> -#include <linux/err.h>
> -#include <linux/errno.h>
> -#include <linux/input.h>
> -#include <linux/platform_device.h>
> -#include <linux/interrupt.h>
> -#include <linux/slab.h>
> -#include <linux/delay.h>
> -#include <linux/ctype.h>
> -#include <linux/io.h>
> -#include <linux/clk.h>
> -
> -#include <mach/tnetv107x.h>
> -
> -#define TSC_PENUP_POLL (HZ / 5)
> -#define IDLE_TIMEOUT 100 /* msec */
> -
> -/*
> - * The first and last samples of a touch interval are usually garbage and need
> - * to be filtered out with these devices.  The following definitions control
> - * the number of samples skipped.
> - */
> -#define TSC_HEAD_SKIP 1
> -#define TSC_TAIL_SKIP 1
> -#define TSC_SKIP (TSC_HEAD_SKIP + TSC_TAIL_SKIP + 1)
> -#define TSC_SAMPLES (TSC_SKIP + 1)
> -
> -/* Register Offsets */
> -struct tsc_regs {
> - u32 rev;
> - u32 tscm;
> - u32 bwcm;
> - u32 swc;
> - u32 adcchnl;
> - u32 adcdata;
> - u32 chval[4];
> -};
> -
> -/* TSC Mode Configuration Register (tscm) bits */
> -#define WMODE BIT(0)
> -#define TSKIND BIT(1)
> -#define ZMEASURE_EN BIT(2)
> -#define IDLE BIT(3)
> -#define TSC_EN BIT(4)
> -#define STOP BIT(5)
> -#define ONE_SHOT BIT(6)
> -#define SINGLE BIT(7)
> -#define AVG BIT(8)
> -#define AVGNUM(x) (((x) & 0x03) <<  9)
> -#define PVSTC(x) (((x) & 0x07) << 11)
> -#define PON BIT(14)
> -#define PONBG BIT(15)
> -#define AFERST BIT(16)
> -
> -/* ADC DATA Capture Register bits */
> -#define DATA_VALID BIT(16)
> -
> -/* Register Access Macros */
> -#define tsc_read(ts, reg) __raw_readl(&(ts)->regs->reg)
> -#define tsc_write(ts, reg, val) __raw_writel(val, &(ts)->regs->reg);
> -#define tsc_set_bits(ts, reg, val) \
> - tsc_write(ts, reg, tsc_read(ts, reg) | (val))
> -#define tsc_clr_bits(ts, reg, val) \
> - tsc_write(ts, reg, tsc_read(ts, reg) & ~(val))
> -
> -struct sample {
> - int x, y, p;
> -};
> -
> -struct tsc_data {
> - struct input_dev *input_dev;
> - struct resource *res;
> - struct tsc_regs __iomem *regs;
> - struct timer_list timer;
> - spinlock_t lock;
> - struct clk *clk;
> - struct device *dev;
> - int sample_count;
> - struct sample samples[TSC_SAMPLES];
> - int tsc_irq;
> -};
> -
> -static int tsc_read_sample(struct tsc_data *ts, struct sample* sample)
> -{
> - int x, y, z1, z2, t, p = 0;
> - u32 val;
> -
> - val = tsc_read(ts, chval[0]);
> - if (val & DATA_VALID)
> - x = val & 0xffff;
> - else
> - return -EINVAL;
> -
> - y  = tsc_read(ts, chval[1]) & 0xffff;
> - z1 = tsc_read(ts, chval[2]) & 0xffff;
> - z2 = tsc_read(ts, chval[3]) & 0xffff;
> -
> - if (z1) {
> - t = ((600 * x) * (z2 - z1));
> - p = t / (u32) (z1 << 12);
> - if (p < 0)
> - p = 0;
> - }
> -
> - sample->x  = x;
> - sample->y  = y;
> - sample->p  = p;
> -
> - return 0;
> -}
> -
> -static void tsc_poll(unsigned long data)
> -{
> - struct tsc_data *ts = (struct tsc_data *)data;
> - unsigned long flags;
> - int i, val, x, y, p;
> -
> - spin_lock_irqsave(&ts->lock, flags);
> -
> - if (ts->sample_count >= TSC_SKIP) {
> - input_report_abs(ts->input_dev, ABS_PRESSURE, 0);
> - input_report_key(ts->input_dev, BTN_TOUCH, 0);
> - input_sync(ts->input_dev);
> - } else if (ts->sample_count > 0) {
> - /*
> - * A touch event lasted less than our skip count.  Salvage and
> - * report anyway.
> - */
> - for (i = 0, val = 0; i < ts->sample_count; i++)
> - val += ts->samples[i].x;
> - x = val / ts->sample_count;
> -
> - for (i = 0, val = 0; i < ts->sample_count; i++)
> - val += ts->samples[i].y;
> - y = val / ts->sample_count;
> -
> - for (i = 0, val = 0; i < ts->sample_count; i++)
> - val += ts->samples[i].p;
> - p = val / ts->sample_count;
> -
> - input_report_abs(ts->input_dev, ABS_X, x);
> - input_report_abs(ts->input_dev, ABS_Y, y);
> - input_report_abs(ts->input_dev, ABS_PRESSURE, p);
> - input_report_key(ts->input_dev, BTN_TOUCH, 1);
> - input_sync(ts->input_dev);
> - }
> -
> - ts->sample_count = 0;
> -
> - spin_unlock_irqrestore(&ts->lock, flags);
> -}
> -
> -static irqreturn_t tsc_irq(int irq, void *dev_id)
> -{
> - struct tsc_data *ts = (struct tsc_data *)dev_id;
> - struct sample *sample;
> - int index;
> -
> - spin_lock(&ts->lock);
> -
> - index = ts->sample_count % TSC_SAMPLES;
> - sample = &ts->samples[index];
> - if (tsc_read_sample(ts, sample) < 0)
> - goto out;
> -
> - if (++ts->sample_count >= TSC_SKIP) {
> - index = (ts->sample_count - TSC_TAIL_SKIP - 1) % TSC_SAMPLES;
> - sample = &ts->samples[index];
> -
> - input_report_abs(ts->input_dev, ABS_X, sample->x);
> - input_report_abs(ts->input_dev, ABS_Y, sample->y);
> - input_report_abs(ts->input_dev, ABS_PRESSURE, sample->p);
> - if (ts->sample_count == TSC_SKIP)
> - input_report_key(ts->input_dev, BTN_TOUCH, 1);
> - input_sync(ts->input_dev);
> - }
> - mod_timer(&ts->timer, jiffies + TSC_PENUP_POLL);
> -out:
> - spin_unlock(&ts->lock);
> - return IRQ_HANDLED;
> -}
> -
> -static int tsc_start(struct input_dev *dev)
> -{
> - struct tsc_data *ts = input_get_drvdata(dev);
> - unsigned long timeout = jiffies + msecs_to_jiffies(IDLE_TIMEOUT);
> - u32 val;
> -
> - clk_enable(ts->clk);
> -
> - /* Go to idle mode, before any initialization */
> - while (time_after(timeout, jiffies)) {
> - if (tsc_read(ts, tscm) & IDLE)
> - break;
> - }
> -
> - if (time_before(timeout, jiffies)) {
> - dev_warn(ts->dev, "timeout waiting for idle\n");
> - clk_disable(ts->clk);
> - return -EIO;
> - }
> -
> - /* Configure TSC Control register*/
> - val = (PONBG | PON | PVSTC(4) | ONE_SHOT | ZMEASURE_EN);
> - tsc_write(ts, tscm, val);
> -
> - /* Bring TSC out of reset: Clear AFE reset bit */
> - val &= ~(AFERST);
> - tsc_write(ts, tscm, val);
> -
> - /* Configure all pins for hardware control*/
> - tsc_write(ts, bwcm, 0);
> -
> - /* Finally enable the TSC */
> - tsc_set_bits(ts, tscm, TSC_EN);
> -
> - return 0;
> -}
> -
> -static void tsc_stop(struct input_dev *dev)
> -{
> - struct tsc_data *ts = input_get_drvdata(dev);
> -
> - tsc_clr_bits(ts, tscm, TSC_EN);
> - synchronize_irq(ts->tsc_irq);
> - del_timer_sync(&ts->timer);
> - clk_disable(ts->clk);
> -}
> -
> -static int tsc_probe(struct platform_device *pdev)
> -{
> - struct device *dev = &pdev->dev;
> - struct tsc_data *ts;
> - int error = 0;
> - u32 rev = 0;
> -
> - ts = kzalloc(sizeof(struct tsc_data), GFP_KERNEL);
> - if (!ts) {
> - dev_err(dev, "cannot allocate device info\n");
> - return -ENOMEM;
> - }
> -
> - ts->dev = dev;
> - spin_lock_init(&ts->lock);
> - setup_timer(&ts->timer, tsc_poll, (unsigned long)ts);
> - platform_set_drvdata(pdev, ts);
> -
> - ts->tsc_irq = platform_get_irq(pdev, 0);
> - if (ts->tsc_irq < 0) {
> - dev_err(dev, "cannot determine device interrupt\n");
> - error = -ENODEV;
> - goto error_res;
> - }
> -
> - ts->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> - if (!ts->res) {
> - dev_err(dev, "cannot determine register area\n");
> - error = -ENODEV;
> - goto error_res;
> - }
> -
> - if (!request_mem_region(ts->res->start, resource_size(ts->res),
> - pdev->name)) {
> - dev_err(dev, "cannot claim register memory\n");
> - ts->res = NULL;
> - error = -EINVAL;
> - goto error_res;
> - }
> -
> - ts->regs = ioremap(ts->res->start, resource_size(ts->res));
> - if (!ts->regs) {
> - dev_err(dev, "cannot map register memory\n");
> - error = -ENOMEM;
> - goto error_map;
> - }
> -
> - ts->clk = clk_get(dev, NULL);
> - if (IS_ERR(ts->clk)) {
> - dev_err(dev, "cannot claim device clock\n");
> - error = PTR_ERR(ts->clk);
> - goto error_clk;
> - }
> -
> - error = request_threaded_irq(ts->tsc_irq, NULL, tsc_irq, IRQF_ONESHOT,
> -     dev_name(dev), ts);
> - if (error < 0) {
> - dev_err(ts->dev, "Could not allocate ts irq\n");
> - goto error_irq;
> - }
> -
> - ts->input_dev = input_allocate_device();
> - if (!ts->input_dev) {
> - dev_err(dev, "cannot allocate input device\n");
> - error = -ENOMEM;
> - goto error_input;
> - }
> - input_set_drvdata(ts->input_dev, ts);
> -
> - ts->input_dev->name       = pdev->name;
> - ts->input_dev->id.bustype = BUS_HOST;
> - ts->input_dev->dev.parent = &pdev->dev;
> - ts->input_dev->open  = tsc_start;
> - ts->input_dev->close  = tsc_stop;
> -
> - clk_enable(ts->clk);
> - rev = tsc_read(ts, rev);
> - ts->input_dev->id.product = ((rev >>  8) & 0x07);
> - ts->input_dev->id.version = ((rev >> 16) & 0xfff);
> - clk_disable(ts->clk);
> -
> - __set_bit(EV_KEY,    ts->input_dev->evbit);
> - __set_bit(EV_ABS,    ts->input_dev->evbit);
> - __set_bit(BTN_TOUCH, ts->input_dev->keybit);
> -
> - input_set_abs_params(ts->input_dev, ABS_X, 0, 0xffff, 5, 0);
> - input_set_abs_params(ts->input_dev, ABS_Y, 0, 0xffff, 5, 0);
> - input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 4095, 128, 0);
> -
> - error = input_register_device(ts->input_dev);
> - if (error < 0) {
> - dev_err(dev, "failed input device registration\n");
> - goto error_reg;
> - }
> -
> - return 0;
> -
> -error_reg:
> - input_free_device(ts->input_dev);
> -error_input:
> - free_irq(ts->tsc_irq, ts);
> -error_irq:
> - clk_put(ts->clk);
> -error_clk:
> - iounmap(ts->regs);
> -error_map:
> - release_mem_region(ts->res->start, resource_size(ts->res));
> -error_res:
> - kfree(ts);
> -
> - return error;
> -}
> -
> -static int tsc_remove(struct platform_device *pdev)
> -{
> - struct tsc_data *ts = platform_get_drvdata(pdev);
> -
> - input_unregister_device(ts->input_dev);
> - free_irq(ts->tsc_irq, ts);
> - clk_put(ts->clk);
> - iounmap(ts->regs);
> - release_mem_region(ts->res->start, resource_size(ts->res));
> - kfree(ts);
> -
> - return 0;
> -}
> -
> -static struct platform_driver tsc_driver = {
> - .probe = tsc_probe,
> - .remove = tsc_remove,
> - .driver.name = "tnetv107x-ts",
> - .driver.owner = THIS_MODULE,
> -};
> -module_platform_driver(tsc_driver);
> -
> -MODULE_AUTHOR("Cyril Chemparathy");
> -MODULE_DESCRIPTION("TNETV107X Touchscreen Driver");
> -MODULE_ALIAS("platform:tnetv107x-ts");
> -MODULE_LICENSE("GPL");
> --
> 1.8.3.2
>

--
Dmitry
_______________________________________________
Davinci-linux-open-source mailing list
[hidden email]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
Loading...