Re: [PATCH 08/12] staging: wilc1000: use s8 instead of int8_t

2015-10-01 Thread Dan Carpenter
On Fri, Oct 02, 2015 at 07:56:28AM +0900, Chaehyun Lim wrote:
> On Fri, Oct 2, 2015 at 12:40 AM, Dan Carpenter  
> wrote:
> > On Thu, Oct 01, 2015 at 10:43:55PM +0900, Chaehyun Lim wrote:
> >> This patch replaces int8_t with s8 that is a preferred type.
> >>
> >
> > It would be better to just use int.
> 
> I always appreciate your comment. I've sent a patch before after
> changing by int, but it was rejected.

Probably your changelog was bad.  Using s8 is hopefully a sign that you
are doing something very hardware specific.  In this case, it is just a
index.

Write the changelog.  "The int8_t should just be int.  It's used as an
index into an array or -1 for not found."

regards,
dan carpenter

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v3] mtd: nand: pass page number to ecc->write_xxx() methods

2015-10-01 Thread Boris Brezillon
The ->read_xxx() methods are all passed the page number the NAND controller
is supposed to read, but ->write_xxx() do not have such a parameter.

This is a problem if we want to properly implement data
scrambling/randomization in order to mitigate MLC sensibility to repeated
pattern: to prevent bitflips in adjacent pages in the same block we need
to avoid repeating the same pattern at the same offset in those pages,
hence the randomizer/scrambler engine need to be passed the page value
in order to adapt its seed accordingly.

Moreover, adding the page parameter to the ->write_xxx() methods add some
consistency to the current API.

Signed-off-by: Boris Brezillon 
CC: Josh Wu 
CC: Ezequiel Garcia 
CC: Maxime Ripard 
CC: Greg Kroah-Hartman 
CC: Huang Shijie 
CC: Stefan Agner 
CC: de...@driverdev.osuosl.org
CC: linux-arm-ker...@lists.infradead.org
CC: linux-ker...@vger.kernel.org
---
Changes since v2:
- fixed compilation error in the gpmi driver
- compile tested all impacted drivers except the bf5xx_nand,
  fsl_elbc_nand and fsl_ifc_nand ones

Changes since v1:
- rebased on l2-mtd/master
- fixed compilation error in the docg4 driver
---
 drivers/mtd/nand/atmel_nand.c |  6 --
 drivers/mtd/nand/bf5xx_nand.c |  3 ++-
 drivers/mtd/nand/brcmnand/brcmnand.c  |  4 ++--
 drivers/mtd/nand/cafe_nand.c  |  3 ++-
 drivers/mtd/nand/denali.c |  5 +++--
 drivers/mtd/nand/docg4.c  |  6 +++---
 drivers/mtd/nand/fsl_elbc_nand.c  |  4 ++--
 drivers/mtd/nand/fsl_ifc_nand.c   |  2 +-
 drivers/mtd/nand/gpmi-nand/gpmi-nand.c|  8 +++
 drivers/mtd/nand/hisi504_nand.c   |  3 ++-
 drivers/mtd/nand/lpc32xx_mlc.c|  3 ++-
 drivers/mtd/nand/lpc32xx_slc.c|  5 +++--
 drivers/mtd/nand/nand_base.c  | 31 ++-
 drivers/mtd/nand/omap2.c  |  3 ++-
 drivers/mtd/nand/pxa3xx_nand.c|  3 ++-
 drivers/mtd/nand/sh_flctl.c   |  3 ++-
 drivers/mtd/nand/sunxi_nand.c |  5 +++--
 drivers/mtd/nand/vf610_nfc.c  |  2 +-
 drivers/staging/mt29f_spinand/mt29f_spinand.c |  3 ++-
 include/linux/mtd/nand.h  |  6 +++---
 20 files changed, 66 insertions(+), 42 deletions(-)

diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index 46010bd..d0f50c9 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -954,7 +954,8 @@ static int atmel_nand_pmecc_read_page(struct mtd_info *mtd,
 }
 
 static int atmel_nand_pmecc_write_page(struct mtd_info *mtd,
-   struct nand_chip *chip, const uint8_t *buf, int oob_required)
+   struct nand_chip *chip, const uint8_t *buf, int oob_required,
+   int page)
 {
struct atmel_nand_host *host = chip->priv;
uint32_t *eccpos = chip->ecc.layout->eccpos;
@@ -2005,7 +2006,8 @@ static int nfc_sram_write_page(struct mtd_info *mtd, 
struct nand_chip *chip,
 
if (likely(!raw))
/* Need to write ecc into oob */
-   status = chip->ecc.write_page(mtd, chip, buf, oob_required);
+   status = chip->ecc.write_page(mtd, chip, buf, oob_required,
+ page);
 
if (status < 0)
return status;
diff --git a/drivers/mtd/nand/bf5xx_nand.c b/drivers/mtd/nand/bf5xx_nand.c
index 4d8d4ba..17b3727 100644
--- a/drivers/mtd/nand/bf5xx_nand.c
+++ b/drivers/mtd/nand/bf5xx_nand.c
@@ -566,7 +566,8 @@ static int bf5xx_nand_read_page_raw(struct mtd_info *mtd, 
struct nand_chip *chip
 }
 
 static int bf5xx_nand_write_page_raw(struct mtd_info *mtd,
-   struct nand_chip *chip, const uint8_t *buf, int oob_required)
+   struct nand_chip *chip, const uint8_t *buf, int oob_required,
+   int page)
 {
bf5xx_nand_write_buf(mtd, buf, mtd->writesize);
bf5xx_nand_write_buf(mtd, chip->oob_poi, mtd->oobsize);
diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c 
b/drivers/mtd/nand/brcmnand/brcmnand.c
index 048e4e0..e577109 100644
--- a/drivers/mtd/nand/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/brcmnand/brcmnand.c
@@ -1606,7 +1606,7 @@ out:
 }
 
 static int brcmnand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
-  const uint8_t *buf, int oob_required)
+  const uint8_t *buf, int oob_required, int page)
 {
struct brcmnand_host *host = chip->priv;
void *oob = oob_required ? chip->oob_poi : NULL;
@@ -1617,7 +1617,7 @@ static int brcmnand_write_page(struct mtd_info *mtd, 
struct nand_chip *chip,
 
 static int brcmnand_write_page_raw(struct mtd_info *mtd,
   struct nand_chip *chip, const uint8_t *buf,
-  int oob_required)
+  int oob_required, int page)
 

[PATCH 3/5] Staging: rtl8192u: Fix block comment formatting

2015-10-01 Thread mike dupuis
This is a patch to correct block comment formatting in two
instances in ieee80211_crypt_ccmp.c

Signed-off-by: Mike Dupuis 
---
 drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c 
b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
index 0404654..ca5139a 100644
--- a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
+++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
@@ -125,10 +125,9 @@ static void ccmp_init_blocks(struct crypto_tfm *tfm,
fc = le16_to_cpu(hdr->frame_ctl);
a4_included = ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
   (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS));
-   /*
-   qc_included = ((WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA) &&
-  (WLAN_FC_GET_STYPE(fc) & 0x08));
-   */
+   /* qc_included = ((WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA) &&
+* (WLAN_FC_GET_STYPE(fc) & 0x08));
+*/
/* fixed by David :2006.9.6 */
qc_included = (WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA) &&
   (WLAN_FC_GET_STYPE(fc) & 0x80);
@@ -146,7 +145,8 @@ static void ccmp_init_blocks(struct crypto_tfm *tfm,
 * Flag (Include authentication header, M=3 (8-octet MIC),
 *   L=1 (2-octet Dlen))
 * Nonce: 0x00 | A2 | PN
-* Dlen */
+* Dlen
+*/
b0[0] = 0x59;
b0[1] = qc;
memcpy(b0 + 2, hdr->addr2, ETH_ALEN);
-- 
2.1.4


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 1/5] Staging: rtl8192u: quoted strings split across lines

2015-10-01 Thread mike dupuis
This is a patch to fix up instances where quoted strings are split
across multiple lines in several instances in ieee80211_crypt_ccmp.c

Signed-off-by: Mike Dupuis 
---
 .../rtl8192u/ieee80211/ieee80211_crypt_ccmp.c  | 27 +-
 1 file changed, 11 insertions(+), 16 deletions(-)

diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c 
b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
index a661416..71e8ad5 100644
--- a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
+++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
@@ -73,8 +73,7 @@ static void *ieee80211_ccmp_init(int key_idx)
 
priv->tfm = (void *)crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->tfm)) {
-   printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate "
-  "crypto API aes\n");
+   printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate 
crypto API aes\n");
priv->tfm = NULL;
goto fail;
}
@@ -284,23 +283,22 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, 
int hdr_len, void *priv)
keyidx = pos[3];
if (!(keyidx & (1 << 5))) {
if (net_ratelimit()) {
-   printk(KERN_DEBUG "CCMP: received packet without ExtIV"
-  " flag from %pM\n", hdr->addr2);
+   printk(KERN_DEBUG "CCMP: received packet without ExtIV 
flag from %pM\n",
+   hdr->addr2);
}
key->dot11RSNAStatsCCMPFormatErrors++;
return -2;
}
keyidx >>= 6;
if (key->key_idx != keyidx) {
-   printk(KERN_DEBUG "CCMP: RX tkey->key_idx=%d frame "
-  "keyidx=%d priv=%p\n", key->key_idx, keyidx, priv);
+   printk(KERN_DEBUG "CCMP: RX tkey->key_idx=%d frame keyidx=%d 
priv=%p\n",
+   key->key_idx, keyidx, priv);
return -6;
}
if (!key->key_set) {
if (net_ratelimit()) {
-   printk(KERN_DEBUG "CCMP: received packet from %pM"
-  " with keyid=%d that does not have a configured"
-  " key\n", hdr->addr2, keyidx);
+   printk(KERN_DEBUG "CCMP: received packet from %pM with 
keyid=%d that does not have a configured key\n",
+   hdr->addr2, keyidx);
}
return -3;
}
@@ -315,8 +313,7 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int 
hdr_len, void *priv)
 
if (memcmp(pn, key->rx_pn, CCMP_PN_LEN) <= 0) {
if (net_ratelimit()) {
-   printk(KERN_DEBUG "CCMP: replay detected: STA=%pM"
-  " previous PN %pm received PN %pm\n",
+   printk(KERN_DEBUG "CCMP: replay detected: STA=%pM 
previous PN %pm received PN %pm\n",
   hdr->addr2, key->rx_pn, pn);
}
key->dot11RSNAStatsCCMPReplays++;
@@ -353,8 +350,8 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int 
hdr_len, void *priv)
 
if (memcmp(mic, a, CCMP_MIC_LEN) != 0) {
if (net_ratelimit()) {
-   printk(KERN_DEBUG "CCMP: decrypt failed: STA="
-   "%pM\n", hdr->addr2);
+   printk(KERN_DEBUG "CCMP: decrypt failed: 
STA=%pM\n",
+   hdr->addr2);
}
key->dot11RSNAStatsCCMPDecryptErrors++;
return -5;
@@ -429,9 +426,7 @@ static int ieee80211_ccmp_get_key(void *key, int len, u8 
*seq, void *priv)
 static char *ieee80211_ccmp_print_stats(char *p, void *priv)
 {
struct ieee80211_ccmp_data *ccmp = priv;
-   p += sprintf(p, "key[%d] alg=CCMP key_set=%d "
-"tx_pn=%pm rx_pn=%pm "
-"format_errors=%d replays=%d decrypt_errors=%d\n",
+   p += sprintf(p, "key[%d] alg=CCMP key_set=%d tx_pn=%pm rx_pn=%pm 
format_errors=%d replays=%d decrypt_errors=%d\n",
 ccmp->key_idx, ccmp->key_set,
 ccmp->tx_pn, ccmp->rx_pn,
 ccmp->dot11RSNAStatsCCMPFormatErrors,
-- 
2.1.4


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 0/5] Staging: rtl8192u: checkpatch.pl issues

2015-10-01 Thread mike dupuis
This is a series of patches to correct several checkpatch.pl warnings
and errors in ieee80211_crypt_ccmp.c.

Checkpatch.pl before/after summary:
before: total: 2 errors, 23 warnings, 23 checks, 474 lines checked
after:  total: 0 errors, 10 warnings, 27 checks, 469 lines checked

Mike Dupuis (5):
  Staging: rtl8192u: quoted strings split across lines
  Staging: rtl8192u: missing blank lines after declarations
  Staging: rtl8192u: Fix block comment formatting
  Staging: rtl8192u: Correct open brace placement
  Staging: rtl8192u: Remove spaces at the start of lines

 .../rtl8192u/ieee80211/ieee80211_crypt_ccmp.c  | 47 ++
 1 file changed, 21 insertions(+), 26 deletions(-)

-- 
2.1.4


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 5/5] Staging: rtl8192u: Remove spaces at the start of lines

2015-10-01 Thread mike dupuis
This is a patch to correct indentation in one instance in
ieee80211_crypt_ccmp.c

Signed-off-by: Mike Dupuis 
---
 drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c 
b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
index c8aaab3..27ce481 100644
--- a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
+++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
@@ -71,7 +71,7 @@ static void *ieee80211_ccmp_init(int key_idx)
goto fail;
priv->key_idx = key_idx;
 
-   priv->tfm = (void *)crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
+   priv->tfm = (void *)crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->tfm)) {
printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate 
crypto API aes\n");
priv->tfm = NULL;
-- 
2.1.4


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 2/5] Staging: rtl8192u: missing blank lines after declarations

2015-10-01 Thread mike dupuis
This is a patch to add missing lines after variable decalarations
in two functions in ieee80211_crypt_ccmp.c

Signed-off-by: Mike Dupuis 
---
 drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c 
b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
index 71e8ad5..0404654 100644
--- a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
+++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
@@ -104,6 +104,7 @@ static void ieee80211_ccmp_deinit(void *priv)
 static inline void xor_block(u8 *b, u8 *a, size_t len)
 {
int i;
+
for (i = 0; i < len; i++)
b[i] ^= a[i];
 }
@@ -426,6 +427,7 @@ static int ieee80211_ccmp_get_key(void *key, int len, u8 
*seq, void *priv)
 static char *ieee80211_ccmp_print_stats(char *p, void *priv)
 {
struct ieee80211_ccmp_data *ccmp = priv;
+
p += sprintf(p, "key[%d] alg=CCMP key_set=%d tx_pn=%pm rx_pn=%pm 
format_errors=%d replays=%d decrypt_errors=%d\n",
 ccmp->key_idx, ccmp->key_set,
 ccmp->tx_pn, ccmp->rx_pn,
-- 
2.1.4


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 4/5] Staging: rtl8192u: Correct open brace placement

2015-10-01 Thread mike dupuis
This is a patch to move open braces to the appropriate lines in
two instances in ieee80211_crypt_ccmp.c

Signed-off-by: Mike Dupuis 
---
 drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c 
b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
index ca5139a..c8aaab3 100644
--- a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
+++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
@@ -229,8 +229,7 @@ static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int 
hdr_len, void *priv)
 
 
hdr = (struct rtl_80211_hdr_4addr *) skb->data;
-   if (!tcb_desc->bHwSec)
-   {
+   if (!tcb_desc->bHwSec) {
int blocks, last, len;
u8 *mic;
u8 *b0 = key->tx_b0;
@@ -320,8 +319,7 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int 
hdr_len, void *priv)
key->dot11RSNAStatsCCMPReplays++;
return -4;
}
-   if (!tcb_desc->bHwSec)
-   {
+   if (!tcb_desc->bHwSec) {
size_t data_len = skb->len - hdr_len - CCMP_HDR_LEN - 
CCMP_MIC_LEN;
u8 *mic = skb->data + skb->len - CCMP_MIC_LEN;
u8 *b0 = key->rx_b0;
-- 
2.1.4


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 10/10] staging: wilc1000: remove unused variable real_ndev

2015-10-01 Thread Tony Cho
From: Glen Lee 

This patch removes unused variable real_ndev.

Signed-off-by: Glen Lee 
Signed-off-by: Tony Cho 
---
 drivers/staging/wilc1000/wilc_wfi_netdevice.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/staging/wilc1000/wilc_wfi_netdevice.h 
b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
index e553b0c..81c1ad3 100644
--- a/drivers/staging/wilc1000/wilc_wfi_netdevice.h
+++ b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
@@ -187,7 +187,6 @@ typedef struct {
 
const struct firmware *wilc_firmware;
 
-   struct net_device *real_ndev;
 #ifdef WILC_SDIO
struct sdio_func *wilc_sdio_func;
 #else
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 09/10] staging: wilc1000: remove function pointer cfg_init

2015-10-01 Thread Tony Cho
From: Glen Lee 

This patch removes function pointer cfg_init and call the function
wilc_wlan_cfg_init instead. Remove static from function declaration.
After removing cfg_init, the struct wilc_cfg_func_t is useless so just delete
it and it's related codes.

Signed-off-by: Glen Lee 
Signed-off-by: Tony Cho 
---
 drivers/staging/wilc1000/wilc_wlan.c | 3 +--
 drivers/staging/wilc1000/wilc_wlan.h | 4 
 drivers/staging/wilc1000/wilc_wlan_cfg.c | 6 +-
 drivers/staging/wilc1000/wilc_wlan_cfg.h | 1 +
 4 files changed, 3 insertions(+), 11 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index cd4598a..4ca8721 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -18,7 +18,6 @@
  /
 extern wilc_hif_func_t hif_sdio;
 extern wilc_hif_func_t hif_spi;
-extern wilc_cfg_func_t mac_cfg;
 extern void WILC_WFI_mgmt_rx(u8 *buff, u32 size);
 u32 wilc_get_chipid(u8 update);
 u16 Set_machw_change_vir_if(bool bValue);
@@ -1994,7 +1993,7 @@ int wilc_wlan_init(wilc_wlan_inp_t *inp)
/***
 *  mac interface init
 **/
-   if (!mac_cfg.cfg_init(wilc_debug)) {
+   if (!wilc_wlan_cfg_init(wilc_debug)) {
/* ENOBUFS  105 */
ret = -105;
goto _fail_;
diff --git a/drivers/staging/wilc1000/wilc_wlan.h 
b/drivers/staging/wilc1000/wilc_wlan.h
index 5099cf0..bd89689 100644
--- a/drivers/staging/wilc1000/wilc_wlan.h
+++ b/drivers/staging/wilc1000/wilc_wlan.h
@@ -295,10 +295,6 @@ typedef struct {
u32 seq_no;
 } wilc_cfg_rsp_t;
 
-typedef struct {
-   int (*cfg_init)(wilc_debug_func);
-} wilc_cfg_func_t;
-
 int wilc_wlan_firmware_download(const u8 *buffer, u32 buffer_size);
 int wilc_wlan_start(void);
 int wilc_wlan_stop(void);
diff --git a/drivers/staging/wilc1000/wilc_wlan_cfg.c 
b/drivers/staging/wilc1000/wilc_wlan_cfg.c
index 2916d45..d148d6e 100644
--- a/drivers/staging/wilc1000/wilc_wlan_cfg.c
+++ b/drivers/staging/wilc1000/wilc_wlan_cfg.c
@@ -558,13 +558,9 @@ int wilc_wlan_cfg_indicate_rx(u8 *frame, int size, 
wilc_cfg_rsp_t *rsp)
return ret;
 }
 
-static int wilc_wlan_cfg_init(wilc_debug_func func)
+int wilc_wlan_cfg_init(wilc_debug_func func)
 {
memset((void *)&g_mac, 0, sizeof(wilc_mac_cfg_t));
g_mac.dPrint = func;
return 1;
 }
-
-wilc_cfg_func_t mac_cfg = {
-   wilc_wlan_cfg_init,
-};
diff --git a/drivers/staging/wilc1000/wilc_wlan_cfg.h 
b/drivers/staging/wilc1000/wilc_wlan_cfg.h
index fe2c0382..30e60ec 100644
--- a/drivers/staging/wilc1000/wilc_wlan_cfg.h
+++ b/drivers/staging/wilc1000/wilc_wlan_cfg.h
@@ -34,5 +34,6 @@ int wilc_wlan_cfg_set_wid(u8 *frame, u32 offset, u16 id, u8 
*buf, int size);
 int wilc_wlan_cfg_get_wid(u8 *frame, u32 offset, u16 id);
 int wilc_wlan_cfg_get_wid_value(u16 wid, u8 *buffer, u32 buffer_size);
 int wilc_wlan_cfg_indicate_rx(u8 *frame, int size, wilc_cfg_rsp_t *rsp);
+int wilc_wlan_cfg_init(wilc_debug_func func);
 
 #endif
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 08/10] staging: wilc1000: remove function pointer rx_indicate

2015-10-01 Thread Tony Cho
From: Glen Lee 

This patch removes function pointer rx_indicate and just call the function
wilc_wlan_cfg_indicate_rx instead. Remove static from the function
declration.

Signed-off-by: Glen Lee 
Signed-off-by: Tony Cho 
---
 drivers/staging/wilc1000/wilc_wlan.c | 2 +-
 drivers/staging/wilc1000/wilc_wlan.h | 1 -
 drivers/staging/wilc1000/wilc_wlan_cfg.c | 3 +--
 drivers/staging/wilc1000/wilc_wlan_cfg.h | 1 +
 4 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index a9a8d24..cd4598a 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -1198,7 +1198,7 @@ static void wilc_wlan_handle_rxq(void)
 
 
 
-   mac_cfg.rx_indicate(&buffer[pkt_offset 
+ offset], pkt_len, &rsp);
+   
wilc_wlan_cfg_indicate_rx(&buffer[pkt_offset + offset], pkt_len, &rsp);
if (rsp.type == WILC_CFG_RSP) {
/**
 *  wake up the waiting 
task...
diff --git a/drivers/staging/wilc1000/wilc_wlan.h 
b/drivers/staging/wilc1000/wilc_wlan.h
index 9386939..5099cf0 100644
--- a/drivers/staging/wilc1000/wilc_wlan.h
+++ b/drivers/staging/wilc1000/wilc_wlan.h
@@ -296,7 +296,6 @@ typedef struct {
 } wilc_cfg_rsp_t;
 
 typedef struct {
-   int (*rx_indicate)(u8 *, int, wilc_cfg_rsp_t *);
int (*cfg_init)(wilc_debug_func);
 } wilc_cfg_func_t;
 
diff --git a/drivers/staging/wilc1000/wilc_wlan_cfg.c 
b/drivers/staging/wilc1000/wilc_wlan_cfg.c
index 55d2083..2916d45 100644
--- a/drivers/staging/wilc1000/wilc_wlan_cfg.c
+++ b/drivers/staging/wilc1000/wilc_wlan_cfg.c
@@ -505,7 +505,7 @@ int wilc_wlan_cfg_get_wid_value(u16 wid, u8 *buffer, u32 
buffer_size)
return ret;
 }
 
-static int wilc_wlan_cfg_indicate_rx(u8 *frame, int size, wilc_cfg_rsp_t *rsp)
+int wilc_wlan_cfg_indicate_rx(u8 *frame, int size, wilc_cfg_rsp_t *rsp)
 {
int ret = 1;
u8 msg_type;
@@ -566,6 +566,5 @@ static int wilc_wlan_cfg_init(wilc_debug_func func)
 }
 
 wilc_cfg_func_t mac_cfg = {
-   wilc_wlan_cfg_indicate_rx,
wilc_wlan_cfg_init,
 };
diff --git a/drivers/staging/wilc1000/wilc_wlan_cfg.h 
b/drivers/staging/wilc1000/wilc_wlan_cfg.h
index 0efa2c5..fe2c0382 100644
--- a/drivers/staging/wilc1000/wilc_wlan_cfg.h
+++ b/drivers/staging/wilc1000/wilc_wlan_cfg.h
@@ -33,5 +33,6 @@ typedef struct {
 int wilc_wlan_cfg_set_wid(u8 *frame, u32 offset, u16 id, u8 *buf, int size);
 int wilc_wlan_cfg_get_wid(u8 *frame, u32 offset, u16 id);
 int wilc_wlan_cfg_get_wid_value(u16 wid, u8 *buffer, u32 buffer_size);
+int wilc_wlan_cfg_indicate_rx(u8 *frame, int size, wilc_cfg_rsp_t *rsp);
 
 #endif
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 06/10] staging: wilc1000: remove function pointer cfg_wid_get

2015-10-01 Thread Tony Cho
From: Glen Lee 

Remove function pointer cfg_wid_get and call the function
wilc_wlan_cfg_get_wid instead. Remove static from the function declaration.

Signed-off-by: Glen Lee 
Signed-off-by: Tony Cho 
---
 drivers/staging/wilc1000/wilc_wlan.c | 2 +-
 drivers/staging/wilc1000/wilc_wlan.h | 1 -
 drivers/staging/wilc1000/wilc_wlan_cfg.c | 3 +--
 drivers/staging/wilc1000/wilc_wlan_cfg.h | 1 +
 4 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index 442fe5f..fbc0829 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -1804,7 +1804,7 @@ int wilc_wlan_cfg_get(int start, u32 wid, int commit, u32 
drvHandler)
p->cfg_frame_offset = 0;
 
offset = p->cfg_frame_offset;
-   ret_size = mac_cfg.cfg_wid_get(p->cfg_frame.frame, offset, (u16)wid);
+   ret_size = wilc_wlan_cfg_get_wid(p->cfg_frame.frame, offset, (u16)wid);
offset += ret_size;
p->cfg_frame_offset = offset;
 
diff --git a/drivers/staging/wilc1000/wilc_wlan.h 
b/drivers/staging/wilc1000/wilc_wlan.h
index 90417d9..bbf3e02 100644
--- a/drivers/staging/wilc1000/wilc_wlan.h
+++ b/drivers/staging/wilc1000/wilc_wlan.h
@@ -296,7 +296,6 @@ typedef struct {
 } wilc_cfg_rsp_t;
 
 typedef struct {
-   int (*cfg_wid_get)(u8 *, u32, u16);
int (*cfg_wid_get_val)(u16, u8 *, u32);
int (*rx_indicate)(u8 *, int, wilc_cfg_rsp_t *);
int (*cfg_init)(wilc_debug_func);
diff --git a/drivers/staging/wilc1000/wilc_wlan_cfg.c 
b/drivers/staging/wilc1000/wilc_wlan_cfg.c
index e5296c1..7007381 100644
--- a/drivers/staging/wilc1000/wilc_wlan_cfg.c
+++ b/drivers/staging/wilc1000/wilc_wlan_cfg.c
@@ -411,7 +411,7 @@ int wilc_wlan_cfg_set_wid(u8 *frame, u32 offset, u16 id, u8 
*buf, int size)
return ret;
 }
 
-static int wilc_wlan_cfg_get_wid(u8 *frame, u32 offset, u16 id)
+int wilc_wlan_cfg_get_wid(u8 *frame, u32 offset, u16 id)
 {
u8 *buf;
 
@@ -566,7 +566,6 @@ static int wilc_wlan_cfg_init(wilc_debug_func func)
 }
 
 wilc_cfg_func_t mac_cfg = {
-   wilc_wlan_cfg_get_wid,
wilc_wlan_cfg_get_wid_value,
wilc_wlan_cfg_indicate_rx,
wilc_wlan_cfg_init,
diff --git a/drivers/staging/wilc1000/wilc_wlan_cfg.h 
b/drivers/staging/wilc1000/wilc_wlan_cfg.h
index 326c716..2edd749 100644
--- a/drivers/staging/wilc1000/wilc_wlan_cfg.h
+++ b/drivers/staging/wilc1000/wilc_wlan_cfg.h
@@ -31,5 +31,6 @@ typedef struct {
 } wilc_cfg_str_t;
 
 int wilc_wlan_cfg_set_wid(u8 *frame, u32 offset, u16 id, u8 *buf, int size);
+int wilc_wlan_cfg_get_wid(u8 *frame, u32 offset, u16 id);
 
 #endif
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 05/10] staging: wilc1000: remove function pointer cfg_wid_set

2015-10-01 Thread Tony Cho
From: Glen Lee 

This patch removes function pointer cfg_wid_set and call the function
wilc_wlan_cfg_set_wid instead. Remove static from the function declaration.

Signed-off-by: Glen Lee 
Signed-off-by: Tony Cho 
---
 drivers/staging/wilc1000/wilc_wlan.c | 5 +++--
 drivers/staging/wilc1000/wilc_wlan.h | 1 -
 drivers/staging/wilc1000/wilc_wlan_cfg.c | 3 +--
 drivers/staging/wilc1000/wilc_wlan_cfg.h | 2 ++
 4 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index 9475ec7..442fe5f 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -9,6 +9,7 @@
 
 #include "wilc_wlan_if.h"
 #include "wilc_wlan.h"
+#include "wilc_wlan_cfg.h"
 
 /
  *
@@ -1763,8 +1764,8 @@ int wilc_wlan_cfg_set(int start, u32 wid, u8 *buffer, u32 
buffer_size,
p->cfg_frame_offset = 0;
 
offset = p->cfg_frame_offset;
-   ret_size = mac_cfg.cfg_wid_set(p->cfg_frame.frame, offset, (u16)wid,
-  buffer, buffer_size);
+   ret_size = wilc_wlan_cfg_set_wid(p->cfg_frame.frame, offset, (u16)wid,
+buffer, buffer_size);
offset += ret_size;
p->cfg_frame_offset = offset;
 
diff --git a/drivers/staging/wilc1000/wilc_wlan.h 
b/drivers/staging/wilc1000/wilc_wlan.h
index 1ba433c..90417d9 100644
--- a/drivers/staging/wilc1000/wilc_wlan.h
+++ b/drivers/staging/wilc1000/wilc_wlan.h
@@ -296,7 +296,6 @@ typedef struct {
 } wilc_cfg_rsp_t;
 
 typedef struct {
-   int (*cfg_wid_set)(u8 *, u32, u16, u8 *, int);
int (*cfg_wid_get)(u8 *, u32, u16);
int (*cfg_wid_get_val)(u16, u8 *, u32);
int (*rx_indicate)(u8 *, int, wilc_cfg_rsp_t *);
diff --git a/drivers/staging/wilc1000/wilc_wlan_cfg.c 
b/drivers/staging/wilc1000/wilc_wlan_cfg.c
index d761a37..e5296c1 100644
--- a/drivers/staging/wilc1000/wilc_wlan_cfg.c
+++ b/drivers/staging/wilc1000/wilc_wlan_cfg.c
@@ -386,7 +386,7 @@ static int wilc_wlan_parse_info_frame(u8 *info, int size)
  *
  /
 
-static int wilc_wlan_cfg_set_wid(u8 *frame, u32 offset, u16 id, u8 *buf, int 
size)
+int wilc_wlan_cfg_set_wid(u8 *frame, u32 offset, u16 id, u8 *buf, int size)
 {
u8 type = (id >> 12) & 0xf;
int ret = 0;
@@ -566,7 +566,6 @@ static int wilc_wlan_cfg_init(wilc_debug_func func)
 }
 
 wilc_cfg_func_t mac_cfg = {
-   wilc_wlan_cfg_set_wid,
wilc_wlan_cfg_get_wid,
wilc_wlan_cfg_get_wid_value,
wilc_wlan_cfg_indicate_rx,
diff --git a/drivers/staging/wilc1000/wilc_wlan_cfg.h 
b/drivers/staging/wilc1000/wilc_wlan_cfg.h
index ef88358..326c716 100644
--- a/drivers/staging/wilc1000/wilc_wlan_cfg.h
+++ b/drivers/staging/wilc1000/wilc_wlan_cfg.h
@@ -30,4 +30,6 @@ typedef struct {
u8 *str;
 } wilc_cfg_str_t;
 
+int wilc_wlan_cfg_set_wid(u8 *frame, u32 offset, u16 id, u8 *buf, int size);
+
 #endif
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 07/10] staging: wilc1000: remove function pointer cfg_wid_get_val

2015-10-01 Thread Tony Cho
From: Glen Lee 

This patch removes cfg_wid_get_val and call the function
wilc_wlan_cfg_get_wid_value. Remove static from the function declaration.

Signed-off-by: Glen Lee 
Signed-off-by: Tony Cho 
---
 drivers/staging/wilc1000/wilc_wlan.c | 2 +-
 drivers/staging/wilc1000/wilc_wlan.h | 1 -
 drivers/staging/wilc1000/wilc_wlan_cfg.c | 3 +--
 drivers/staging/wilc1000/wilc_wlan_cfg.h | 1 +
 4 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index fbc0829..a9a8d24 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -1833,7 +1833,7 @@ int wilc_wlan_cfg_get_val(u32 wid, u8 *buffer, u32 
buffer_size)
 {
int ret;
 
-   ret = mac_cfg.cfg_wid_get_val((u16)wid, buffer, buffer_size);
+   ret = wilc_wlan_cfg_get_wid_value((u16)wid, buffer, buffer_size);
 
return ret;
 }
diff --git a/drivers/staging/wilc1000/wilc_wlan.h 
b/drivers/staging/wilc1000/wilc_wlan.h
index bbf3e02..9386939 100644
--- a/drivers/staging/wilc1000/wilc_wlan.h
+++ b/drivers/staging/wilc1000/wilc_wlan.h
@@ -296,7 +296,6 @@ typedef struct {
 } wilc_cfg_rsp_t;
 
 typedef struct {
-   int (*cfg_wid_get_val)(u16, u8 *, u32);
int (*rx_indicate)(u8 *, int, wilc_cfg_rsp_t *);
int (*cfg_init)(wilc_debug_func);
 } wilc_cfg_func_t;
diff --git a/drivers/staging/wilc1000/wilc_wlan_cfg.c 
b/drivers/staging/wilc1000/wilc_wlan_cfg.c
index 7007381..55d2083 100644
--- a/drivers/staging/wilc1000/wilc_wlan_cfg.c
+++ b/drivers/staging/wilc1000/wilc_wlan_cfg.c
@@ -426,7 +426,7 @@ int wilc_wlan_cfg_get_wid(u8 *frame, u32 offset, u16 id)
return 2;
 }
 
-static int wilc_wlan_cfg_get_wid_value(u16 wid, u8 *buffer, u32 buffer_size)
+int wilc_wlan_cfg_get_wid_value(u16 wid, u8 *buffer, u32 buffer_size)
 {
u32 type = (wid >> 12) & 0xf;
int i, ret = 0;
@@ -566,7 +566,6 @@ static int wilc_wlan_cfg_init(wilc_debug_func func)
 }
 
 wilc_cfg_func_t mac_cfg = {
-   wilc_wlan_cfg_get_wid_value,
wilc_wlan_cfg_indicate_rx,
wilc_wlan_cfg_init,
 };
diff --git a/drivers/staging/wilc1000/wilc_wlan_cfg.h 
b/drivers/staging/wilc1000/wilc_wlan_cfg.h
index 2edd749..0efa2c5 100644
--- a/drivers/staging/wilc1000/wilc_wlan_cfg.h
+++ b/drivers/staging/wilc1000/wilc_wlan_cfg.h
@@ -32,5 +32,6 @@ typedef struct {
 
 int wilc_wlan_cfg_set_wid(u8 *frame, u32 offset, u16 id, u8 *buf, int size);
 int wilc_wlan_cfg_get_wid(u8 *frame, u32 offset, u16 id);
+int wilc_wlan_cfg_get_wid_value(u16 wid, u8 *buffer, u32 buffer_size);
 
 #endif
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 01/10] staging: wilc1000: remove typedef from enum

2015-10-01 Thread Tony Cho
This patch removes typedef from enumerated types defined in
coreconfigurator.c file and also changes their names to avoid CamelCase
naming convention as shown:

- tenuBasicFrmType to basic_frame_type
- tenuFrmSubtype to sub_frame_type
- tenuInfoElemID to info_element_id

Signed-off-by: Tony Cho 
---
 drivers/staging/wilc1000/coreconfigurator.c | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/wilc1000/coreconfigurator.c 
b/drivers/staging/wilc1000/coreconfigurator.c
index 136d207..63fde5b 100644
--- a/drivers/staging/wilc1000/coreconfigurator.c
+++ b/drivers/staging/wilc1000/coreconfigurator.c
@@ -18,16 +18,16 @@
BEACON_INTERVAL_LEN + 
CAP_INFO_LEN)
 
 /* Basic Frame Type Codes (2-bit) */
-typedef enum {
+enum basic_frame_type {
FRAME_TYPE_CONTROL = 0x04,
FRAME_TYPE_DATA= 0x08,
FRAME_TYPE_MANAGEMENT  = 0x00,
FRAME_TYPE_RESERVED= 0x0C,
FRAME_TYPE_FORCE_32BIT = 0x
-} tenuBasicFrmType;
+};
 
 /* Frame Type and Subtype Codes (6-bit) */
-typedef enum {
+enum sub_frame_type {
ASSOC_REQ = 0x00,
ASSOC_RSP = 0x10,
REASSOC_REQ   = 0x20,
@@ -64,10 +64,10 @@ typedef enum {
BLOCKACK_REQ  = 0x84,
BLOCKACK  = 0x94,
FRAME_SUBTYPE_FORCE_32BIT  = 0x
-} tenuFrmSubtype;
+};
 
 /* Element ID  of various Information Elements */
-typedef enum {
+enum info_element_id {
ISSID   = 0,   /* Service Set Identifier */
ISUPRATES   = 1,   /* Supported Rates*/
IFHPARMS= 2,   /* FH parameter set   */
@@ -108,7 +108,7 @@ typedef enum {
IWMM= 221, /* WMM parameters */
IWPAELEMENT = 221, /* WPA Information Element*/
INFOELEM_ID_FORCE_32BIT  = 0x
-} tenuInfoElemID;
+};
 
 
 typedef struct {
@@ -159,9 +159,9 @@ static inline u32 get_beacon_timestamp_hi(u8 *data)
 /* This function extracts the 'frame type and sub type' bits from the MAC*/
 /* header of the input frame.*/
 /* Returns the value in the LSB of the returned value.   */
-static inline tenuFrmSubtype get_sub_type(u8 *header)
+static inline enum sub_frame_type get_sub_type(u8 *header)
 {
-   return ((tenuFrmSubtype)(header[0] & 0xFC));
+   return ((enum sub_frame_type)(header[0] & 0xFC));
 }
 
 /* This function extracts the 'to ds' bit from the MAC header of the input   */
@@ -245,7 +245,7 @@ static inline u16 get_cap_info(u8 *data)
 {
u16 cap_info = 0;
u16 index= MAC_HDR_LEN;
-   tenuFrmSubtype st;
+   enum sub_frame_type st;
 
st = get_sub_type(data);
 
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 04/10] staging: wilc1000: Delete undefined DEBUG_MODE and it's related codes

2015-10-01 Thread Tony Cho
From: Glen Lee 

This patch removes undefined DEBUG_MODE and it's related codes.
We won't use this at the moment.

Signed-off-by: Glen Lee 
Signed-off-by: Tony Cho 
---
 drivers/staging/wilc1000/linux_wlan.c | 63 ---
 1 file changed, 63 deletions(-)

diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index c2e528f..c4915d3 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -128,60 +128,6 @@ static const struct net_device_ops wilc_netdev_ops = {
 
 };
 
-#ifdef DEBUG_MODE
-
-extern volatile int timeNo;
-
-#define DEGUG_BUFFER_LENGTH 1000
-volatile int WatchDogdebuggerCounter;
-char DebugBuffer[DEGUG_BUFFER_LENGTH + 20] = {0};
-static char *ps8current = DebugBuffer;
-
-void printk_later(const char *format, ...)
-{
-   va_list args;
-
-   va_start(args, format);
-   ps8current += vsprintf(ps8current, format, args);
-   va_end(args);
-   if ((ps8current - DebugBuffer) > DEGUG_BUFFER_LENGTH)
-   ps8current = DebugBuffer;
-
-}
-
-void dump_logs(void)
-{
-   if (DebugBuffer[0]) {
-   DebugBuffer[DEGUG_BUFFER_LENGTH] = 0;
-   PRINT_INFO(GENERIC_DBG, "early printed\n");
-   PRINT_D(GENERIC_DBG, ps8current + 1);
-   ps8current[1] = 0;
-   PRINT_INFO(GENERIC_DBG, "latest printed\n");
-   PRINT_D(GENERIC_DBG, DebugBuffer);
-   DebugBuffer[0] = 0;
-   ps8current = DebugBuffer;
-   }
-}
-
-void Reset_WatchDogdebugger(void)
-{
-   WatchDogdebuggerCounter = 0;
-}
-
-static int DebuggingThreadTask(void *vp)
-{
-   while (1) {
-   while (!WatchDogdebuggerCounter) {
-   PRINT_D(GENERIC_DBG, "Debug Thread Running %d\n", 
timeNo);
-   WatchDogdebuggerCounter = 1;
-   msleep(1);
-   }
-   dump_logs();
-   WatchDogdebuggerCounter = 0;
-   }
-}
-#endif
-
 static int dev_state_ev_handler(struct notifier_block *this, unsigned long 
event, void *ptr)
 {
struct in_ifaddr *dev_iface = (struct in_ifaddr *)ptr;
@@ -1072,15 +1018,6 @@ int wlan_initialize_threads(perInterface_wlan_t *nic)
ret = -ENOBUFS;
goto _fail_2;
}
-#ifdef DEBUG_MODE
-   PRINT_D(INIT_DBG, "Creating kthread for Debugging\n");
-   g_linux_wlan->txq_thread = kthread_run(DebuggingThreadTask, (void 
*)g_linux_wlan, "DebugThread");
-   if (g_linux_wlan->txq_thread == 0) {
-   PRINT_ER("couldn't create TXQ thread\n");
-   ret = -ENOBUFS;
-   goto _fail_2;
-   }
-#endif
/* wait for TXQ task to start. */
down(&g_linux_wlan->txq_thread_started);
 
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 03/10] staging: wilc1000: wilc_wfi_netdevice.h: remove unused variables

2015-10-01 Thread Tony Cho
From: Glen Lee 

This patch removes unused variable already_claim and hWILCWFIDrv_2.

Signed-off-by: Glen Lee 
Signed-off-by: Tony Cho 
---
 drivers/staging/wilc1000/wilc_wfi_netdevice.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wfi_netdevice.h 
b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
index 0403bc7..e553b0c 100644
--- a/drivers/staging/wilc1000/wilc_wfi_netdevice.h
+++ b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
@@ -125,7 +125,6 @@ struct wilc_priv {
struct net_device *dev;
struct napi_struct napi;
tstrWILC_WFIDrv *hWILCWFIDrv;
-   WILC_WFIDrvHandle hWILCWFIDrv_2;
tstrHostIFpmkidAttr pmkid_list;
struct WILC_WFI_stats netstats;
u8 WILC_WFI_wep_default;
@@ -190,7 +189,6 @@ typedef struct {
 
struct net_device *real_ndev;
 #ifdef WILC_SDIO
-   int already_claim;
struct sdio_func *wilc_sdio_func;
 #else
struct spi_device *wilc_spidev;
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 02/10] staging: wilc1000: coreconfigurator.c: remove unused struct

2015-10-01 Thread Tony Cho
This patch removes unused structure, tstrconfigPktInfo from the
coreconfigurator.c file.

Signed-off-by: Tony Cho 
---
 drivers/staging/wilc1000/coreconfigurator.c | 8 
 1 file changed, 8 deletions(-)

diff --git a/drivers/staging/wilc1000/coreconfigurator.c 
b/drivers/staging/wilc1000/coreconfigurator.c
index 63fde5b..65a130d 100644
--- a/drivers/staging/wilc1000/coreconfigurator.c
+++ b/drivers/staging/wilc1000/coreconfigurator.c
@@ -110,14 +110,6 @@ enum info_element_id {
INFOELEM_ID_FORCE_32BIT  = 0x
 };
 
-
-typedef struct {
-   char *pcRespBuffer;
-   s32 s32MaxRespBuffLen;
-   s32 s32BytesRead;
-   bool bRespRequired;
-} tstrConfigPktInfo;
-
 /* This function extracts the beacon period field from the beacon or probe   */
 /* response frame.   */
 static inline u16 get_beacon_period(u8 *data)
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [RESEND PATCH v2] mtd: nand: pass page number to ecc->write_xxx() methods

2015-10-01 Thread Brian Norris
On Thu, Oct 01, 2015 at 09:34:51PM +0200, Boris Brezillon wrote:
> The ->read_xxx() methods are all passed the page number the NAND controller
> is supposed to read, but ->write_xxx() do not have such a parameter.
> 
> This is a problem if we want to properly implement data
> scrambling/randomization in order to mitigate MLC sensibility to repeated
> pattern: to prevent bitflips in adjacent pages in the same block we need
> to avoid repeating the same pattern at the same offset in those pages,
> hence the randomizer/scrambler engine need to be passed the page value
> in order to adapt its seed accordingly.
> 
> Moreover, adding the page parameter to the ->write_xxx() methods add some
> consistency to the current API.
> 
> Signed-off-by: Boris Brezillon 
> CC: Josh Wu 
> CC: Ezequiel Garcia 
> CC: Maxime Ripard 
> CC: Greg Kroah-Hartman 
> CC: Huang Shijie 
> CC: Bryan Wu 
> CC: Stefan Agner 
> CC: de...@driverdev.osuosl.org
> CC: linux-arm-ker...@lists.infradead.org
> CC: linux-ker...@vger.kernel.org
> ---
> Sorry for the noise, I didn't send the correct patch version (the one
> fixing the compilation error in the doc4g driver).
> 
> Changes since v1:
> - rebased on l2-mtd/master
> - fixed compilation error in the doc4g driver

Didn't really look at the patch yet, but my build tests say:

drivers/mtd/nand/gpmi-nand/gpmi-nand.c: In function ‘gpmi_ecc_write_oob_raw’:
drivers/mtd/nand/gpmi-nand/gpmi-nand.c:1536:2: error: too few arguments to 
function ‘gpmi_ecc_write_page_raw’
drivers/mtd/nand/gpmi-nand/gpmi-nand.c:1446:12: note: declared here

Brian
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


solutions for your business

2015-10-01 Thread Jensen Lewis

Hey,

Hope you are doing well!
We provide email marketing service to a number of businesses.
We can help your business reach the next level and generate more business
leads.
Please contact us so I can go over options for you.

Thanks and regards,
Jensen Lewis
Contact: mihuiyu...@sina.com


___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 16/17] staging: comedi: quatech_daqp_cs: handle shared interrupt

2015-10-01 Thread H Hartley Sweeten
This is a PCMCIA driver and interrupts are always shared. Detect if
the hardware did not produce the interrupt and return IRQ_NONE so
that other drivers might handle it.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index c5c2fab..3c1ba5c 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -204,6 +204,9 @@ static irqreturn_t daqp_interrupt(int irq, void *dev_id)
return IRQ_NONE;
 
status = inb(dev->iobase + DAQP_STATUS);
+   if (!(status & DAQP_STATUS_EVENTS))
+   return IRQ_NONE;
+
while (!(status & DAQP_STATUS_FIFO_EMPTY)) {
unsigned short data;
 
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 15/17] staging: comedi: quatech_daqp_cs: tidy up multi-line comments

2015-10-01 Thread H Hartley Sweeten
Reformat the multi-line comments in the kernel CodingStyle.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 83 +++-
 1 file changed, 37 insertions(+), 46 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 7c17a1c..c5c2fab 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -1,51 +1,42 @@
-/*==
-
-comedi/drivers/quatech_daqp_cs.c
-
-Quatech DAQP PCMCIA data capture cards COMEDI client driver
-Copyright (C) 2000, 2003 Brent Baccala 
-The DAQP interface code in this file is released into the public domain.
-
-COMEDI - Linux Control and Measurement Device Interface
-Copyright (C) 1998 David A. Schleef 
-http://www.comedi.org/
-
-quatech_daqp_cs.c 1.10
-
-Documentation for the DAQP PCMCIA cards can be found on Quatech's site:
-
-   ftp://ftp.quatech.com/Manuals/daqp-208.pdf
-
-This manual is for both the DAQP-208 and the DAQP-308.
-
-What works:
-
-   - A/D conversion
-   - 8 channels
-   - 4 gain ranges
-   - ground ref or differential
-   - single-shot and timed both supported
-   - D/A conversion, single-shot
-   - digital I/O
-
-What doesn't:
-
-   - any kind of triggering - external or D/A channel 1
-   - the card's optional expansion board
-   - the card's timer (for anything other than A/D conversion)
-   - D/A update modes other than immediate (i.e, timed)
-   - fancier timing modes
-   - setting card's FIFO buffer thresholds to anything but default
-
-==*/
+/*
+ * quatech_daqp_cs.c
+ * Quatech DAQP PCMCIA data capture cards COMEDI client driver
+ * Copyright (C) 2000, 2003 Brent Baccala 
+ * The DAQP interface code in this file is released into the public domain.
+ *
+ * COMEDI - Linux Control and Measurement Device Interface
+ * Copyright (C) 1998 David A. Schleef 
+ * http://www.comedi.org/
+ *
+ * Documentation for the DAQP PCMCIA cards can be found on Quatech's site:
+ * ftp://ftp.quatech.com/Manuals/daqp-208.pdf
+ *
+ * This manual is for both the DAQP-208 and the DAQP-308.
+ *
+ * What works:
+ * - A/D conversion
+ * - 8 channels
+ * - 4 gain ranges
+ * - ground ref or differential
+ * - single-shot and timed both supported
+ * - D/A conversion, single-shot
+ * - digital I/O
+ *
+ * What doesn't:
+ * - any kind of triggering - external or D/A channel 1
+ * - the card's optional expansion board
+ * - the card's timer (for anything other than A/D conversion)
+ * - D/A update modes other than immediate (i.e, timed)
+ * - setting card's FIFO buffer thresholds to anything but default
+ */
 
 /*
-Driver: quatech_daqp_cs
-Description: Quatech DAQP PCMCIA data capture cards
-Author: Brent Baccala 
-Status: works
-Devices: [Quatech] DAQP-208 (daqp), DAQP-308
-*/
+ * Driver: quatech_daqp_cs
+ * Description: Quatech DAQP PCMCIA data capture cards
+ * Devices: [Quatech] DAQP-208 (quatech_daqp_cs), DAQP-308
+ * Author: Brent Baccala 
+ * Status: works
+ */
 
 #include 
 
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 17/17] staging: comedi: quatech_daqp_cs: tidy up register map defines

2015-10-01 Thread H Hartley Sweeten
Reorder the register map defines so that each register define is
followed by its bit defines.

For aesthetics, change all the register offsets to hex values and
use the BIT macro to define the register bits.

Also for aesthetics, move the DAQP_FIFO_SIZE and private data
definition after the register defines.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 172 ---
 1 file changed, 92 insertions(+), 80 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 3c1ba5c..0d39c89 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -42,96 +42,108 @@
 
 #include "../comedi_pcmcia.h"
 
-struct daqp_private {
-   unsigned int pacer_div;
-   unsigned char scanrate;
-   int stop;
-};
+/*
+ * Register I/O map
+ *
+ * The D/A and timer registers can be accessed with 16-bit or 8-bit I/O
+ * instructions. All other registers can only use 8-bit instructions.
+ *
+ * The FIFO and scanlist registers require two 8-bit instructions to
+ * access the 16-bit data. Data is transferred LSB then MSB.
+ */
+#define DAQP_FIFO  0x00
 
-/* The DAQP communicates with the system through a 16 byte I/O window. */
-
-#define DAQP_FIFO_SIZE 4096
-
-#define DAQP_FIFO  0
-#define DAQP_SCANLIST  1
-#define DAQP_CONTROL   2
-#define DAQP_STATUS2
-#define DAQP_DIGITAL_IO3
-#define DAQP_PACER_LOW 4
-#define DAQP_PACER_MID 5
-#define DAQP_PACER_HIGH6
-#define DAQP_COMMAND   7
-#define DAQP_DA8
-#define DAQP_TIMER 10
-#define DAQP_AUX   15
-
-#define DAQP_SCANLIST_DIFFERENTIAL 0x4000
-#define DAQP_SCANLIST_GAIN(x)  ((x) << 12)
-#define DAQP_SCANLIST_CHANNEL(x)   ((x) << 8)
-#define DAQP_SCANLIST_START0x0080
-#define DAQP_SCANLIST_EXT_GAIN(x)  ((x) << 4)
-#define DAQP_SCANLIST_EXT_CHANNEL(x)   (x)
+#define DAQP_SCANLIST  0x01
+#define DAQP_SCANLIST_DIFFERENTIAL BIT(14)
+#define DAQP_SCANLIST_GAIN(x)  (((x) & 0x3) << 12)
+#define DAQP_SCANLIST_CHANNEL(x)   (((x) & 0xf) << 8)
+#define DAQP_SCANLIST_STARTBIT(7)
+#define DAQP_SCANLIST_EXT_GAIN(x)  (((x) & 0x3) << 4)
+#define DAQP_SCANLIST_EXT_CHANNEL(x)   (((x) & 0xf) << 0)
 
+#define DAQP_CONTROL   0x02
 #define DAQP_CONTROL_PACER_CLK(x)  (((x) & 0x3) << 6)
 #define DAQP_CONTROL_PACER_CLK_EXT DAQP_CONTROL_PACER_CLK(0)
 #define DAQP_CONTROL_PACER_CLK_5MHZDAQP_CONTROL_PACER_CLK(1)
 #define DAQP_CONTROL_PACER_CLK_1MHZDAQP_CONTROL_PACER_CLK(2)
 #define DAQP_CONTROL_PACER_CLK_100KHZ  DAQP_CONTROL_PACER_CLK(3)
-#define DAQP_CONTORL_EXPANSION 0x20
-#define DAQP_CONTROL_EOS_INT_ENABLE0x10
-#define DAQP_CONTROL_FIFO_INT_ENABLE   0x08
-#define DAQP_CONTROL_TRIGGER_ONESHOT   0x00
-#define DAQP_CONTROL_TRIGGER_CONTINUOUS0x04
-#define DAQP_CONTROL_TRIGGER_INTERNAL  0x00
-#define DAQP_CONTROL_TRIGGER_EXTERNAL  0x02
-#define DAQP_CONTROL_TRIGGER_RISING0x00
-#define DAQP_CONTROL_TRIGGER_FALLING   0x01
-
-#define DAQP_STATUS_IDLE   0x80
-#define DAQP_STATUS_RUNNING0x40
-#define DAQP_STATUS_EVENTS 0x38
-#define DAQP_STATUS_DATA_LOST  0x20
-#define DAQP_STATUS_END_OF_SCAN0x10
-#define DAQP_STATUS_FIFO_THRESHOLD 0x08
-#define DAQP_STATUS_FIFO_FULL  0x04
-#define DAQP_STATUS_FIFO_NEARFULL  0x02
-#define DAQP_STATUS_FIFO_EMPTY 0x01
-
-#define DAQP_COMMAND_ARM   0x80
-#define DAQP_COMMAND_RSTF  0x40
-#define DAQP_COMMAND_RSTQ  0x20
-#define DAQP_COMMAND_STOP  0x10
-#define DAQP_COMMAND_LATCH 0x08
+#define DAQP_CONTORL_EXPANSION BIT(5)
+#define DAQP_CONTROL_EOS_INT_ENABLEBIT(4)
+#define DAQP_CONTROL_FIFO_INT_ENABLE   BIT(3)
+#define DAQP_CONTROL_TRIGGER_MODE  BIT(2)  /* 0=one-shot; 1=continuous */
+#define DAQP_CONTROL_TRIGGER_SRC   BIT(1)  /* 0=internal; 1=external */
+#define DAQP_CONTROL_TRIGGER_EDGE  BIT(0)  /* 0=rising; 1=falling */
+
+#define DAQP_STATUS0x02
+#define DAQP_STATUS_IDLE   BIT(7)
+#define DAQP_STATUS_RUNNINGBIT(6)
+#define DAQP_STATUS_DATA_LOST  BIT(5)
+#define DAQP_STATUS_END_OF_SCANBIT(4)
+#define DAQP_STATUS_FIFO_THRESHOLD BIT(3)
+#define DAQP_STATUS_FIFO_FULL  BIT(2)
+#define DAQP_STATUS_FIFO_NEARFULL  BIT(1)
+#define DAQP_STATUS_FIFO_EMPTY BIT(0)
+/* these bits clear when the Status register is read */
+#define DAQP_STATUS_EVENTS (DAQP_STATUS_DATA_LOST |\
+DAQP_STATUS_END_OF_SCAN |  \
+DAQP

[PATCH v2 14/17] staging: comedi: quatech_daqp_cs: only hook up cmd support if we have an IRQ

2015-10-01 Thread H Hartley Sweeten
Interrupts are only needed by this driver to support the analog input async
commands. Don't hook up the command support if pcmcia_request_irq() fails
instead of completely failing the (*auto_attach).

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 19 +++
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index b2dfc93..7c17a1c 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -670,25 +670,28 @@ static int daqp_auto_attach(struct comedi_device *dev,
 
link->priv = dev;
ret = pcmcia_request_irq(link, daqp_interrupt);
-   if (ret)
-   return ret;
+   if (ret == 0)
+   dev->irq = link->irq;
 
ret = comedi_alloc_subdevices(dev, 4);
if (ret)
return ret;
 
s = &dev->subdevices[0];
-   dev->read_subdev = s;
s->type = COMEDI_SUBD_AI;
-   s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DIFF | SDF_CMD_READ;
+   s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DIFF;
s->n_chan   = 8;
-   s->len_chanlist = 2048;
s->maxdata  = 0x;
s->range_table  = &range_daqp_ai;
s->insn_read= daqp_ai_insn_read;
-   s->do_cmdtest   = daqp_ai_cmdtest;
-   s->do_cmd   = daqp_ai_cmd;
-   s->cancel   = daqp_ai_cancel;
+   if (dev->irq) {
+   dev->read_subdev = s;
+   s->subdev_flags |= SDF_CMD_READ;
+   s->len_chanlist = 2048;
+   s->do_cmdtest   = daqp_ai_cmdtest;
+   s->do_cmd   = daqp_ai_cmd;
+   s->cancel   = daqp_ai_cancel;
+   }
 
s = &dev->subdevices[1];
s->type = COMEDI_SUBD_AO;
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 11/17] staging: comedi: quatech_daqp_cs: spaces preferred around that '<<'

2015-10-01 Thread H Hartley Sweeten
Fix the checkpatch.pl issues about:
CHECK: spaces preferred around that '<<' (ctx:VxV)

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 8ba7e4b..0d3cc2d 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -75,10 +75,10 @@ struct daqp_private {
 #define DAQP_AUX   15
 
 #define DAQP_SCANLIST_DIFFERENTIAL 0x4000
-#define DAQP_SCANLIST_GAIN(x)  ((x)<<12)
-#define DAQP_SCANLIST_CHANNEL(x)   ((x)<<8)
+#define DAQP_SCANLIST_GAIN(x)  ((x) << 12)
+#define DAQP_SCANLIST_CHANNEL(x)   ((x) << 8)
 #define DAQP_SCANLIST_START0x0080
-#define DAQP_SCANLIST_EXT_GAIN(x)  ((x)<<4)
+#define DAQP_SCANLIST_EXT_GAIN(x)  ((x) << 4)
 #define DAQP_SCANLIST_EXT_CHANNEL(x)   (x)
 
 #define DAQP_CONTROL_PACER_100kHz  0xc0
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 12/17] staging: comedi: quatech_daqp_cs: redefine pacer clock options

2015-10-01 Thread H Hartley Sweeten
For aesthetics, define a macro for the pacer clock options and rename
the CamelCase.

Remove the unnecessary local variable in daqp_ai_cmd() used to set the
control register.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 20 +---
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 0d3cc2d..1b12006 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -81,10 +81,11 @@ struct daqp_private {
 #define DAQP_SCANLIST_EXT_GAIN(x)  ((x) << 4)
 #define DAQP_SCANLIST_EXT_CHANNEL(x)   (x)
 
-#define DAQP_CONTROL_PACER_100kHz  0xc0
-#define DAQP_CONTROL_PACER_1MHz0x80
-#define DAQP_CONTROL_PACER_5MHz0x40
-#define DAQP_CONTROL_PACER_EXTERNAL0x00
+#define DAQP_CONTROL_PACER_CLK(x)  (((x) & 0x3) << 6)
+#define DAQP_CONTROL_PACER_CLK_EXT DAQP_CONTROL_PACER_CLK(0)
+#define DAQP_CONTROL_PACER_CLK_5MHZDAQP_CONTROL_PACER_CLK(1)
+#define DAQP_CONTROL_PACER_CLK_1MHZDAQP_CONTROL_PACER_CLK(2)
+#define DAQP_CONTROL_PACER_CLK_100KHZ  DAQP_CONTROL_PACER_CLK(3)
 #define DAQP_CONTORL_EXPANSION 0x20
 #define DAQP_CONTROL_EOS_INT_ENABLE0x10
 #define DAQP_CONTROL_FIFO_INT_ENABLE   0x08
@@ -434,7 +435,6 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
struct comedi_cmd *cmd = &s->async->cmd;
int counter;
int threshold;
-   int v;
 
if (devpriv->stop)
return -EIO;
@@ -547,12 +547,10 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
outb((DAQP_FIFO_SIZE - threshold) & 0xff, dev->iobase + DAQP_FIFO);
outb((DAQP_FIFO_SIZE - threshold) >> 8, dev->iobase + DAQP_FIFO);
 
-   /* Set trigger */
-
-   v = DAQP_CONTROL_TRIGGER_CONTINUOUS | DAQP_CONTROL_TRIGGER_INTERNAL
-   | DAQP_CONTROL_PACER_5MHz | DAQP_CONTROL_FIFO_INT_ENABLE;
-
-   outb(v, dev->iobase + DAQP_CONTROL);
+   /* 5 MHz pacer, FIFO threshold interrupt, continuous internal trigger */
+   outb(DAQP_CONTROL_PACER_CLK_5MHZ | DAQP_CONTROL_FIFO_INT_ENABLE |
+DAQP_CONTROL_TRIGGER_CONTINUOUS | DAQP_CONTROL_TRIGGER_INTERNAL,
+dev->iobase + DAQP_CONTROL);
 
/* Reset any pending interrupts (my card has a tendency to require
 * require multiple reads on the status register to achieve this)
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 09/17] staging: comedi: quatech_daqp_cs: use comedi_offset_munge() in ao (*insn_write)

2015-10-01 Thread H Hartley Sweeten
Use the comedi_offset_munge() helper to do the offset binary to two's
complement conversion when writing a new analog output value.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 8 +++-
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 96471fc..d098c4e 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -594,11 +594,9 @@ static int daqp_ao_insn_write(struct comedi_device *dev,
 
s->readback[chan] = val;
 
-   val &= 0x0fff;
-   val ^= 0x0800;  /* Flip the sign */
-   val |= (chan << 12);
-
-   outw(val, dev->iobase + DAQP_DA);
+   /* write the two's complement value to the channel */
+   outw((chan << 12) | comedi_offset_munge(s, val),
+dev->iobase + DAQP_DA);
}
 
return insn->n;
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 13/17] staging: comedi: quatech_daqp_cs: introduce daqp_clear_events()

2015-10-01 Thread H Hartley Sweeten
Introduce a helper function for the common code used to clear any
pending interrupts.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 52 
 1 file changed, 25 insertions(+), 27 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 1b12006..b2dfc93 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -151,6 +151,23 @@ static const struct comedi_lrange range_daqp_ai = {
}
 };
 
+static int daqp_clear_events(struct comedi_device *dev, int loops)
+{
+   unsigned int status;
+
+   /*
+* Reset any pending interrupts (my card has a tendency to require
+* require multiple reads on the status register to achieve this).
+*/
+   while (--loops) {
+   status = inb(dev->iobase + DAQP_STATUS);
+   if ((status & DAQP_STATUS_EVENTS) == 0)
+   return 0;
+   }
+   dev_err(dev->class_dev, "couldn't clear events in status register\n");
+   return -EBUSY;
+}
+
 static int daqp_ai_cancel(struct comedi_device *dev,
  struct comedi_subdevice *s)
 {
@@ -277,9 +294,8 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
 unsigned int *data)
 {
struct daqp_private *devpriv = dev->private;
-   int ret = 0;
+   int ret;
int i;
-   int counter = 1;
 
if (devpriv->stop)
return -EIO;
@@ -296,18 +312,9 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
/* one-shot internal trigger, no pacer, no interrupts */
outb(0, dev->iobase + DAQP_CONTROL);
 
-   /* Reset any pending interrupts (my card has a tendency to require
-* require multiple reads on the status register to achieve this)
-*/
-
-   while (--counter
-  && (inb(dev->iobase + DAQP_STATUS) & DAQP_STATUS_EVENTS))
-   ;
-   if (!counter) {
-   dev_err(dev->class_dev,
-   "couldn't clear interrupts in status register\n");
-   return -1;
-   }
+   ret = daqp_clear_events(dev, 1);
+   if (ret)
+   return ret;
 
for (i = 0; i < insn->n; i++) {
/* Start conversion */
@@ -433,8 +440,8 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
 {
struct daqp_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd;
-   int counter;
int threshold;
+   int ret;
 
if (devpriv->stop)
return -EIO;
@@ -552,18 +559,9 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
 DAQP_CONTROL_TRIGGER_CONTINUOUS | DAQP_CONTROL_TRIGGER_INTERNAL,
 dev->iobase + DAQP_CONTROL);
 
-   /* Reset any pending interrupts (my card has a tendency to require
-* require multiple reads on the status register to achieve this)
-*/
-   counter = 100;
-   while (--counter
-  && (inb(dev->iobase + DAQP_STATUS) & DAQP_STATUS_EVENTS))
-   ;
-   if (!counter) {
-   dev_err(dev->class_dev,
-   "couldn't clear interrupts in status register\n");
-   return -1;
-   }
+   ret = daqp_clear_events(dev, 100);
+   if (ret)
+   return ret;
 
/* Start conversion */
outb(DAQP_COMMAND_ARM | DAQP_COMMAND_FIFO_DATA | devpriv->scanrate,
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 10/17] staging: comedi: quatech_daqp_cs: use comedi_timeout() in ao (*insn_write)

2015-10-01 Thread H Hartley Sweeten
The data link between the D/A data port and the D/A converter is a serial
link. The serial link requires about 8ms to complete a transfer. Use the
comedi_timeout() helper to ensure that there is not a previous transfer
still happening before trying to write new data to the channel.

For aesthetics, save the readback value after updating the hardware.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 21 -
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index d098c4e..8ba7e4b 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -574,6 +574,19 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
return 0;
 }
 
+static int daqp_ao_empty(struct comedi_device *dev,
+struct comedi_subdevice *s,
+struct comedi_insn *insn,
+unsigned long context)
+{
+   unsigned int status;
+
+   status = inb(dev->iobase + DAQP_AUX);
+   if ((status & DAQP_AUX_DA_BUFFER) == 0)
+   return 0;
+   return -EBUSY;
+}
+
 static int daqp_ao_insn_write(struct comedi_device *dev,
  struct comedi_subdevice *s,
  struct comedi_insn *insn,
@@ -591,12 +604,18 @@ static int daqp_ao_insn_write(struct comedi_device *dev,
 
for (i = 0; i > insn->n; i++) {
unsigned val = data[i];
+   int ret;
 
-   s->readback[chan] = val;
+   /* D/A transfer rate is about 8ms */
+   ret = comedi_timeout(dev, s, insn, daqp_ao_empty, 0);
+   if (ret)
+   return ret;
 
/* write the two's complement value to the channel */
outw((chan << 12) | comedi_offset_munge(s, val),
 dev->iobase + DAQP_DA);
+
+   s->readback[chan] = val;
}
 
return insn->n;
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 07/17] staging: comedi: quatech_daqp_cs: remove 'interrupt_mode'

2015-10-01 Thread H Hartley Sweeten
The interrupt handler is now only used for the ai async command.
Remove the unnecessary 'interrupt_mode' from the private data and
tidy up the interrupt handler.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 70 ++--
 1 file changed, 28 insertions(+), 42 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index f337833..d2e9049 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -55,8 +55,6 @@ struct daqp_private {
unsigned int pacer_div;
unsigned char scanrate;
int stop;
-
-   enum { semaphore, buffer } interrupt_mode;
 };
 
 /* The DAQP communicates with the system through a 16 byte I/O window. */
@@ -168,15 +166,12 @@ static int daqp_ai_cancel(struct comedi_device *dev,
outb(0, dev->iobase + DAQP_CONTROL);
inb(dev->iobase + DAQP_STATUS);
 
-   devpriv->interrupt_mode = semaphore;
-
return 0;
 }
 
-static enum irqreturn daqp_interrupt(int irq, void *dev_id)
+static irqreturn_t daqp_interrupt(int irq, void *dev_id)
 {
struct comedi_device *dev = dev_id;
-   struct daqp_private *devpriv = dev->private;
struct comedi_subdevice *s = dev->read_subdev;
struct comedi_cmd *cmd = &s->async->cmd;
int loop_limit = 1;
@@ -185,49 +180,42 @@ static enum irqreturn daqp_interrupt(int irq, void 
*dev_id)
if (!dev->attached)
return IRQ_NONE;
 
-   switch (devpriv->interrupt_mode) {
-   case semaphore:
-   break;
+   status = inb(dev->iobase + DAQP_STATUS);
+   while (!(status & DAQP_STATUS_FIFO_EMPTY)) {
+   unsigned short data;
 
-   case buffer:
-   while (!((status = inb(dev->iobase + DAQP_STATUS))
-& DAQP_STATUS_FIFO_EMPTY)) {
-   unsigned short data;
+   if (status & DAQP_STATUS_DATA_LOST) {
+   s->async->events |= COMEDI_CB_OVERFLOW;
+   dev_warn(dev->class_dev, "data lost\n");
+   break;
+   }
 
-   if (status & DAQP_STATUS_DATA_LOST) {
-   s->async->events |= COMEDI_CB_OVERFLOW;
-   dev_warn(dev->class_dev, "data lost\n");
-   break;
-   }
+   data = inb(dev->iobase + DAQP_FIFO);
+   data |= inb(dev->iobase + DAQP_FIFO) << 8;
+   data ^= 0x8000;
 
-   data = inb(dev->iobase + DAQP_FIFO);
-   data |= inb(dev->iobase + DAQP_FIFO) << 8;
-   data ^= 0x8000;
+   comedi_buf_write_samples(s, &data, 1);
 
-   comedi_buf_write_samples(s, &data, 1);
+   if (cmd->stop_src == TRIG_COUNT &&
+   s->async->scans_done >= cmd->stop_arg) {
+   s->async->events |= COMEDI_CB_EOA;
+   break;
+   }
 
-   /* If there's a limit, decrement it
-* and stop conversion if zero
-*/
+   if ((loop_limit--) <= 0)
+   break;
 
-   if (cmd->stop_src == TRIG_COUNT &&
-   s->async->scans_done >= cmd->stop_arg) {
-   s->async->events |= COMEDI_CB_EOA;
-   break;
-   }
+   status = inb(dev->iobase + DAQP_STATUS);
+   }
 
-   if ((loop_limit--) <= 0)
-   break;
-   }
+   if (loop_limit <= 0) {
+   dev_warn(dev->class_dev,
+"loop_limit reached in daqp_interrupt()\n");
+   s->async->events |= COMEDI_CB_ERROR;
+   }
 
-   if (loop_limit <= 0) {
-   dev_warn(dev->class_dev,
-"loop_limit reached in daqp_interrupt()\n");
-   s->async->events |= COMEDI_CB_ERROR;
-   }
+   comedi_handle_events(dev, s);
 
-   comedi_handle_events(dev, s);
-   }
return IRQ_HANDLED;
 }
 
@@ -570,8 +558,6 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
return -1;
}
 
-   devpriv->interrupt_mode = buffer;
-
/* Start conversion */
outb(DAQP_COMMAND_ARM | DAQP_COMMAND_FIFO_DATA | devpriv->scanrate,
 dev->iobase + DAQP_COMMAND);
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 08/17] staging: comedi: quatech_daqp_cs: introduce daqp_ai_get_sample()

2015-10-01 Thread H Hartley Sweeten
Introduce a helper function to get a two's complement sample from
the FIFO and munge it to the offset binary format that comedi uses.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
v2: as pointed out by the kbuild test robot (less than a hour after
posting the series), the function should be static.

 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 23 ---
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index d2e9049..96471fc 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -169,6 +169,20 @@ static int daqp_ai_cancel(struct comedi_device *dev,
return 0;
 }
 
+static unsigned int daqp_ai_get_sample(struct comedi_device *dev,
+  struct comedi_subdevice *s)
+{
+   unsigned int val;
+
+   /*
+* Get a two's complement sample from the FIFO and
+* return the munged offset binary value.
+*/
+   val = inb(dev->iobase + DAQP_FIFO);
+   val |= inb(dev->iobase + DAQP_FIFO) << 8;
+   return comedi_offset_munge(s, val);
+}
+
 static irqreturn_t daqp_interrupt(int irq, void *dev_id)
 {
struct comedi_device *dev = dev_id;
@@ -190,10 +204,7 @@ static irqreturn_t daqp_interrupt(int irq, void *dev_id)
break;
}
 
-   data = inb(dev->iobase + DAQP_FIFO);
-   data |= inb(dev->iobase + DAQP_FIFO) << 8;
-   data ^= 0x8000;
-
+   data = daqp_ai_get_sample(dev, s);
comedi_buf_write_samples(s, &data, 1);
 
if (cmd->stop_src == TRIG_COUNT &&
@@ -309,9 +320,7 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
/* clear the status event flags */
inb(dev->iobase + DAQP_STATUS);
 
-   data[i] = inb(dev->iobase + DAQP_FIFO);
-   data[i] |= inb(dev->iobase + DAQP_FIFO) << 8;
-   data[i] ^= 0x8000;
+   data[i] = daqp_ai_get_sample(dev, s);
}
 
/* stop any conversions and clear the status event flags */
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 05/17] staging: comedi: quatech_daqp_cs: don't use interrupts for ai (*insn_read)

2015-10-01 Thread H Hartley Sweeten
The comedi (*insn_read) functions are supposed to do simple one-shot
reading of an analog input channel. Currently this driver enables
interrupts and uses wait_for_completion_interruptible() to allow the
interrupt routine to let the analog input (*insn_read) know that
the end-of-conversion has occured.

Simplify the function by using the comedi_timeout() helper to check
the aux status register to see when the conversion is finished.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 59 +++-
 1 file changed, 28 insertions(+), 31 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index de28224..dbb8ffc 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -48,8 +48,6 @@ Devices: [Quatech] DAQP-208 (daqp), DAQP-308
 */
 
 #include 
-#include 
-#include 
 
 #include "../comedi_pcmcia.h"
 
@@ -59,8 +57,6 @@ struct daqp_private {
int stop;
 
enum { semaphore, buffer } interrupt_mode;
-
-   struct completion eos;
 };
 
 /* The DAQP communicates with the system through a 16 byte I/O window. */
@@ -175,15 +171,6 @@ static int daqp_ai_cancel(struct comedi_device *dev, 
struct comedi_subdevice *s)
return 0;
 }
 
-/* Interrupt handler
- *
- * Operates in one of two modes.  If devpriv->interrupt_mode is
- * 'semaphore', just signal the devpriv->eos completion and return
- * (one-shot mode).  Otherwise (continuous mode), read data in from
- * the card, transfer it to the buffer provided by the higher-level
- * comedi kernel module, and signal various comedi callback routines,
- * which run pretty quick.
- */
 static enum irqreturn daqp_interrupt(int irq, void *dev_id)
 {
struct comedi_device *dev = dev_id;
@@ -198,7 +185,6 @@ static enum irqreturn daqp_interrupt(int irq, void *dev_id)
 
switch (devpriv->interrupt_mode) {
case semaphore:
-   complete(&devpriv->eos);
break;
 
case buffer:
@@ -270,15 +256,27 @@ static void daqp_ai_set_scanlist(struct comedi_device 
*dev,
}
 }
 
-/* One-shot analog data acquisition routine */
+static int daqp_ai_eos(struct comedi_device *dev,
+  struct comedi_subdevice *s,
+  struct comedi_insn *insn,
+  unsigned long context)
+{
+   unsigned int status;
+
+   status = inb(dev->iobase + DAQP_AUX);
+   if (status & DAQP_AUX_CONVERSION)
+   return 0;
+   return -EBUSY;
+}
 
 static int daqp_ai_insn_read(struct comedi_device *dev,
 struct comedi_subdevice *s,
-struct comedi_insn *insn, unsigned int *data)
+struct comedi_insn *insn,
+unsigned int *data)
 {
struct daqp_private *devpriv = dev->private;
+   int ret = 0;
int i;
-   int v;
int counter = 1;
 
if (devpriv->stop)
@@ -296,12 +294,8 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
 
outb(DAQP_COMMAND_RSTF, dev->iobase + DAQP_COMMAND);
 
-   /* Set trigger */
-
-   v = DAQP_CONTROL_TRIGGER_ONESHOT | DAQP_CONTROL_TRIGGER_INTERNAL
-   | DAQP_CONTROL_PACER_100kHz | DAQP_CONTROL_EOS_INT_ENABLE;
-
-   outb(v, dev->iobase + DAQP_CONTROL);
+   /* one-shot internal trigger, no pacer, no interrupts */
+   outb(0, dev->iobase + DAQP_CONTROL);
 
/* Reset any pending interrupts (my card has a tendency to require
 * require multiple reads on the status register to achieve this)
@@ -316,25 +310,28 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
return -1;
}
 
-   init_completion(&devpriv->eos);
-   devpriv->interrupt_mode = semaphore;
-
for (i = 0; i < insn->n; i++) {
/* Start conversion */
outb(DAQP_COMMAND_ARM | DAQP_COMMAND_FIFO_DATA,
 dev->iobase + DAQP_COMMAND);
 
-   /* Wait for interrupt service routine to unblock completion */
-   /* Maybe could use a timeout here, but it's interruptible */
-   if (wait_for_completion_interruptible(&devpriv->eos))
-   return -EINTR;
+   ret = comedi_timeout(dev, s, insn, daqp_ai_eos, 0);
+   if (ret)
+   break;
+
+   /* clear the status event flags */
+   inb(dev->iobase + DAQP_STATUS);
 
data[i] = inb(dev->iobase + DAQP_FIFO);
data[i] |= inb(dev->iobase + DAQP_FIFO) << 8;
data[i] ^= 0x8000;
}
 
-   return insn->n;
+   /* stop any conversions and clear the status event flags */
+   outb(DAQP_COMMAND_STOP, dev->iobase + DAQP_COMMAND);
+   inb(dev->iobase + DAQP_STATUS);
+
+   return

[PATCH v2 06/17] staging: comedi: quatech_daqp_cs: fix daqp_ai_cancel()

2015-10-01 Thread H Hartley Sweeten
Make sure interrupts are disabled and the event flags are cleared when
the analog input async command is canceled.

Remove the unnecessary calls to stop any running conversions in the
(*insn_read) and (*do_cmd) functions. The comedi core will only call
these functions if the subdevice is not busy (it has already been
canceled).

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 20 
 1 file changed, 8 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index dbb8ffc..f337833 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -152,19 +152,21 @@ static const struct comedi_lrange range_daqp_ai = {
}
 };
 
-/* Cancel a running acquisition */
-
-static int daqp_ai_cancel(struct comedi_device *dev, struct comedi_subdevice 
*s)
+static int daqp_ai_cancel(struct comedi_device *dev,
+ struct comedi_subdevice *s)
 {
struct daqp_private *devpriv = dev->private;
 
if (devpriv->stop)
return -EIO;
 
+   /*
+* Stop any conversions, disable interrupts, and clear
+* the status event flags.
+*/
outb(DAQP_COMMAND_STOP, dev->iobase + DAQP_COMMAND);
-
-   /* flush any linguring data in FIFO - superfluous here */
-   /* outb(DAQP_COMMAND_RSTF, dev->iobase+DAQP_COMMAND); */
+   outb(0, dev->iobase + DAQP_CONTROL);
+   inb(dev->iobase + DAQP_STATUS);
 
devpriv->interrupt_mode = semaphore;
 
@@ -282,9 +284,6 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
if (devpriv->stop)
return -EIO;
 
-   /* Stop any running conversion */
-   daqp_ai_cancel(dev, s);
-
outb(0, dev->iobase + DAQP_AUX);
 
/* Program one scan list entry */
@@ -443,9 +442,6 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
if (devpriv->stop)
return -EIO;
 
-   /* Stop any running conversion */
-   daqp_ai_cancel(dev, s);
-
outb(0, dev->iobase + DAQP_AUX);
 
/* Program pacer clock */
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 04/17] staging: comedi: quatech_daqp_cs: tidy up daqp_ai_set_one_scanlist_entry()

2015-10-01 Thread H Hartley Sweeten
Clarify the scan list programming a bit by refactoring this function to program
the entire scan list instead of just a single entry. Move the necessary reset
of the scan list into this function. Rename the function.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 49 +++-
 1 file changed, 22 insertions(+), 27 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 7c8f081..de28224 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -243,25 +243,31 @@ static enum irqreturn daqp_interrupt(int irq, void 
*dev_id)
return IRQ_HANDLED;
 }
 
-static void daqp_ai_set_one_scanlist_entry(struct comedi_device *dev,
-  unsigned int chanspec,
-  int start)
+static void daqp_ai_set_scanlist(struct comedi_device *dev,
+unsigned int *chanspec, int len)
 {
-   unsigned int chan = CR_CHAN(chanspec);
-   unsigned int range = CR_RANGE(chanspec);
-   unsigned int aref = CR_AREF(chanspec);
-   unsigned int val;
+   int i;
+
+   /* Reset scan list queue */
+   outb(DAQP_COMMAND_RSTQ, dev->iobase + DAQP_COMMAND);
 
-   val = DAQP_SCANLIST_CHANNEL(chan) | DAQP_SCANLIST_GAIN(range);
+   for (i = 0; i < len; i++) {
+   unsigned int chan = CR_CHAN(chanspec[i]);
+   unsigned int range = CR_RANGE(chanspec[i]);
+   unsigned int aref = CR_AREF(chanspec[i]);
+   unsigned int val;
 
-   if (aref == AREF_DIFF)
-   val |= DAQP_SCANLIST_DIFFERENTIAL;
+   val = DAQP_SCANLIST_CHANNEL(chan) | DAQP_SCANLIST_GAIN(range);
 
-   if (start)
-   val |= DAQP_SCANLIST_START;
+   if (aref == AREF_DIFF)
+   val |= DAQP_SCANLIST_DIFFERENTIAL;
 
-   outb(val & 0xff, dev->iobase + DAQP_SCANLIST);
-   outb((val >> 8) & 0xff, dev->iobase + DAQP_SCANLIST);
+   if (i == 0)
+   val |= DAQP_SCANLIST_START;
+
+   outb(val & 0xff, dev->iobase + DAQP_SCANLIST);
+   outb((val >> 8) & 0xff, dev->iobase + DAQP_SCANLIST);
+   }
 }
 
 /* One-shot analog data acquisition routine */
@@ -283,11 +289,8 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
 
outb(0, dev->iobase + DAQP_AUX);
 
-   /* Reset scan list queue */
-   outb(DAQP_COMMAND_RSTQ, dev->iobase + DAQP_COMMAND);
-
/* Program one scan list entry */
-   daqp_ai_set_one_scanlist_entry(dev, insn->chanspec, 1);
+   daqp_ai_set_scanlist(dev, &insn->chanspec, 1);
 
/* Reset data FIFO (see page 28 of DAQP User's Manual) */
 
@@ -438,7 +441,6 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
struct comedi_cmd *cmd = &s->async->cmd;
int counter;
int threshold;
-   int i;
int v;
 
if (devpriv->stop)
@@ -449,20 +451,13 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
 
outb(0, dev->iobase + DAQP_AUX);
 
-   /* Reset scan list queue */
-   outb(DAQP_COMMAND_RSTQ, dev->iobase + DAQP_COMMAND);
-
/* Program pacer clock */
outb(devpriv->pacer_div & 0xff, dev->iobase + DAQP_PACER_LOW);
outb((devpriv->pacer_div >> 8) & 0xff, dev->iobase + DAQP_PACER_MID);
outb((devpriv->pacer_div >> 16) & 0xff, dev->iobase + DAQP_PACER_HIGH);
 
/* Program scan list */
-   for (i = 0; i < cmd->chanlist_len; i++) {
-   int start = (i == 0);
-
-   daqp_ai_set_one_scanlist_entry(dev, cmd->chanlist[i], start);
-   }
+   daqp_ai_set_scanlist(dev, cmd->chanlist, cmd->chanlist_len);
 
/* Now it's time to program the FIFO threshold, basically the
 * number of samples the card will buffer before it interrupts
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 03/17] staging: comedi: quatech_daqp_cs: fix ai cmd timing

2015-10-01 Thread H Hartley Sweeten
According to the users manual, the conversion timing (scanrate) is fixed
to 100, 50, or 25 kHz. The pacer clock is then used to trigger each scan.

Currently this driver tries to fake other conversion speeds by always
sampling the inputs at 100 kHz and using the pacer clock to trigger each
conversion. It does this by setting the SCANLIST_START bit for each
entry in the scan list. According to the users manual, this bit has to be
set for the first (and ONLY the first) entry of the scan list.

Fix the ai (*do_cmdtest) to properly validate the command timing and allow
the conversion time to be set.

Cleanup the ai (*do_cmd) to set the timing correctly.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 115 ---
 1 file changed, 40 insertions(+), 75 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index b2effb8..7c8f081 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -54,6 +54,8 @@ Devices: [Quatech] DAQP-208 (daqp), DAQP-308
 #include "../comedi_pcmcia.h"
 
 struct daqp_private {
+   unsigned int pacer_div;
+   unsigned char scanrate;
int stop;
 
enum { semaphore, buffer } interrupt_mode;
@@ -114,9 +116,10 @@ struct daqp_private {
 #define DAQP_COMMAND_RSTQ  0x20
 #define DAQP_COMMAND_STOP  0x10
 #define DAQP_COMMAND_LATCH 0x08
-#define DAQP_COMMAND_100kHz0x00
-#define DAQP_COMMAND_50kHz 0x02
-#define DAQP_COMMAND_25kHz 0x04
+#define DAQP_COMMAND_SCANRATE(x)   (((x) & 0x3) << 1)
+#define DAQP_COMMAND_SCANRATE_100KHZ   DAQP_COMMAND_SCANRATE(0)
+#define DAQP_COMMAND_SCANRATE_50KHZDAQP_COMMAND_SCANRATE(1)
+#define DAQP_COMMAND_SCANRATE_25KHZDAQP_COMMAND_SCANRATE(2)
 #define DAQP_COMMAND_FIFO_DATA 0x01
 #define DAQP_COMMAND_FIFO_PROGRAM  0x00
 
@@ -348,25 +351,18 @@ static int daqp_ns_to_timer(unsigned int *ns, unsigned 
int flags)
return timer;
 }
 
-/* cmdtest tests a particular command to see if it is valid.
- * Using the cmdtest ioctl, a user can create a valid cmd
- * and then have it executed by the cmd ioctl.
- *
- * cmdtest returns 1,2,3,4 or 0, depending on which tests
- * the command passes.
- */
-
 static int daqp_ai_cmdtest(struct comedi_device *dev,
-  struct comedi_subdevice *s, struct comedi_cmd *cmd)
+  struct comedi_subdevice *s,
+  struct comedi_cmd *cmd)
 {
+   struct daqp_private *devpriv = dev->private;
int err = 0;
unsigned int arg;
 
/* Step 1 : check if triggers are trivially valid */
 
err |= comedi_check_trigger_src(&cmd->start_src, TRIG_NOW);
-   err |= comedi_check_trigger_src(&cmd->scan_begin_src,
-   TRIG_TIMER | TRIG_FOLLOW);
+   err |= comedi_check_trigger_src(&cmd->scan_begin_src, TRIG_TIMER);
err |= comedi_check_trigger_src(&cmd->convert_src,
TRIG_TIMER | TRIG_NOW);
err |= comedi_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
@@ -377,7 +373,6 @@ static int daqp_ai_cmdtest(struct comedi_device *dev,
 
/* Step 2a : make sure trigger sources are unique */
 
-   err |= comedi_check_trigger_is_unique(cmd->scan_begin_src);
err |= comedi_check_trigger_is_unique(cmd->convert_src);
err |= comedi_check_trigger_is_unique(cmd->stop_src);
 
@@ -390,28 +385,30 @@ static int daqp_ai_cmdtest(struct comedi_device *dev,
 
err |= comedi_check_trigger_arg_is(&cmd->start_arg, 0);
 
-#define MAX_SPEED  1   /* 100 kHz - in nanoseconds */
-
-   if (cmd->scan_begin_src == TRIG_TIMER) {
-   err |= comedi_check_trigger_arg_min(&cmd->scan_begin_arg,
-   MAX_SPEED);
-   }
-
-   /* If both scan_begin and convert are both timer values, the only
-* way that can make sense is if the scan time is the number of
-* conversions times the convert time
-*/
-
-   if (cmd->scan_begin_src == TRIG_TIMER && cmd->convert_src == TRIG_TIMER
-   && cmd->scan_begin_arg != cmd->convert_arg * cmd->scan_end_arg) {
-   err |= -EINVAL;
-   }
-
+   /* 100, 50, and 25 kHz scanrates (conversion times) are supported */
if (cmd->convert_src == TRIG_TIMER) {
-   err |= comedi_check_trigger_arg_min(&cmd->convert_arg,
-   MAX_SPEED);
+   if (cmd->convert_arg <= 1) {
+   devpriv->scanrate = DAQP_COMMAND_SCANRATE_100KHZ;
+   arg = 1;/* 100 kHz (in ns) */
+   } else if (cmd->convert_arg <= 2) {
+   devpriv->scanrate = DAQP_COMMAND_

[PATCH v2 00/17] staging: comedi: quatech_daqp_cs: cleanup driver

2015-10-01 Thread H Hartley Sweeten
Following is the cleanup series for the comedi quatech_daqp_cs PCMCIA
driver.

v2: fix patch 08/17 as pointed out by the kbuild test robot
daqp_ai_get_sample() should be static

H Hartley Sweeten (17):
  staging: comedi: quatech_daqp_cs: there are 4 digital outputs
  staging: comedi: quatech_daqp_cs: there are 4 digital inputs
  staging: comedi: quatech_daqp_cs: fix ai cmd timing
  staging: comedi: quatech_daqp_cs: tidy up daqp_ai_set_one_scanlist_entry()
  staging: comedi: quatech_daqp_cs: don't use interrupts for ai (*insn_read)
  staging: comedi: quatech_daqp_cs: fix daqp_ai_cancel()
  staging: comedi: quatech_daqp_cs: remove 'interrupt_mode'
  staging: comedi: quatech_daqp_cs: introduce daqp_ai_get_sample()
  staging: comedi: quatech_daqp_cs: use comedi_offset_munge() in ao 
(*insn_write)
  staging: comedi: quatech_daqp_cs: use comedi_timeout() in ao (*insn_write)
  staging: comedi: quatech_daqp_cs: spaces preferred around that '<<'
  staging: comedi: quatech_daqp_cs: redefine pacer clock options
  staging: comedi: quatech_daqp_cs: introduce daqp_clear_events()
  staging: comedi: quatech_daqp_cs: only hook up cmd support if we have an IRQ
  staging: comedi: quatech_daqp_cs: tidy up multi-line comments
  staging: comedi: quatech_daqp_cs: handle shared interrupt
  staging: comedi: quatech_daqp_cs: tidy up register map defines

 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 710 +++
 1 file changed, 349 insertions(+), 361 deletions(-)

-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 02/17] staging: comedi: quatech_daqp_cs: there are 4 digital inputs

2015-10-01 Thread H Hartley Sweeten
This board has 4 digital inputs not 1. Fix the subdevice init.

The digital input lines are shared with other functions. Add a
comment about this.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 13 -
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index a4a5244..b2effb8 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -741,10 +741,21 @@ static int daqp_auto_attach(struct comedi_device *dev,
if (ret)
return ret;
 
+   /*
+* Digital Input subdevice
+* NOTE: The digital input lines are shared:
+*
+* Chan  Normal ModeExpansion Mode
+*   -  
+*  0DI0, ext. trigger  Same as normal mode
+*  1DI1External gain select, lo bit
+*  2DI2, ext. clockSame as normal mode
+*  3DI3External gain select, hi bit
+*/
s = &dev->subdevices[2];
s->type = COMEDI_SUBD_DI;
s->subdev_flags = SDF_READABLE;
-   s->n_chan   = 1;
+   s->n_chan   = 4;
s->maxdata  = 1;
s->insn_bits= daqp_di_insn_bits;
 
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 01/17] staging: comedi: quatech_daqp_cs: there are 4 digital outputs

2015-10-01 Thread H Hartley Sweeten
This board has 4 digital outputs not 1. Fix the subdevice init.

The digital output lines are used for the external channel selection
when the expansion mode is enabled. Add a comment about this.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 152cb14..a4a5244 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -748,10 +748,17 @@ static int daqp_auto_attach(struct comedi_device *dev,
s->maxdata  = 1;
s->insn_bits= daqp_di_insn_bits;
 
+   /*
+* Digital Output subdevice
+* NOTE: The digital output lines share the same pins on the
+* interface connector as the four external channel selection
+* bits. If expansion mode is used the digital outputs do not
+* work.
+*/
s = &dev->subdevices[3];
s->type = COMEDI_SUBD_DO;
s->subdev_flags = SDF_WRITABLE;
-   s->n_chan   = 1;
+   s->n_chan   = 4;
s->maxdata  = 1;
s->insn_bits= daqp_do_insn_bits;
 
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH 08/12] staging: wilc1000: use s8 instead of int8_t

2015-10-01 Thread Chaehyun Lim
On Fri, Oct 2, 2015 at 12:40 AM, Dan Carpenter  wrote:
> On Thu, Oct 01, 2015 at 10:43:55PM +0900, Chaehyun Lim wrote:
>> This patch replaces int8_t with s8 that is a preferred type.
>>
>
> It would be better to just use int.

I always appreciate your comment. I've sent a patch before after
changing by int, but it was rejected.
At that time I had a suggestion to be careful to change data type, so
I just change by s8 now.

Thanks
Chaehyun Lim
>
> regards,
> dan carpenter
>
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 1/1] storvsc: get rid of bounce buffer

2015-10-01 Thread K. Y. Srinivasan
From: Vitaly Kuznetsov 

Storvsc driver needs to ensure there are no 'holes' in the presented
sg list (all segments in the middle of the list need to be of PAGE_SIZE).
When a hole is detected storvsc driver creates a 'bounce sgl' without
holes and copies data over with copy_{to,from}_bounce_buffer() functions.
Setting virt_boundary_mask to PAGE_SIZE - 1 guarantees we'll never see
such holes so we can significantly simplify the driver. This is also
supposed to bring us some performance improvement for certain workloads
as we eliminate copying.

Reported-by: Radim Kr.má
Signed-off-by: Vitaly Kuznetsov 
Reviewed-by: K. Y. Srinivasan 
Tested-by: Alex Ng 
Signed-off-by: K. Y. Srinivasan 
---
 drivers/scsi/storvsc_drv.c |  286 +---
 1 files changed, 5 insertions(+), 281 deletions(-)

diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
index 9c8db21..072c11e 100644
--- a/drivers/scsi/storvsc_drv.c
+++ b/drivers/scsi/storvsc_drv.c
@@ -393,9 +393,6 @@ static void storvsc_on_channel_callback(void *context);
 struct storvsc_cmd_request {
struct scsi_cmnd *cmd;
 
-   unsigned int bounce_sgl_count;
-   struct scatterlist *bounce_sgl;
-
struct hv_device *device;
 
/* Synchronize the request/response if needed */
@@ -586,241 +583,6 @@ get_in_err:
 
 }
 
-static void destroy_bounce_buffer(struct scatterlist *sgl,
- unsigned int sg_count)
-{
-   int i;
-   struct page *page_buf;
-
-   for (i = 0; i < sg_count; i++) {
-   page_buf = sg_page((&sgl[i]));
-   if (page_buf != NULL)
-   __free_page(page_buf);
-   }
-
-   kfree(sgl);
-}
-
-static int do_bounce_buffer(struct scatterlist *sgl, unsigned int sg_count)
-{
-   int i;
-
-   /* No need to check */
-   if (sg_count < 2)
-   return -1;
-
-   /* We have at least 2 sg entries */
-   for (i = 0; i < sg_count; i++) {
-   if (i == 0) {
-   /* make sure 1st one does not have hole */
-   if (sgl[i].offset + sgl[i].length != PAGE_SIZE)
-   return i;
-   } else if (i == sg_count - 1) {
-   /* make sure last one does not have hole */
-   if (sgl[i].offset != 0)
-   return i;
-   } else {
-   /* make sure no hole in the middle */
-   if (sgl[i].length != PAGE_SIZE || sgl[i].offset != 0)
-   return i;
-   }
-   }
-   return -1;
-}
-
-static struct scatterlist *create_bounce_buffer(struct scatterlist *sgl,
-   unsigned int sg_count,
-   unsigned int len,
-   int write)
-{
-   int i;
-   int num_pages;
-   struct scatterlist *bounce_sgl;
-   struct page *page_buf;
-   unsigned int buf_len = ((write == WRITE_TYPE) ? 0 : PAGE_SIZE);
-
-   num_pages = ALIGN(len, PAGE_SIZE) >> PAGE_SHIFT;
-
-   bounce_sgl = kcalloc(num_pages, sizeof(struct scatterlist), GFP_ATOMIC);
-   if (!bounce_sgl)
-   return NULL;
-
-   sg_init_table(bounce_sgl, num_pages);
-   for (i = 0; i < num_pages; i++) {
-   page_buf = alloc_page(GFP_ATOMIC);
-   if (!page_buf)
-   goto cleanup;
-   sg_set_page(&bounce_sgl[i], page_buf, buf_len, 0);
-   }
-
-   return bounce_sgl;
-
-cleanup:
-   destroy_bounce_buffer(bounce_sgl, num_pages);
-   return NULL;
-}
-
-/* Assume the original sgl has enough room */
-static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
-   struct scatterlist *bounce_sgl,
-   unsigned int orig_sgl_count,
-   unsigned int bounce_sgl_count)
-{
-   int i;
-   int j = 0;
-   unsigned long src, dest;
-   unsigned int srclen, destlen, copylen;
-   unsigned int total_copied = 0;
-   unsigned long bounce_addr = 0;
-   unsigned long dest_addr = 0;
-   unsigned long flags;
-   struct scatterlist *cur_dest_sgl;
-   struct scatterlist *cur_src_sgl;
-
-   local_irq_save(flags);
-   cur_dest_sgl = orig_sgl;
-   cur_src_sgl = bounce_sgl;
-   for (i = 0; i < orig_sgl_count; i++) {
-   dest_addr = (unsigned long)
-   kmap_atomic(sg_page(cur_dest_sgl)) +
-   cur_dest_sgl->offset;
-   dest = dest_addr;
-   destlen = cur_dest_sgl->length;
-
-   if (bounce_addr == 0)
-   bounce_addr = (unsigned long)kmap_atomic(
-   sg_page(cur_src_sgl));

RE: [PATCH 0/3] scsi: Some miscellaneous fixes

2015-10-01 Thread KY Srinivasan


> -Original Message-
> From: Vitaly Kuznetsov [mailto:vkuzn...@redhat.com]
> Sent: Tuesday, September 29, 2015 6:34 AM
> To: James E.J. Bottomley ; KY Srinivasan
> 
> Cc: gre...@linuxfoundation.org; linux-ker...@vger.kernel.org;
> de...@linuxdriverproject.org; oher...@suse.com;
> jbottom...@parallels.com; h...@infradead.org; linux-s...@vger.kernel.org;
> a...@canonical.com; jasow...@redhat.com
> Subject: Re: [PATCH 0/3] scsi: Some miscellaneous fixes
> 
> "K. Y. Srinivasan"  writes:
> 
> [...]
> 
> >
> > Vitaly Kuznetsov (2):
> >   scsi_scan: don't dump trace when scsi_prep_async_scan() is called
> > twice
> >   scsi: introduce short_inquiry flag for broken host adapters
> 
> James,
> 
> I'm sorry for the annoyance but when I asked about these patches last
> time you said we don't have them reviewed. Is it OK now when we have
> signed-off-by: from K. Y. or do we need to ask someone else?

We have tested these patches on various Hyper-V platforms. 

K. Y
> 
> Thanks,
> 
> --
>   Vitaly
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v2] mtd: nand: pass page number to ecc->write_xxx() methods

2015-10-01 Thread Boris Brezillon
On Thu,  1 Oct 2015 20:04:17 +0200
Boris Brezillon  wrote:

> The ->read_xxx() methods are all passed the page number the NAND controller
> is supposed to read, but ->write_xxx() do not have such a parameter.
> 
> This is a problem if we want to properly implement data
> scrambling/randomization in order to mitigate MLC sensibility to repeated
> pattern: to prevent bitflips in adjacent pages in the same block we need
> to avoid repeating the same pattern at the same offset in those pages,
> hence the randomizer/scrambler engine need to be passed the page value
> in order to adapt its seed accordingly.
> 
> Moreover, adding the page parameter to the ->write_xxx() methods add some
> consistency to the current API.


Please ignore this patch (I resent a version including the doc4g fix).
Sorry for the noise.

> 
> Signed-off-by: Boris Brezillon 
> CC: Josh Wu 
> CC: Ezequiel Garcia 
> CC: Maxime Ripard 
> CC: Greg Kroah-Hartman 
> CC: Huang Shijie 
> CC: Bryan Wu 
> CC: Stefan Agner 
> CC: de...@driverdev.osuosl.org
> CC: linux-arm-ker...@lists.infradead.org
> CC: linux-ker...@vger.kernel.org
> ---
> Changes since v1:
> - rebased on l2-mtd/master
> - fixed compilation error in the doc4g driver
> ---
>  drivers/mtd/nand/atmel_nand.c |  6 --
>  drivers/mtd/nand/bf5xx_nand.c |  3 ++-
>  drivers/mtd/nand/brcmnand/brcmnand.c  |  4 ++--
>  drivers/mtd/nand/cafe_nand.c  |  3 ++-
>  drivers/mtd/nand/denali.c |  5 +++--
>  drivers/mtd/nand/docg4.c  |  4 ++--
>  drivers/mtd/nand/fsl_elbc_nand.c  |  4 ++--
>  drivers/mtd/nand/fsl_ifc_nand.c   |  2 +-
>  drivers/mtd/nand/gpmi-nand/gpmi-nand.c|  6 +++---
>  drivers/mtd/nand/hisi504_nand.c   |  3 ++-
>  drivers/mtd/nand/lpc32xx_mlc.c|  3 ++-
>  drivers/mtd/nand/lpc32xx_slc.c|  5 +++--
>  drivers/mtd/nand/nand_base.c  | 31 
> ++-
>  drivers/mtd/nand/omap2.c  |  3 ++-
>  drivers/mtd/nand/pxa3xx_nand.c|  3 ++-
>  drivers/mtd/nand/sh_flctl.c   |  3 ++-
>  drivers/mtd/nand/sunxi_nand.c |  5 +++--
>  drivers/mtd/nand/vf610_nfc.c  |  2 +-
>  drivers/staging/mt29f_spinand/mt29f_spinand.c |  3 ++-
>  include/linux/mtd/nand.h  |  6 +++---
>  20 files changed, 64 insertions(+), 40 deletions(-)
> 
> diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
> index 46010bd..d0f50c9 100644
> --- a/drivers/mtd/nand/atmel_nand.c
> +++ b/drivers/mtd/nand/atmel_nand.c
> @@ -954,7 +954,8 @@ static int atmel_nand_pmecc_read_page(struct mtd_info 
> *mtd,
>  }
>  
>  static int atmel_nand_pmecc_write_page(struct mtd_info *mtd,
> - struct nand_chip *chip, const uint8_t *buf, int oob_required)
> + struct nand_chip *chip, const uint8_t *buf, int oob_required,
> + int page)
>  {
>   struct atmel_nand_host *host = chip->priv;
>   uint32_t *eccpos = chip->ecc.layout->eccpos;
> @@ -2005,7 +2006,8 @@ static int nfc_sram_write_page(struct mtd_info *mtd, 
> struct nand_chip *chip,
>  
>   if (likely(!raw))
>   /* Need to write ecc into oob */
> - status = chip->ecc.write_page(mtd, chip, buf, oob_required);
> + status = chip->ecc.write_page(mtd, chip, buf, oob_required,
> +   page);
>  
>   if (status < 0)
>   return status;
> diff --git a/drivers/mtd/nand/bf5xx_nand.c b/drivers/mtd/nand/bf5xx_nand.c
> index 4d8d4ba..17b3727 100644
> --- a/drivers/mtd/nand/bf5xx_nand.c
> +++ b/drivers/mtd/nand/bf5xx_nand.c
> @@ -566,7 +566,8 @@ static int bf5xx_nand_read_page_raw(struct mtd_info *mtd, 
> struct nand_chip *chip
>  }
>  
>  static int bf5xx_nand_write_page_raw(struct mtd_info *mtd,
> - struct nand_chip *chip, const uint8_t *buf, int oob_required)
> + struct nand_chip *chip, const uint8_t *buf, int oob_required,
> + int page)
>  {
>   bf5xx_nand_write_buf(mtd, buf, mtd->writesize);
>   bf5xx_nand_write_buf(mtd, chip->oob_poi, mtd->oobsize);
> diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c 
> b/drivers/mtd/nand/brcmnand/brcmnand.c
> index 048e4e0..e577109 100644
> --- a/drivers/mtd/nand/brcmnand/brcmnand.c
> +++ b/drivers/mtd/nand/brcmnand/brcmnand.c
> @@ -1606,7 +1606,7 @@ out:
>  }
>  
>  static int brcmnand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
> -const uint8_t *buf, int oob_required)
> +const uint8_t *buf, int oob_required, int page)
>  {
>   struct brcmnand_host *host = chip->priv;
>   void *oob = oob_required ? chip->oob_poi : NULL;
> @@ -1617,7 +1617,7 @@ static int brcmnand_write_page(struct mtd_info *mtd, 
> struct nand_chip *chip,
>  
>  static int brcmnand_write_page_raw(struct mtd_info *mtd,
>  

[RESEND PATCH v2] mtd: nand: pass page number to ecc->write_xxx() methods

2015-10-01 Thread Boris Brezillon
The ->read_xxx() methods are all passed the page number the NAND controller
is supposed to read, but ->write_xxx() do not have such a parameter.

This is a problem if we want to properly implement data
scrambling/randomization in order to mitigate MLC sensibility to repeated
pattern: to prevent bitflips in adjacent pages in the same block we need
to avoid repeating the same pattern at the same offset in those pages,
hence the randomizer/scrambler engine need to be passed the page value
in order to adapt its seed accordingly.

Moreover, adding the page parameter to the ->write_xxx() methods add some
consistency to the current API.

Signed-off-by: Boris Brezillon 
CC: Josh Wu 
CC: Ezequiel Garcia 
CC: Maxime Ripard 
CC: Greg Kroah-Hartman 
CC: Huang Shijie 
CC: Bryan Wu 
CC: Stefan Agner 
CC: de...@driverdev.osuosl.org
CC: linux-arm-ker...@lists.infradead.org
CC: linux-ker...@vger.kernel.org
---
Sorry for the noise, I didn't send the correct patch version (the one
fixing the compilation error in the doc4g driver).

Changes since v1:
- rebased on l2-mtd/master
- fixed compilation error in the doc4g driver
---
 drivers/mtd/nand/atmel_nand.c |  6 --
 drivers/mtd/nand/bf5xx_nand.c |  3 ++-
 drivers/mtd/nand/brcmnand/brcmnand.c  |  4 ++--
 drivers/mtd/nand/cafe_nand.c  |  3 ++-
 drivers/mtd/nand/denali.c |  5 +++--
 drivers/mtd/nand/docg4.c  |  6 +++---
 drivers/mtd/nand/fsl_elbc_nand.c  |  4 ++--
 drivers/mtd/nand/fsl_ifc_nand.c   |  2 +-
 drivers/mtd/nand/gpmi-nand/gpmi-nand.c|  6 +++---
 drivers/mtd/nand/hisi504_nand.c   |  3 ++-
 drivers/mtd/nand/lpc32xx_mlc.c|  3 ++-
 drivers/mtd/nand/lpc32xx_slc.c|  5 +++--
 drivers/mtd/nand/nand_base.c  | 31 ++-
 drivers/mtd/nand/omap2.c  |  3 ++-
 drivers/mtd/nand/pxa3xx_nand.c|  3 ++-
 drivers/mtd/nand/sh_flctl.c   |  3 ++-
 drivers/mtd/nand/sunxi_nand.c |  5 +++--
 drivers/mtd/nand/vf610_nfc.c  |  2 +-
 drivers/staging/mt29f_spinand/mt29f_spinand.c |  3 ++-
 include/linux/mtd/nand.h  |  6 +++---
 20 files changed, 65 insertions(+), 41 deletions(-)

diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index 46010bd..d0f50c9 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -954,7 +954,8 @@ static int atmel_nand_pmecc_read_page(struct mtd_info *mtd,
 }
 
 static int atmel_nand_pmecc_write_page(struct mtd_info *mtd,
-   struct nand_chip *chip, const uint8_t *buf, int oob_required)
+   struct nand_chip *chip, const uint8_t *buf, int oob_required,
+   int page)
 {
struct atmel_nand_host *host = chip->priv;
uint32_t *eccpos = chip->ecc.layout->eccpos;
@@ -2005,7 +2006,8 @@ static int nfc_sram_write_page(struct mtd_info *mtd, 
struct nand_chip *chip,
 
if (likely(!raw))
/* Need to write ecc into oob */
-   status = chip->ecc.write_page(mtd, chip, buf, oob_required);
+   status = chip->ecc.write_page(mtd, chip, buf, oob_required,
+ page);
 
if (status < 0)
return status;
diff --git a/drivers/mtd/nand/bf5xx_nand.c b/drivers/mtd/nand/bf5xx_nand.c
index 4d8d4ba..17b3727 100644
--- a/drivers/mtd/nand/bf5xx_nand.c
+++ b/drivers/mtd/nand/bf5xx_nand.c
@@ -566,7 +566,8 @@ static int bf5xx_nand_read_page_raw(struct mtd_info *mtd, 
struct nand_chip *chip
 }
 
 static int bf5xx_nand_write_page_raw(struct mtd_info *mtd,
-   struct nand_chip *chip, const uint8_t *buf, int oob_required)
+   struct nand_chip *chip, const uint8_t *buf, int oob_required,
+   int page)
 {
bf5xx_nand_write_buf(mtd, buf, mtd->writesize);
bf5xx_nand_write_buf(mtd, chip->oob_poi, mtd->oobsize);
diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c 
b/drivers/mtd/nand/brcmnand/brcmnand.c
index 048e4e0..e577109 100644
--- a/drivers/mtd/nand/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/brcmnand/brcmnand.c
@@ -1606,7 +1606,7 @@ out:
 }
 
 static int brcmnand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
-  const uint8_t *buf, int oob_required)
+  const uint8_t *buf, int oob_required, int page)
 {
struct brcmnand_host *host = chip->priv;
void *oob = oob_required ? chip->oob_poi : NULL;
@@ -1617,7 +1617,7 @@ static int brcmnand_write_page(struct mtd_info *mtd, 
struct nand_chip *chip,
 
 static int brcmnand_write_page_raw(struct mtd_info *mtd,
   struct nand_chip *chip, const uint8_t *buf,
-  int oob_required)
+  int oob_required, int page)
 {
struct brcmnand_ho

RE: [PATCH 08/17] staging: comedi: quatech_daqp_cs: introduce daqp_ai_get_sample()

2015-10-01 Thread Hartley Sweeten
On Thursday, October 01, 2015 11:38 AM, kbuild test robot wrote:
> Hi Hartley,
>
> [auto build test results on v4.3-rc3 -- if it's inappropriate base, please 
> ignore]
>
> reproduce:
> # apt-get install sparse
> make ARCH=x86_64 allmodconfig
> make C=1 CF=-D__CHECK_ENDIAN__
>
>
> sparse warnings: (new ones prefixed by >>)
>
> >> drivers/staging/comedi/drivers/quatech_daqp_cs.c:172:14: sparse: symbol 
> >> 'daqp_ai_get_sample' was not declared. Should it be static?
>
> Please review and possibly fold the followup patch.

Wow... The kbuild test robot is quick... I just posted that...

Sorry about that. I'll fold the fix in and repost the series.

Thanks,
Hartley

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 3/3] staging: comedi: pcm3724: update the MODULE_DESCRIPTION

2015-10-01 Thread H Hartley Sweeten
Change the MODULE_DESCRIPTION to something more usefull than the
generic "Comedi low-level driver".

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/pcm3724.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/comedi/drivers/pcm3724.c 
b/drivers/staging/comedi/drivers/pcm3724.c
index be5fe04..588ae5e 100644
--- a/drivers/staging/comedi/drivers/pcm3724.c
+++ b/drivers/staging/comedi/drivers/pcm3724.c
@@ -222,5 +222,5 @@ static struct comedi_driver pcm3724_driver = {
 module_comedi_driver(pcm3724_driver);
 
 MODULE_AUTHOR("Comedi http://www.comedi.org";);
-MODULE_DESCRIPTION("Comedi low-level driver");
+MODULE_DESCRIPTION("Comedi driver for Advantech PCM-3724 Digital I/O board");
 MODULE_LICENSE("GPL");
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 2/3] staging: comedi: pcm3724: tidy up register map defines

2015-10-01 Thread H Hartley Sweeten
For aesthetics, rename the register map defines so they have namespace
associated with the driver and use the BIT macro to define the bits.

Add the missing defines for the registers and use them to remove the
magic values from the driver.

Add a comment about the extra registers to explain why this driver
doesn't just use the standard 8255 driver instead.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/pcm3724.c | 66 +++-
 1 file changed, 39 insertions(+), 27 deletions(-)

diff --git a/drivers/staging/comedi/drivers/pcm3724.c 
b/drivers/staging/comedi/drivers/pcm3724.c
index 3149c01..be5fe04 100644
--- a/drivers/staging/comedi/drivers/pcm3724.c
+++ b/drivers/staging/comedi/drivers/pcm3724.c
@@ -27,19 +27,31 @@
 
 #include "8255.h"
 
-#define BUF_C0 0x1
-#define BUF_B0 0x2
-#define BUF_A0 0x4
-#define BUF_C1 0x8
-#define BUF_B1 0x10
-#define BUF_A1 0x20
-
-#define GATE_A0 0x4
-#define GATE_B00x2
-#define GATE_C00x1
-#define GATE_A10x20
-#define GATE_B10x10
-#define GATE_C1 0x8
+/*
+ * Register I/O Map
+ *
+ * This board has two standard 8255 devices that provide six 8-bit DIO ports
+ * (48 channels total). Six 74HCT245 chips (one for each port) buffer the
+ * I/O lines to increase driving capability. Because the 74HCT245 is a
+ * bidirectional, tri-state line buffer, two additional I/O ports are used
+ * to control the direction of data and the enable of each port.
+ */
+#define PCM3724_8255_0_BASE0x00
+#define PCM3724_8255_1_BASE0x04
+#define PCM3724_DIO_DIR_REG0x08
+#define PCM3724_DIO_DIR_C0_OUT BIT(0)
+#define PCM3724_DIO_DIR_B0_OUT BIT(1)
+#define PCM3724_DIO_DIR_A0_OUT BIT(2)
+#define PCM3724_DIO_DIR_C1_OUT BIT(3)
+#define PCM3724_DIO_DIR_B1_OUT BIT(4)
+#define PCM3724_DIO_DIR_A1_OUT BIT(5)
+#define PCM3724_GATE_CTRL_REG  0x09
+#define PCM3724_GATE_CTRL_C0_ENA   BIT(0)
+#define PCM3724_GATE_CTRL_B0_ENA   BIT(1)
+#define PCM3724_GATE_CTRL_A0_ENA   BIT(2)
+#define PCM3724_GATE_CTRL_C1_ENA   BIT(3)
+#define PCM3724_GATE_CTRL_B1_ENA   BIT(4)
+#define PCM3724_GATE_CTRL_A1_ENA   BIT(5)
 
 /* used to track configured dios */
 struct priv_pcm3724 {
@@ -52,21 +64,21 @@ static int compute_buffer(int config, int devno, struct 
comedi_subdevice *s)
/* 1 in io_bits indicates output */
if (s->io_bits & 0xff) {
if (devno == 0)
-   config |= BUF_A0;
+   config |= PCM3724_DIO_DIR_A0_OUT;
else
-   config |= BUF_A1;
+   config |= PCM3724_DIO_DIR_A1_OUT;
}
if (s->io_bits & 0x00ff00) {
if (devno == 0)
-   config |= BUF_B0;
+   config |= PCM3724_DIO_DIR_B0_OUT;
else
-   config |= BUF_B1;
+   config |= PCM3724_DIO_DIR_B1_OUT;
}
if (s->io_bits & 0xff) {
if (devno == 0)
-   config |= BUF_C0;
+   config |= PCM3724_DIO_DIR_C0_OUT;
else
-   config |= BUF_C1;
+   config |= PCM3724_DIO_DIR_C1_OUT;
}
return config;
 }
@@ -101,7 +113,7 @@ static void do_3724_config(struct comedi_device *dev,
else
port_8255_cfg = dev->iobase + I8255_SIZE + I8255_CTRL_REG;
 
-   outb(buffer_config, dev->iobase + 8);   /* update buffer register */
+   outb(buffer_config, dev->iobase + PCM3724_DIO_DIR_REG);
 
outb(config, port_8255_cfg);
 }
@@ -123,24 +135,24 @@ static void enable_chan(struct comedi_device *dev, struct 
comedi_subdevice *s,
priv->dio_2 |= mask;
 
if (priv->dio_1 & 0xff)
-   gatecfg |= GATE_C0;
+   gatecfg |= PCM3724_GATE_CTRL_C0_ENA;
 
if (priv->dio_1 & 0xff00)
-   gatecfg |= GATE_B0;
+   gatecfg |= PCM3724_GATE_CTRL_B0_ENA;
 
if (priv->dio_1 & 0xff)
-   gatecfg |= GATE_A0;
+   gatecfg |= PCM3724_GATE_CTRL_A0_ENA;
 
if (priv->dio_2 & 0xff)
-   gatecfg |= GATE_C1;
+   gatecfg |= PCM3724_GATE_CTRL_C1_ENA;
 
if (priv->dio_2 & 0xff00)
-   gatecfg |= GATE_B1;
+   gatecfg |= PCM3724_GATE_CTRL_B1_ENA;
 
if (priv->dio_2 & 0xff)
-   gatecfg |= GATE_A1;
+   gatecfg |= PCM3724_GATE_CTRL_A1_ENA;
 
-   outb(gatecfg, dev->iobase + 9);
+   outb(gatecfg, dev->iobase + PCM3724_GATE_CTRL_REG);
 }
 
 /* overriding the 8255 insn config */
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 1/3] staging: comedi: pcm3724: tidy up multi-line comments

2015-10-01 Thread H Hartley Sweeten
Reformat the multi-line comments in the kernel CodingStyle.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/pcm3724.c | 44 ++--
 1 file changed, 19 insertions(+), 25 deletions(-)

diff --git a/drivers/staging/comedi/drivers/pcm3724.c 
b/drivers/staging/comedi/drivers/pcm3724.c
index 6176dfa..3149c01 100644
--- a/drivers/staging/comedi/drivers/pcm3724.c
+++ b/drivers/staging/comedi/drivers/pcm3724.c
@@ -1,31 +1,25 @@
 /*
-comedi/drivers/pcm724.c
-
-Drew Csillag 
-
-hardware driver for Advantech card:
- card:   PCM-3724
- driver: pcm3724
+ * pcm3724.c
+ * Comedi driver for Advantech PCM-3724 Digital I/O board
+ *
+ * Drew Csillag 
+ */
 
-Options for PCM-3724
- [0] - IO Base
-*/
-/*
-Driver: pcm3724
-Description: Advantech PCM-3724
-Author: Drew Csillag 
-Devices: [Advantech] PCM-3724 (pcm724)
-Status: tested
-
-This is driver for digital I/O boards PCM-3724 with 48 DIO.
-It needs 8255.o for operations and only immediate mode is supported.
-See the source for configuration details.
-
-Copy/pasted/hacked from pcm724.c
-*/
 /*
- * check_driver overrides:
- *   struct comedi_insn
+ * Driver: pcm3724
+ * Description: Advantech PCM-3724
+ * Devices: [Advantech] PCM-3724 (pcm3724)
+ * Author: Drew Csillag 
+ * Status: tested
+ *
+ * This is driver for digital I/O boards PCM-3724 with 48 DIO.
+ * It needs 8255.o for operations and only immediate mode is supported.
+ * See the source for configuration details.
+ *
+ * Copy/pasted/hacked from pcm724.c
+ *
+ * Configuration Options:
+ *   [0] - I/O port base address
  */
 
 #include 
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 0/3] staging: comedi: pcm3724: cleanup driver

2015-10-01 Thread H Hartley Sweeten
Some minor cleanup to the comedi pcm3724 PC/104 legacy driver.

H Hartley Sweeten (3):
  staging: comedi: pcm3724: tidy up multi-line comments
  staging: comedi: pcm3724: tidy up register map defines
  staging: comedi: pcm3724: update the MODULE_DESCRIPTION

 drivers/staging/comedi/drivers/pcm3724.c | 112 ---
 1 file changed, 59 insertions(+), 53 deletions(-)

-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[RFC PATCH] staging: comedi: quatech_daqp_cs: daqp_ai_get_sample() can be static

2015-10-01 Thread kbuild test robot

Signed-off-by: Fengguang Wu 
---
 quatech_daqp_cs.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 23c79e3..96471fc 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -169,8 +169,8 @@ static int daqp_ai_cancel(struct comedi_device *dev,
return 0;
 }
 
-unsigned int daqp_ai_get_sample(struct comedi_device *dev,
-   struct comedi_subdevice *s)
+static unsigned int daqp_ai_get_sample(struct comedi_device *dev,
+  struct comedi_subdevice *s)
 {
unsigned int val;
 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH 08/17] staging: comedi: quatech_daqp_cs: introduce daqp_ai_get_sample()

2015-10-01 Thread kbuild test robot
Hi Hartley,

[auto build test results on v4.3-rc3 -- if it's inappropriate base, please 
ignore]

reproduce:
# apt-get install sparse
make ARCH=x86_64 allmodconfig
make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

>> drivers/staging/comedi/drivers/quatech_daqp_cs.c:172:14: sparse: symbol 
>> 'daqp_ai_get_sample' was not declared. Should it be static?

Please review and possibly fold the followup patch.

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v2] mtd: nand: pass page number to ecc->write_xxx() methods

2015-10-01 Thread kbuild test robot
Hi Boris,

[auto build test results on next-20151001 -- if it's inappropriate base, please 
ignore]

config: i386-randconfig-s1-201539 (attached as .config)
reproduce:
git checkout 425b29816a0dba028eef09be5cb531a187e256a1
# save the attached .config to linux build tree
make ARCH=i386 

All error/warnings (new ones prefixed by >>):

   drivers/mtd/nand/docg4.c: In function 'docg4_block_markbad':
>> drivers/mtd/nand/docg4.c:1116:2: error: too few arguments to function 
>> 'docg4_write_page'
 docg4_write_page(mtd, nand, buf, 1);
 ^
   drivers/mtd/nand/docg4.c:985:12: note: declared here
static int docg4_write_page(struct mtd_info *mtd, struct nand_chip *nand,
   ^

vim +/docg4_write_page +1116 drivers/mtd/nand/docg4.c

570469f3 Mike Dunn2012-01-03  1110  memset(nand->oob_poi, 0xff, 
mtd->oobsize);
570469f3 Mike Dunn2012-01-03    for (i = 0; i < bbtd->len; i++)
570469f3 Mike Dunn2012-01-03  1112  
nand->oob_poi[bbtd->offs + i] = ~bbtd->pattern[i];
570469f3 Mike Dunn2012-01-03  1113  
570469f3 Mike Dunn2012-01-03  1114  /* write first page of block */
570469f3 Mike Dunn2012-01-03  1115  write_page_prologue(mtd, 
g4_addr);
1fbb938d Brian Norris 2012-05-02 @1116  docg4_write_page(mtd, nand, 
buf, 1);
570469f3 Mike Dunn2012-01-03  1117  ret = pageprog(mtd);
570469f3 Mike Dunn2012-01-03  1118  
570469f3 Mike Dunn2012-01-03  1119  kfree(buf);

:: The code at line 1116 was first introduced by commit
:: 1fbb938dff5b6bb4514a4e7600276b03c7f08e25 mtd: nand: add 'oob_required' 
argument to NAND {read,write}_page interfaces

:: TO: Brian Norris 
:: CC: David Woodhouse 

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: Binary data
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] mtd: nand: pass page number to ecc->write_xxx() methods

2015-10-01 Thread Boris Brezillon
On Thu, 1 Oct 2015 10:17:50 -0700
Brian Norris  wrote:

> On Mon, Aug 24, 2015 at 07:10:19PM +0200, Boris Brezillon wrote:
> > The ->read_xxx() methods are all passed the page number the NAND controller
> > is supposed to read, but ->write_xxx() do not have such a parameter.
> > 
> > This is a problem if we want to properly implement data
> > scrambling/randomization in order to mitigate MLC sensibility to repeated
> > pattern: to prevent bitflips in adjacent pages in the same block we need
> > to avoid repeating the same pattern at the same offset in those pages,
> > hence the randomizer/scrambler engine need to be passed the page value
> > in order to adapt its seed accordingly.
> > 
> > Moreover, adding the page parameter the ->write_xxx() methods add some
> > consistency to the current model.
> > 
> > Signed-off-by: Boris Brezillon 
> > CC: Josh Wu 
> > CC: Ezequiel Garcia 
> > CC: Maxime Ripard 
> > CC: Greg Kroah-Hartman 
> > CC: Huang Shijie 
> > CC: Bryan Wu 
> > CC: de...@driverdev.osuosl.org
> > CC: linux-arm-ker...@lists.infradead.org
> > CC: linux-ker...@vger.kernel.org
> > 
> > ---
> >  drivers/mtd/nand/atmel_nand.c |  6 --
> >  drivers/mtd/nand/bf5xx_nand.c |  3 ++-
> >  drivers/mtd/nand/brcmnand/brcmnand.c  |  4 ++--
> >  drivers/mtd/nand/cafe_nand.c  |  3 ++-
> >  drivers/mtd/nand/denali.c |  5 +++--
> >  drivers/mtd/nand/docg4.c  |  4 ++--
> >  drivers/mtd/nand/fsl_elbc_nand.c  |  4 ++--
> >  drivers/mtd/nand/fsl_ifc_nand.c   |  2 +-
> >  drivers/mtd/nand/gpmi-nand/gpmi-nand.c|  6 +++---
> >  drivers/mtd/nand/hisi504_nand.c   |  3 ++-
> >  drivers/mtd/nand/lpc32xx_mlc.c|  3 ++-
> >  drivers/mtd/nand/lpc32xx_slc.c|  5 +++--
> >  drivers/mtd/nand/nand_base.c  | 31 
> > ++-
> >  drivers/mtd/nand/omap2.c  |  3 ++-
> >  drivers/mtd/nand/pxa3xx_nand.c|  3 ++-
> >  drivers/mtd/nand/sh_flctl.c   |  3 ++-
> >  drivers/mtd/nand/sunxi_nand.c |  5 +++--
> >  drivers/staging/mt29f_spinand/mt29f_spinand.c |  3 ++-
> >  include/linux/mtd/nand.h  |  6 +++---
> >  19 files changed, 63 insertions(+), 39 deletions(-)
> 
> Tip for rebasing -- I noticed one build failure for docg4:
> 
>   drivers/mtd/nand/docg4.c: In function ‘docg4_block_markbad’:
>   drivers/mtd/nand/docg4.c:1116:2: error: too few arguments to function 
> ‘docg4_write_page’
>   drivers/mtd/nand/docg4.c:985:12: note: declared here

Fixed in v2, thanks for the pointer.



-- 
Boris Brezillon, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH] staging: comedi: 8255: prefer using the BIT macro

2015-10-01 Thread H Hartley Sweeten
Fix the checkpatch.pl issues.

Signed-off-by: H Hartley Sweeten 
---
 drivers/staging/comedi/drivers/8255.h | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/staging/comedi/drivers/8255.h 
b/drivers/staging/comedi/drivers/8255.h
index 41823de..55a67af 100644
--- a/drivers/staging/comedi/drivers/8255.h
+++ b/drivers/staging/comedi/drivers/8255.h
@@ -25,13 +25,13 @@
 #define I8255_DATA_B_REG   0x01
 #define I8255_DATA_C_REG   0x02
 #define I8255_CTRL_REG 0x03
-#define I8255_CTRL_C_LO_IO (1 << 0)
-#define I8255_CTRL_B_IO(1 << 1)
-#define I8255_CTRL_B_MODE  (1 << 2)
-#define I8255_CTRL_C_HI_IO (1 << 3)
-#define I8255_CTRL_A_IO(1 << 4)
+#define I8255_CTRL_C_LO_IO BIT(0)
+#define I8255_CTRL_B_IOBIT(1)
+#define I8255_CTRL_B_MODE  BIT(2)
+#define I8255_CTRL_C_HI_IO BIT(3)
+#define I8255_CTRL_A_IOBIT(4)
 #define I8255_CTRL_A_MODE(x)   ((x) << 5)
-#define I8255_CTRL_CW  (1 << 7)
+#define I8255_CTRL_CW  BIT(7)
 
 struct comedi_device;
 struct comedi_subdevice;
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2] mtd: nand: pass page number to ecc->write_xxx() methods

2015-10-01 Thread Boris Brezillon
The ->read_xxx() methods are all passed the page number the NAND controller
is supposed to read, but ->write_xxx() do not have such a parameter.

This is a problem if we want to properly implement data
scrambling/randomization in order to mitigate MLC sensibility to repeated
pattern: to prevent bitflips in adjacent pages in the same block we need
to avoid repeating the same pattern at the same offset in those pages,
hence the randomizer/scrambler engine need to be passed the page value
in order to adapt its seed accordingly.

Moreover, adding the page parameter to the ->write_xxx() methods add some
consistency to the current API.

Signed-off-by: Boris Brezillon 
CC: Josh Wu 
CC: Ezequiel Garcia 
CC: Maxime Ripard 
CC: Greg Kroah-Hartman 
CC: Huang Shijie 
CC: Bryan Wu 
CC: Stefan Agner 
CC: de...@driverdev.osuosl.org
CC: linux-arm-ker...@lists.infradead.org
CC: linux-ker...@vger.kernel.org
---
Changes since v1:
- rebased on l2-mtd/master
- fixed compilation error in the doc4g driver
---
 drivers/mtd/nand/atmel_nand.c |  6 --
 drivers/mtd/nand/bf5xx_nand.c |  3 ++-
 drivers/mtd/nand/brcmnand/brcmnand.c  |  4 ++--
 drivers/mtd/nand/cafe_nand.c  |  3 ++-
 drivers/mtd/nand/denali.c |  5 +++--
 drivers/mtd/nand/docg4.c  |  4 ++--
 drivers/mtd/nand/fsl_elbc_nand.c  |  4 ++--
 drivers/mtd/nand/fsl_ifc_nand.c   |  2 +-
 drivers/mtd/nand/gpmi-nand/gpmi-nand.c|  6 +++---
 drivers/mtd/nand/hisi504_nand.c   |  3 ++-
 drivers/mtd/nand/lpc32xx_mlc.c|  3 ++-
 drivers/mtd/nand/lpc32xx_slc.c|  5 +++--
 drivers/mtd/nand/nand_base.c  | 31 ++-
 drivers/mtd/nand/omap2.c  |  3 ++-
 drivers/mtd/nand/pxa3xx_nand.c|  3 ++-
 drivers/mtd/nand/sh_flctl.c   |  3 ++-
 drivers/mtd/nand/sunxi_nand.c |  5 +++--
 drivers/mtd/nand/vf610_nfc.c  |  2 +-
 drivers/staging/mt29f_spinand/mt29f_spinand.c |  3 ++-
 include/linux/mtd/nand.h  |  6 +++---
 20 files changed, 64 insertions(+), 40 deletions(-)

diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index 46010bd..d0f50c9 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -954,7 +954,8 @@ static int atmel_nand_pmecc_read_page(struct mtd_info *mtd,
 }
 
 static int atmel_nand_pmecc_write_page(struct mtd_info *mtd,
-   struct nand_chip *chip, const uint8_t *buf, int oob_required)
+   struct nand_chip *chip, const uint8_t *buf, int oob_required,
+   int page)
 {
struct atmel_nand_host *host = chip->priv;
uint32_t *eccpos = chip->ecc.layout->eccpos;
@@ -2005,7 +2006,8 @@ static int nfc_sram_write_page(struct mtd_info *mtd, 
struct nand_chip *chip,
 
if (likely(!raw))
/* Need to write ecc into oob */
-   status = chip->ecc.write_page(mtd, chip, buf, oob_required);
+   status = chip->ecc.write_page(mtd, chip, buf, oob_required,
+ page);
 
if (status < 0)
return status;
diff --git a/drivers/mtd/nand/bf5xx_nand.c b/drivers/mtd/nand/bf5xx_nand.c
index 4d8d4ba..17b3727 100644
--- a/drivers/mtd/nand/bf5xx_nand.c
+++ b/drivers/mtd/nand/bf5xx_nand.c
@@ -566,7 +566,8 @@ static int bf5xx_nand_read_page_raw(struct mtd_info *mtd, 
struct nand_chip *chip
 }
 
 static int bf5xx_nand_write_page_raw(struct mtd_info *mtd,
-   struct nand_chip *chip, const uint8_t *buf, int oob_required)
+   struct nand_chip *chip, const uint8_t *buf, int oob_required,
+   int page)
 {
bf5xx_nand_write_buf(mtd, buf, mtd->writesize);
bf5xx_nand_write_buf(mtd, chip->oob_poi, mtd->oobsize);
diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c 
b/drivers/mtd/nand/brcmnand/brcmnand.c
index 048e4e0..e577109 100644
--- a/drivers/mtd/nand/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/brcmnand/brcmnand.c
@@ -1606,7 +1606,7 @@ out:
 }
 
 static int brcmnand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
-  const uint8_t *buf, int oob_required)
+  const uint8_t *buf, int oob_required, int page)
 {
struct brcmnand_host *host = chip->priv;
void *oob = oob_required ? chip->oob_poi : NULL;
@@ -1617,7 +1617,7 @@ static int brcmnand_write_page(struct mtd_info *mtd, 
struct nand_chip *chip,
 
 static int brcmnand_write_page_raw(struct mtd_info *mtd,
   struct nand_chip *chip, const uint8_t *buf,
-  int oob_required)
+  int oob_required, int page)
 {
struct brcmnand_host *host = chip->priv;
void *oob = oob_required ? chip->oob_poi : NULL;
diff --git a/drivers/mtd/nand/cafe_nand.c b/

[PATCH 16/17] staging: comedi: quatech_daqp_cs: handle shared interrupt

2015-10-01 Thread H Hartley Sweeten
This is a PCMCIA driver and interrupts are always shared. Detect if
the hardware did not produce the interrupt and return IRQ_NONE so
that other drivers might handle it.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 1209fee..d45d33d 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -204,6 +204,9 @@ static irqreturn_t daqp_interrupt(int irq, void *dev_id)
return IRQ_NONE;
 
status = inb(dev->iobase + DAQP_STATUS);
+   if (!(status & DAQP_STATUS_EVENTS))
+   return IRQ_NONE;
+
while (!(status & DAQP_STATUS_FIFO_EMPTY)) {
unsigned short data;
 
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 15/17] staging: comedi: quatech_daqp_cs: tidy up multi-line comments

2015-10-01 Thread H Hartley Sweeten
Reformat the multi-line comments in the kernel CodingStyle.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 83 +++-
 1 file changed, 37 insertions(+), 46 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index eb2b839..1209fee 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -1,51 +1,42 @@
-/*==
-
-comedi/drivers/quatech_daqp_cs.c
-
-Quatech DAQP PCMCIA data capture cards COMEDI client driver
-Copyright (C) 2000, 2003 Brent Baccala 
-The DAQP interface code in this file is released into the public domain.
-
-COMEDI - Linux Control and Measurement Device Interface
-Copyright (C) 1998 David A. Schleef 
-http://www.comedi.org/
-
-quatech_daqp_cs.c 1.10
-
-Documentation for the DAQP PCMCIA cards can be found on Quatech's site:
-
-   ftp://ftp.quatech.com/Manuals/daqp-208.pdf
-
-This manual is for both the DAQP-208 and the DAQP-308.
-
-What works:
-
-   - A/D conversion
-   - 8 channels
-   - 4 gain ranges
-   - ground ref or differential
-   - single-shot and timed both supported
-   - D/A conversion, single-shot
-   - digital I/O
-
-What doesn't:
-
-   - any kind of triggering - external or D/A channel 1
-   - the card's optional expansion board
-   - the card's timer (for anything other than A/D conversion)
-   - D/A update modes other than immediate (i.e, timed)
-   - fancier timing modes
-   - setting card's FIFO buffer thresholds to anything but default
-
-==*/
+/*
+ * quatech_daqp_cs.c
+ * Quatech DAQP PCMCIA data capture cards COMEDI client driver
+ * Copyright (C) 2000, 2003 Brent Baccala 
+ * The DAQP interface code in this file is released into the public domain.
+ *
+ * COMEDI - Linux Control and Measurement Device Interface
+ * Copyright (C) 1998 David A. Schleef 
+ * http://www.comedi.org/
+ *
+ * Documentation for the DAQP PCMCIA cards can be found on Quatech's site:
+ * ftp://ftp.quatech.com/Manuals/daqp-208.pdf
+ *
+ * This manual is for both the DAQP-208 and the DAQP-308.
+ *
+ * What works:
+ * - A/D conversion
+ * - 8 channels
+ * - 4 gain ranges
+ * - ground ref or differential
+ * - single-shot and timed both supported
+ * - D/A conversion, single-shot
+ * - digital I/O
+ *
+ * What doesn't:
+ * - any kind of triggering - external or D/A channel 1
+ * - the card's optional expansion board
+ * - the card's timer (for anything other than A/D conversion)
+ * - D/A update modes other than immediate (i.e, timed)
+ * - setting card's FIFO buffer thresholds to anything but default
+ */
 
 /*
-Driver: quatech_daqp_cs
-Description: Quatech DAQP PCMCIA data capture cards
-Author: Brent Baccala 
-Status: works
-Devices: [Quatech] DAQP-208 (daqp), DAQP-308
-*/
+ * Driver: quatech_daqp_cs
+ * Description: Quatech DAQP PCMCIA data capture cards
+ * Devices: [Quatech] DAQP-208 (quatech_daqp_cs), DAQP-308
+ * Author: Brent Baccala 
+ * Status: works
+ */
 
 #include 
 
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 17/17] staging: comedi: quatech_daqp_cs: tidy up register map defines

2015-10-01 Thread H Hartley Sweeten
Reorder the register map defines so that each register define is
followed by its bit defines.

For aesthetics, change all the register offsets to hex values and
use the BIT macro to define the register bits.

Also for aesthetics, move the DAQP_FIFO_SIZE and private data
definition after the register defines.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 172 ---
 1 file changed, 92 insertions(+), 80 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index d45d33d..d4c9478 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -42,96 +42,108 @@
 
 #include "../comedi_pcmcia.h"
 
-struct daqp_private {
-   unsigned int pacer_div;
-   unsigned char scanrate;
-   int stop;
-};
+/*
+ * Register I/O map
+ *
+ * The D/A and timer registers can be accessed with 16-bit or 8-bit I/O
+ * instructions. All other registers can only use 8-bit instructions.
+ *
+ * The FIFO and scanlist registers require two 8-bit instructions to
+ * access the 16-bit data. Data is transferred LSB then MSB.
+ */
+#define DAQP_FIFO  0x00
 
-/* The DAQP communicates with the system through a 16 byte I/O window. */
-
-#define DAQP_FIFO_SIZE 4096
-
-#define DAQP_FIFO  0
-#define DAQP_SCANLIST  1
-#define DAQP_CONTROL   2
-#define DAQP_STATUS2
-#define DAQP_DIGITAL_IO3
-#define DAQP_PACER_LOW 4
-#define DAQP_PACER_MID 5
-#define DAQP_PACER_HIGH6
-#define DAQP_COMMAND   7
-#define DAQP_DA8
-#define DAQP_TIMER 10
-#define DAQP_AUX   15
-
-#define DAQP_SCANLIST_DIFFERENTIAL 0x4000
-#define DAQP_SCANLIST_GAIN(x)  ((x) << 12)
-#define DAQP_SCANLIST_CHANNEL(x)   ((x) << 8)
-#define DAQP_SCANLIST_START0x0080
-#define DAQP_SCANLIST_EXT_GAIN(x)  ((x) << 4)
-#define DAQP_SCANLIST_EXT_CHANNEL(x)   (x)
+#define DAQP_SCANLIST  0x01
+#define DAQP_SCANLIST_DIFFERENTIAL BIT(14)
+#define DAQP_SCANLIST_GAIN(x)  (((x) & 0x3) << 12)
+#define DAQP_SCANLIST_CHANNEL(x)   (((x) & 0xf) << 8)
+#define DAQP_SCANLIST_STARTBIT(7)
+#define DAQP_SCANLIST_EXT_GAIN(x)  (((x) & 0x3) << 4)
+#define DAQP_SCANLIST_EXT_CHANNEL(x)   (((x) & 0xf) << 0)
 
+#define DAQP_CONTROL   0x02
 #define DAQP_CONTROL_PACER_CLK(x)  (((x) & 0x3) << 6)
 #define DAQP_CONTROL_PACER_CLK_EXT DAQP_CONTROL_PACER_CLK(0)
 #define DAQP_CONTROL_PACER_CLK_5MHZDAQP_CONTROL_PACER_CLK(1)
 #define DAQP_CONTROL_PACER_CLK_1MHZDAQP_CONTROL_PACER_CLK(2)
 #define DAQP_CONTROL_PACER_CLK_100KHZ  DAQP_CONTROL_PACER_CLK(3)
-#define DAQP_CONTORL_EXPANSION 0x20
-#define DAQP_CONTROL_EOS_INT_ENABLE0x10
-#define DAQP_CONTROL_FIFO_INT_ENABLE   0x08
-#define DAQP_CONTROL_TRIGGER_ONESHOT   0x00
-#define DAQP_CONTROL_TRIGGER_CONTINUOUS0x04
-#define DAQP_CONTROL_TRIGGER_INTERNAL  0x00
-#define DAQP_CONTROL_TRIGGER_EXTERNAL  0x02
-#define DAQP_CONTROL_TRIGGER_RISING0x00
-#define DAQP_CONTROL_TRIGGER_FALLING   0x01
-
-#define DAQP_STATUS_IDLE   0x80
-#define DAQP_STATUS_RUNNING0x40
-#define DAQP_STATUS_EVENTS 0x38
-#define DAQP_STATUS_DATA_LOST  0x20
-#define DAQP_STATUS_END_OF_SCAN0x10
-#define DAQP_STATUS_FIFO_THRESHOLD 0x08
-#define DAQP_STATUS_FIFO_FULL  0x04
-#define DAQP_STATUS_FIFO_NEARFULL  0x02
-#define DAQP_STATUS_FIFO_EMPTY 0x01
-
-#define DAQP_COMMAND_ARM   0x80
-#define DAQP_COMMAND_RSTF  0x40
-#define DAQP_COMMAND_RSTQ  0x20
-#define DAQP_COMMAND_STOP  0x10
-#define DAQP_COMMAND_LATCH 0x08
+#define DAQP_CONTORL_EXPANSION BIT(5)
+#define DAQP_CONTROL_EOS_INT_ENABLEBIT(4)
+#define DAQP_CONTROL_FIFO_INT_ENABLE   BIT(3)
+#define DAQP_CONTROL_TRIGGER_MODE  BIT(2)  /* 0=one-shot; 1=continuous */
+#define DAQP_CONTROL_TRIGGER_SRC   BIT(1)  /* 0=internal; 1=external */
+#define DAQP_CONTROL_TRIGGER_EDGE  BIT(0)  /* 0=rising; 1=falling */
+
+#define DAQP_STATUS0x02
+#define DAQP_STATUS_IDLE   BIT(7)
+#define DAQP_STATUS_RUNNINGBIT(6)
+#define DAQP_STATUS_DATA_LOST  BIT(5)
+#define DAQP_STATUS_END_OF_SCANBIT(4)
+#define DAQP_STATUS_FIFO_THRESHOLD BIT(3)
+#define DAQP_STATUS_FIFO_FULL  BIT(2)
+#define DAQP_STATUS_FIFO_NEARFULL  BIT(1)
+#define DAQP_STATUS_FIFO_EMPTY BIT(0)
+/* these bits clear when the Status register is read */
+#define DAQP_STATUS_EVENTS (DAQP_STATUS_DATA_LOST |\
+DAQP_STATUS_END_OF_SCAN |  \
+DAQP

[PATCH 14/17] staging: comedi: quatech_daqp_cs: only hook up cmd support if we have an IRQ

2015-10-01 Thread H Hartley Sweeten
Interrupts are only needed by this driver to support the analog input async
commands. Don't hook up the command support if pcmcia_request_irq() fails
instead of completely failing the (*auto_attach).

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 19 +++
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index fb12665..eb2b839 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -670,25 +670,28 @@ static int daqp_auto_attach(struct comedi_device *dev,
 
link->priv = dev;
ret = pcmcia_request_irq(link, daqp_interrupt);
-   if (ret)
-   return ret;
+   if (ret == 0)
+   dev->irq = link->irq;
 
ret = comedi_alloc_subdevices(dev, 4);
if (ret)
return ret;
 
s = &dev->subdevices[0];
-   dev->read_subdev = s;
s->type = COMEDI_SUBD_AI;
-   s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DIFF | SDF_CMD_READ;
+   s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DIFF;
s->n_chan   = 8;
-   s->len_chanlist = 2048;
s->maxdata  = 0x;
s->range_table  = &range_daqp_ai;
s->insn_read= daqp_ai_insn_read;
-   s->do_cmdtest   = daqp_ai_cmdtest;
-   s->do_cmd   = daqp_ai_cmd;
-   s->cancel   = daqp_ai_cancel;
+   if (dev->irq) {
+   dev->read_subdev = s;
+   s->subdev_flags |= SDF_CMD_READ;
+   s->len_chanlist = 2048;
+   s->do_cmdtest   = daqp_ai_cmdtest;
+   s->do_cmd   = daqp_ai_cmd;
+   s->cancel   = daqp_ai_cancel;
+   }
 
s = &dev->subdevices[1];
s->type = COMEDI_SUBD_AO;
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 13/17] staging: comedi: quatech_daqp_cs: introduce daqp_clear_events()

2015-10-01 Thread H Hartley Sweeten
Introduce a helper function for the common code used to clear any
pending interrupts.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 52 
 1 file changed, 25 insertions(+), 27 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 899340a..fb12665 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -151,6 +151,23 @@ static const struct comedi_lrange range_daqp_ai = {
}
 };
 
+static int daqp_clear_events(struct comedi_device *dev, int loops)
+{
+   unsigned int status;
+
+   /*
+* Reset any pending interrupts (my card has a tendency to require
+* require multiple reads on the status register to achieve this).
+*/
+   while (--loops) {
+   status = inb(dev->iobase + DAQP_STATUS);
+   if ((status & DAQP_STATUS_EVENTS) == 0)
+   return 0;
+   }
+   dev_err(dev->class_dev, "couldn't clear events in status register\n");
+   return -EBUSY;
+}
+
 static int daqp_ai_cancel(struct comedi_device *dev,
  struct comedi_subdevice *s)
 {
@@ -277,9 +294,8 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
 unsigned int *data)
 {
struct daqp_private *devpriv = dev->private;
-   int ret = 0;
+   int ret;
int i;
-   int counter = 1;
 
if (devpriv->stop)
return -EIO;
@@ -296,18 +312,9 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
/* one-shot internal trigger, no pacer, no interrupts */
outb(0, dev->iobase + DAQP_CONTROL);
 
-   /* Reset any pending interrupts (my card has a tendency to require
-* require multiple reads on the status register to achieve this)
-*/
-
-   while (--counter
-  && (inb(dev->iobase + DAQP_STATUS) & DAQP_STATUS_EVENTS))
-   ;
-   if (!counter) {
-   dev_err(dev->class_dev,
-   "couldn't clear interrupts in status register\n");
-   return -1;
-   }
+   ret = daqp_clear_events(dev, 1);
+   if (ret)
+   return ret;
 
for (i = 0; i < insn->n; i++) {
/* Start conversion */
@@ -433,8 +440,8 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
 {
struct daqp_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd;
-   int counter;
int threshold;
+   int ret;
 
if (devpriv->stop)
return -EIO;
@@ -552,18 +559,9 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
 DAQP_CONTROL_TRIGGER_CONTINUOUS | DAQP_CONTROL_TRIGGER_INTERNAL,
 dev->iobase + DAQP_CONTROL);
 
-   /* Reset any pending interrupts (my card has a tendency to require
-* require multiple reads on the status register to achieve this)
-*/
-   counter = 100;
-   while (--counter
-  && (inb(dev->iobase + DAQP_STATUS) & DAQP_STATUS_EVENTS))
-   ;
-   if (!counter) {
-   dev_err(dev->class_dev,
-   "couldn't clear interrupts in status register\n");
-   return -1;
-   }
+   ret = daqp_clear_events(dev, 100);
+   if (ret)
+   return ret;
 
/* Start conversion */
outb(DAQP_COMMAND_ARM | DAQP_COMMAND_FIFO_DATA | devpriv->scanrate,
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 11/17] staging: comedi: quatech_daqp_cs: spaces preferred around that '<<'

2015-10-01 Thread H Hartley Sweeten
Fix the checkpatch.pl issues about:
CHECK: spaces preferred around that '<<' (ctx:VxV)

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 4d96795..372aa58 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -75,10 +75,10 @@ struct daqp_private {
 #define DAQP_AUX   15
 
 #define DAQP_SCANLIST_DIFFERENTIAL 0x4000
-#define DAQP_SCANLIST_GAIN(x)  ((x)<<12)
-#define DAQP_SCANLIST_CHANNEL(x)   ((x)<<8)
+#define DAQP_SCANLIST_GAIN(x)  ((x) << 12)
+#define DAQP_SCANLIST_CHANNEL(x)   ((x) << 8)
 #define DAQP_SCANLIST_START0x0080
-#define DAQP_SCANLIST_EXT_GAIN(x)  ((x)<<4)
+#define DAQP_SCANLIST_EXT_GAIN(x)  ((x) << 4)
 #define DAQP_SCANLIST_EXT_CHANNEL(x)   (x)
 
 #define DAQP_CONTROL_PACER_100kHz  0xc0
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 12/17] staging: comedi: quatech_daqp_cs: redefine pacer clock options

2015-10-01 Thread H Hartley Sweeten
For aesthetics, define a macro for the pacer clock options and rename
the CamelCase.

Remove the unnecessary local variable in daqp_ai_cmd() used to set the
control register.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 20 +---
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 372aa58..899340a 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -81,10 +81,11 @@ struct daqp_private {
 #define DAQP_SCANLIST_EXT_GAIN(x)  ((x) << 4)
 #define DAQP_SCANLIST_EXT_CHANNEL(x)   (x)
 
-#define DAQP_CONTROL_PACER_100kHz  0xc0
-#define DAQP_CONTROL_PACER_1MHz0x80
-#define DAQP_CONTROL_PACER_5MHz0x40
-#define DAQP_CONTROL_PACER_EXTERNAL0x00
+#define DAQP_CONTROL_PACER_CLK(x)  (((x) & 0x3) << 6)
+#define DAQP_CONTROL_PACER_CLK_EXT DAQP_CONTROL_PACER_CLK(0)
+#define DAQP_CONTROL_PACER_CLK_5MHZDAQP_CONTROL_PACER_CLK(1)
+#define DAQP_CONTROL_PACER_CLK_1MHZDAQP_CONTROL_PACER_CLK(2)
+#define DAQP_CONTROL_PACER_CLK_100KHZ  DAQP_CONTROL_PACER_CLK(3)
 #define DAQP_CONTORL_EXPANSION 0x20
 #define DAQP_CONTROL_EOS_INT_ENABLE0x10
 #define DAQP_CONTROL_FIFO_INT_ENABLE   0x08
@@ -434,7 +435,6 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
struct comedi_cmd *cmd = &s->async->cmd;
int counter;
int threshold;
-   int v;
 
if (devpriv->stop)
return -EIO;
@@ -547,12 +547,10 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
outb((DAQP_FIFO_SIZE - threshold) & 0xff, dev->iobase + DAQP_FIFO);
outb((DAQP_FIFO_SIZE - threshold) >> 8, dev->iobase + DAQP_FIFO);
 
-   /* Set trigger */
-
-   v = DAQP_CONTROL_TRIGGER_CONTINUOUS | DAQP_CONTROL_TRIGGER_INTERNAL
-   | DAQP_CONTROL_PACER_5MHz | DAQP_CONTROL_FIFO_INT_ENABLE;
-
-   outb(v, dev->iobase + DAQP_CONTROL);
+   /* 5 MHz pacer, FIFO threshold interrupt, continuous internal trigger */
+   outb(DAQP_CONTROL_PACER_CLK_5MHZ | DAQP_CONTROL_FIFO_INT_ENABLE |
+DAQP_CONTROL_TRIGGER_CONTINUOUS | DAQP_CONTROL_TRIGGER_INTERNAL,
+dev->iobase + DAQP_CONTROL);
 
/* Reset any pending interrupts (my card has a tendency to require
 * require multiple reads on the status register to achieve this)
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 09/17] staging: comedi: quatech_daqp_cs: use comedi_offset_munge() in ao (*insn_write)

2015-10-01 Thread H Hartley Sweeten
Use the comedi_offset_munge() helper to do the offset binary to two's
complement conversion when writing a new analog output value.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 8 +++-
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 23c79e3..9514544 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -594,11 +594,9 @@ static int daqp_ao_insn_write(struct comedi_device *dev,
 
s->readback[chan] = val;
 
-   val &= 0x0fff;
-   val ^= 0x0800;  /* Flip the sign */
-   val |= (chan << 12);
-
-   outw(val, dev->iobase + DAQP_DA);
+   /* write the two's complement value to the channel */
+   outw((chan << 12) | comedi_offset_munge(s, val),
+dev->iobase + DAQP_DA);
}
 
return insn->n;
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 10/17] staging: comedi: quatech_daqp_cs: use comedi_timeout() in ao (*insn_write)

2015-10-01 Thread H Hartley Sweeten
The data link between the D/A data port and the D/A converter is a serial
link. The serial link requires about 8ms to complete a transfer. Use the
comedi_timeout() helper to ensure that there is not a previous transfer
still happening before trying to write new data to the channel.

For aesthetics, save the readback value after updating the hardware.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 21 -
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 9514544..4d96795 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -574,6 +574,19 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
return 0;
 }
 
+static int daqp_ao_empty(struct comedi_device *dev,
+struct comedi_subdevice *s,
+struct comedi_insn *insn,
+unsigned long context)
+{
+   unsigned int status;
+
+   status = inb(dev->iobase + DAQP_AUX);
+   if ((status & DAQP_AUX_DA_BUFFER) == 0)
+   return 0;
+   return -EBUSY;
+}
+
 static int daqp_ao_insn_write(struct comedi_device *dev,
  struct comedi_subdevice *s,
  struct comedi_insn *insn,
@@ -591,12 +604,18 @@ static int daqp_ao_insn_write(struct comedi_device *dev,
 
for (i = 0; i > insn->n; i++) {
unsigned val = data[i];
+   int ret;
 
-   s->readback[chan] = val;
+   /* D/A transfer rate is about 8ms */
+   ret = comedi_timeout(dev, s, insn, daqp_ao_empty, 0);
+   if (ret)
+   return ret;
 
/* write the two's complement value to the channel */
outw((chan << 12) | comedi_offset_munge(s, val),
 dev->iobase + DAQP_DA);
+
+   s->readback[chan] = val;
}
 
return insn->n;
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 08/17] staging: comedi: quatech_daqp_cs: introduce daqp_ai_get_sample()

2015-10-01 Thread H Hartley Sweeten
Introduce a helper function to get a two's complement sample from
the FIFO and munge it to the offset binary format that comedi uses.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 23 ---
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index d2e9049..23c79e3 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -169,6 +169,20 @@ static int daqp_ai_cancel(struct comedi_device *dev,
return 0;
 }
 
+unsigned int daqp_ai_get_sample(struct comedi_device *dev,
+   struct comedi_subdevice *s)
+{
+   unsigned int val;
+
+   /*
+* Get a two's complement sample from the FIFO and
+* return the munged offset binary value.
+*/
+   val = inb(dev->iobase + DAQP_FIFO);
+   val |= inb(dev->iobase + DAQP_FIFO) << 8;
+   return comedi_offset_munge(s, val);
+}
+
 static irqreturn_t daqp_interrupt(int irq, void *dev_id)
 {
struct comedi_device *dev = dev_id;
@@ -190,10 +204,7 @@ static irqreturn_t daqp_interrupt(int irq, void *dev_id)
break;
}
 
-   data = inb(dev->iobase + DAQP_FIFO);
-   data |= inb(dev->iobase + DAQP_FIFO) << 8;
-   data ^= 0x8000;
-
+   data = daqp_ai_get_sample(dev, s);
comedi_buf_write_samples(s, &data, 1);
 
if (cmd->stop_src == TRIG_COUNT &&
@@ -309,9 +320,7 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
/* clear the status event flags */
inb(dev->iobase + DAQP_STATUS);
 
-   data[i] = inb(dev->iobase + DAQP_FIFO);
-   data[i] |= inb(dev->iobase + DAQP_FIFO) << 8;
-   data[i] ^= 0x8000;
+   data[i] = daqp_ai_get_sample(dev, s);
}
 
/* stop any conversions and clear the status event flags */
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 06/17] staging: comedi: quatech_daqp_cs: fix daqp_ai_cancel()

2015-10-01 Thread H Hartley Sweeten
Make sure interrupts are disabled and the event flags are cleared when
the analog input async command is canceled.

Remove the unnecessary calls to stop any running conversions in the
(*insn_read) and (*do_cmd) functions. The comedi core will only call
these functions if the subdevice is not busy (it has already been
canceled).

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 20 
 1 file changed, 8 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index dbb8ffc..f337833 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -152,19 +152,21 @@ static const struct comedi_lrange range_daqp_ai = {
}
 };
 
-/* Cancel a running acquisition */
-
-static int daqp_ai_cancel(struct comedi_device *dev, struct comedi_subdevice 
*s)
+static int daqp_ai_cancel(struct comedi_device *dev,
+ struct comedi_subdevice *s)
 {
struct daqp_private *devpriv = dev->private;
 
if (devpriv->stop)
return -EIO;
 
+   /*
+* Stop any conversions, disable interrupts, and clear
+* the status event flags.
+*/
outb(DAQP_COMMAND_STOP, dev->iobase + DAQP_COMMAND);
-
-   /* flush any linguring data in FIFO - superfluous here */
-   /* outb(DAQP_COMMAND_RSTF, dev->iobase+DAQP_COMMAND); */
+   outb(0, dev->iobase + DAQP_CONTROL);
+   inb(dev->iobase + DAQP_STATUS);
 
devpriv->interrupt_mode = semaphore;
 
@@ -282,9 +284,6 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
if (devpriv->stop)
return -EIO;
 
-   /* Stop any running conversion */
-   daqp_ai_cancel(dev, s);
-
outb(0, dev->iobase + DAQP_AUX);
 
/* Program one scan list entry */
@@ -443,9 +442,6 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
if (devpriv->stop)
return -EIO;
 
-   /* Stop any running conversion */
-   daqp_ai_cancel(dev, s);
-
outb(0, dev->iobase + DAQP_AUX);
 
/* Program pacer clock */
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 04/17] staging: comedi: quatech_daqp_cs: tidy up daqp_ai_set_one_scanlist_entry()

2015-10-01 Thread H Hartley Sweeten
Clarify the scan list programming a bit by refactoring this function to program
the entire scan list instead of just a single entry. Move the necessary reset
of the scan list into this function. Rename the function.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 49 +++-
 1 file changed, 22 insertions(+), 27 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 7c8f081..de28224 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -243,25 +243,31 @@ static enum irqreturn daqp_interrupt(int irq, void 
*dev_id)
return IRQ_HANDLED;
 }
 
-static void daqp_ai_set_one_scanlist_entry(struct comedi_device *dev,
-  unsigned int chanspec,
-  int start)
+static void daqp_ai_set_scanlist(struct comedi_device *dev,
+unsigned int *chanspec, int len)
 {
-   unsigned int chan = CR_CHAN(chanspec);
-   unsigned int range = CR_RANGE(chanspec);
-   unsigned int aref = CR_AREF(chanspec);
-   unsigned int val;
+   int i;
+
+   /* Reset scan list queue */
+   outb(DAQP_COMMAND_RSTQ, dev->iobase + DAQP_COMMAND);
 
-   val = DAQP_SCANLIST_CHANNEL(chan) | DAQP_SCANLIST_GAIN(range);
+   for (i = 0; i < len; i++) {
+   unsigned int chan = CR_CHAN(chanspec[i]);
+   unsigned int range = CR_RANGE(chanspec[i]);
+   unsigned int aref = CR_AREF(chanspec[i]);
+   unsigned int val;
 
-   if (aref == AREF_DIFF)
-   val |= DAQP_SCANLIST_DIFFERENTIAL;
+   val = DAQP_SCANLIST_CHANNEL(chan) | DAQP_SCANLIST_GAIN(range);
 
-   if (start)
-   val |= DAQP_SCANLIST_START;
+   if (aref == AREF_DIFF)
+   val |= DAQP_SCANLIST_DIFFERENTIAL;
 
-   outb(val & 0xff, dev->iobase + DAQP_SCANLIST);
-   outb((val >> 8) & 0xff, dev->iobase + DAQP_SCANLIST);
+   if (i == 0)
+   val |= DAQP_SCANLIST_START;
+
+   outb(val & 0xff, dev->iobase + DAQP_SCANLIST);
+   outb((val >> 8) & 0xff, dev->iobase + DAQP_SCANLIST);
+   }
 }
 
 /* One-shot analog data acquisition routine */
@@ -283,11 +289,8 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
 
outb(0, dev->iobase + DAQP_AUX);
 
-   /* Reset scan list queue */
-   outb(DAQP_COMMAND_RSTQ, dev->iobase + DAQP_COMMAND);
-
/* Program one scan list entry */
-   daqp_ai_set_one_scanlist_entry(dev, insn->chanspec, 1);
+   daqp_ai_set_scanlist(dev, &insn->chanspec, 1);
 
/* Reset data FIFO (see page 28 of DAQP User's Manual) */
 
@@ -438,7 +441,6 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
struct comedi_cmd *cmd = &s->async->cmd;
int counter;
int threshold;
-   int i;
int v;
 
if (devpriv->stop)
@@ -449,20 +451,13 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
 
outb(0, dev->iobase + DAQP_AUX);
 
-   /* Reset scan list queue */
-   outb(DAQP_COMMAND_RSTQ, dev->iobase + DAQP_COMMAND);
-
/* Program pacer clock */
outb(devpriv->pacer_div & 0xff, dev->iobase + DAQP_PACER_LOW);
outb((devpriv->pacer_div >> 8) & 0xff, dev->iobase + DAQP_PACER_MID);
outb((devpriv->pacer_div >> 16) & 0xff, dev->iobase + DAQP_PACER_HIGH);
 
/* Program scan list */
-   for (i = 0; i < cmd->chanlist_len; i++) {
-   int start = (i == 0);
-
-   daqp_ai_set_one_scanlist_entry(dev, cmd->chanlist[i], start);
-   }
+   daqp_ai_set_scanlist(dev, cmd->chanlist, cmd->chanlist_len);
 
/* Now it's time to program the FIFO threshold, basically the
 * number of samples the card will buffer before it interrupts
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 05/17] staging: comedi: quatech_daqp_cs: don't use interrupts for ai (*insn_read)

2015-10-01 Thread H Hartley Sweeten
The comedi (*insn_read) functions are supposed to do simple one-shot
reading of an analog input channel. Currently this driver enables
interrupts and uses wait_for_completion_interruptible() to allow the
interrupt routine to let the analog input (*insn_read) know that
the end-of-conversion has occured.

Simplify the function by using the comedi_timeout() helper to check
the aux status register to see when the conversion is finished.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 59 +++-
 1 file changed, 28 insertions(+), 31 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index de28224..dbb8ffc 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -48,8 +48,6 @@ Devices: [Quatech] DAQP-208 (daqp), DAQP-308
 */
 
 #include 
-#include 
-#include 
 
 #include "../comedi_pcmcia.h"
 
@@ -59,8 +57,6 @@ struct daqp_private {
int stop;
 
enum { semaphore, buffer } interrupt_mode;
-
-   struct completion eos;
 };
 
 /* The DAQP communicates with the system through a 16 byte I/O window. */
@@ -175,15 +171,6 @@ static int daqp_ai_cancel(struct comedi_device *dev, 
struct comedi_subdevice *s)
return 0;
 }
 
-/* Interrupt handler
- *
- * Operates in one of two modes.  If devpriv->interrupt_mode is
- * 'semaphore', just signal the devpriv->eos completion and return
- * (one-shot mode).  Otherwise (continuous mode), read data in from
- * the card, transfer it to the buffer provided by the higher-level
- * comedi kernel module, and signal various comedi callback routines,
- * which run pretty quick.
- */
 static enum irqreturn daqp_interrupt(int irq, void *dev_id)
 {
struct comedi_device *dev = dev_id;
@@ -198,7 +185,6 @@ static enum irqreturn daqp_interrupt(int irq, void *dev_id)
 
switch (devpriv->interrupt_mode) {
case semaphore:
-   complete(&devpriv->eos);
break;
 
case buffer:
@@ -270,15 +256,27 @@ static void daqp_ai_set_scanlist(struct comedi_device 
*dev,
}
 }
 
-/* One-shot analog data acquisition routine */
+static int daqp_ai_eos(struct comedi_device *dev,
+  struct comedi_subdevice *s,
+  struct comedi_insn *insn,
+  unsigned long context)
+{
+   unsigned int status;
+
+   status = inb(dev->iobase + DAQP_AUX);
+   if (status & DAQP_AUX_CONVERSION)
+   return 0;
+   return -EBUSY;
+}
 
 static int daqp_ai_insn_read(struct comedi_device *dev,
 struct comedi_subdevice *s,
-struct comedi_insn *insn, unsigned int *data)
+struct comedi_insn *insn,
+unsigned int *data)
 {
struct daqp_private *devpriv = dev->private;
+   int ret = 0;
int i;
-   int v;
int counter = 1;
 
if (devpriv->stop)
@@ -296,12 +294,8 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
 
outb(DAQP_COMMAND_RSTF, dev->iobase + DAQP_COMMAND);
 
-   /* Set trigger */
-
-   v = DAQP_CONTROL_TRIGGER_ONESHOT | DAQP_CONTROL_TRIGGER_INTERNAL
-   | DAQP_CONTROL_PACER_100kHz | DAQP_CONTROL_EOS_INT_ENABLE;
-
-   outb(v, dev->iobase + DAQP_CONTROL);
+   /* one-shot internal trigger, no pacer, no interrupts */
+   outb(0, dev->iobase + DAQP_CONTROL);
 
/* Reset any pending interrupts (my card has a tendency to require
 * require multiple reads on the status register to achieve this)
@@ -316,25 +310,28 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
return -1;
}
 
-   init_completion(&devpriv->eos);
-   devpriv->interrupt_mode = semaphore;
-
for (i = 0; i < insn->n; i++) {
/* Start conversion */
outb(DAQP_COMMAND_ARM | DAQP_COMMAND_FIFO_DATA,
 dev->iobase + DAQP_COMMAND);
 
-   /* Wait for interrupt service routine to unblock completion */
-   /* Maybe could use a timeout here, but it's interruptible */
-   if (wait_for_completion_interruptible(&devpriv->eos))
-   return -EINTR;
+   ret = comedi_timeout(dev, s, insn, daqp_ai_eos, 0);
+   if (ret)
+   break;
+
+   /* clear the status event flags */
+   inb(dev->iobase + DAQP_STATUS);
 
data[i] = inb(dev->iobase + DAQP_FIFO);
data[i] |= inb(dev->iobase + DAQP_FIFO) << 8;
data[i] ^= 0x8000;
}
 
-   return insn->n;
+   /* stop any conversions and clear the status event flags */
+   outb(DAQP_COMMAND_STOP, dev->iobase + DAQP_COMMAND);
+   inb(dev->iobase + DAQP_STATUS);
+
+   return

[PATCH 07/17] staging: comedi: quatech_daqp_cs: remove 'interrupt_mode'

2015-10-01 Thread H Hartley Sweeten
The interrupt handler is now only used for the ai async command.
Remove the unnecessary 'interrupt_mode' from the private data and
tidy up the interrupt handler.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 70 ++--
 1 file changed, 28 insertions(+), 42 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index f337833..d2e9049 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -55,8 +55,6 @@ struct daqp_private {
unsigned int pacer_div;
unsigned char scanrate;
int stop;
-
-   enum { semaphore, buffer } interrupt_mode;
 };
 
 /* The DAQP communicates with the system through a 16 byte I/O window. */
@@ -168,15 +166,12 @@ static int daqp_ai_cancel(struct comedi_device *dev,
outb(0, dev->iobase + DAQP_CONTROL);
inb(dev->iobase + DAQP_STATUS);
 
-   devpriv->interrupt_mode = semaphore;
-
return 0;
 }
 
-static enum irqreturn daqp_interrupt(int irq, void *dev_id)
+static irqreturn_t daqp_interrupt(int irq, void *dev_id)
 {
struct comedi_device *dev = dev_id;
-   struct daqp_private *devpriv = dev->private;
struct comedi_subdevice *s = dev->read_subdev;
struct comedi_cmd *cmd = &s->async->cmd;
int loop_limit = 1;
@@ -185,49 +180,42 @@ static enum irqreturn daqp_interrupt(int irq, void 
*dev_id)
if (!dev->attached)
return IRQ_NONE;
 
-   switch (devpriv->interrupt_mode) {
-   case semaphore:
-   break;
+   status = inb(dev->iobase + DAQP_STATUS);
+   while (!(status & DAQP_STATUS_FIFO_EMPTY)) {
+   unsigned short data;
 
-   case buffer:
-   while (!((status = inb(dev->iobase + DAQP_STATUS))
-& DAQP_STATUS_FIFO_EMPTY)) {
-   unsigned short data;
+   if (status & DAQP_STATUS_DATA_LOST) {
+   s->async->events |= COMEDI_CB_OVERFLOW;
+   dev_warn(dev->class_dev, "data lost\n");
+   break;
+   }
 
-   if (status & DAQP_STATUS_DATA_LOST) {
-   s->async->events |= COMEDI_CB_OVERFLOW;
-   dev_warn(dev->class_dev, "data lost\n");
-   break;
-   }
+   data = inb(dev->iobase + DAQP_FIFO);
+   data |= inb(dev->iobase + DAQP_FIFO) << 8;
+   data ^= 0x8000;
 
-   data = inb(dev->iobase + DAQP_FIFO);
-   data |= inb(dev->iobase + DAQP_FIFO) << 8;
-   data ^= 0x8000;
+   comedi_buf_write_samples(s, &data, 1);
 
-   comedi_buf_write_samples(s, &data, 1);
+   if (cmd->stop_src == TRIG_COUNT &&
+   s->async->scans_done >= cmd->stop_arg) {
+   s->async->events |= COMEDI_CB_EOA;
+   break;
+   }
 
-   /* If there's a limit, decrement it
-* and stop conversion if zero
-*/
+   if ((loop_limit--) <= 0)
+   break;
 
-   if (cmd->stop_src == TRIG_COUNT &&
-   s->async->scans_done >= cmd->stop_arg) {
-   s->async->events |= COMEDI_CB_EOA;
-   break;
-   }
+   status = inb(dev->iobase + DAQP_STATUS);
+   }
 
-   if ((loop_limit--) <= 0)
-   break;
-   }
+   if (loop_limit <= 0) {
+   dev_warn(dev->class_dev,
+"loop_limit reached in daqp_interrupt()\n");
+   s->async->events |= COMEDI_CB_ERROR;
+   }
 
-   if (loop_limit <= 0) {
-   dev_warn(dev->class_dev,
-"loop_limit reached in daqp_interrupt()\n");
-   s->async->events |= COMEDI_CB_ERROR;
-   }
+   comedi_handle_events(dev, s);
 
-   comedi_handle_events(dev, s);
-   }
return IRQ_HANDLED;
 }
 
@@ -570,8 +558,6 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
return -1;
}
 
-   devpriv->interrupt_mode = buffer;
-
/* Start conversion */
outb(DAQP_COMMAND_ARM | DAQP_COMMAND_FIFO_DATA | devpriv->scanrate,
 dev->iobase + DAQP_COMMAND);
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 03/17] staging: comedi: quatech_daqp_cs: fix ai cmd timing

2015-10-01 Thread H Hartley Sweeten
According to the users manual, the conversion timing (scanrate) is fixed
to 100, 50, or 25 kHz. The pacer clock is then used to trigger each scan.

Currently this driver tries to fake other conversion speeds by always
sampling the inputs at 100 kHz and using the pacer clock to trigger each
conversion. It does this by setting the SCANLIST_START bit for each
entry in the scan list. According to the users manual, this bit has to be
set for the first (and ONLY the first) entry of the scan list.

Fix the ai (*do_cmdtest) to properly validate the command timing and allow
the conversion time to be set.

Cleanup the ai (*do_cmd) to set the timing correctly.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 115 ---
 1 file changed, 40 insertions(+), 75 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index b2effb8..7c8f081 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -54,6 +54,8 @@ Devices: [Quatech] DAQP-208 (daqp), DAQP-308
 #include "../comedi_pcmcia.h"
 
 struct daqp_private {
+   unsigned int pacer_div;
+   unsigned char scanrate;
int stop;
 
enum { semaphore, buffer } interrupt_mode;
@@ -114,9 +116,10 @@ struct daqp_private {
 #define DAQP_COMMAND_RSTQ  0x20
 #define DAQP_COMMAND_STOP  0x10
 #define DAQP_COMMAND_LATCH 0x08
-#define DAQP_COMMAND_100kHz0x00
-#define DAQP_COMMAND_50kHz 0x02
-#define DAQP_COMMAND_25kHz 0x04
+#define DAQP_COMMAND_SCANRATE(x)   (((x) & 0x3) << 1)
+#define DAQP_COMMAND_SCANRATE_100KHZ   DAQP_COMMAND_SCANRATE(0)
+#define DAQP_COMMAND_SCANRATE_50KHZDAQP_COMMAND_SCANRATE(1)
+#define DAQP_COMMAND_SCANRATE_25KHZDAQP_COMMAND_SCANRATE(2)
 #define DAQP_COMMAND_FIFO_DATA 0x01
 #define DAQP_COMMAND_FIFO_PROGRAM  0x00
 
@@ -348,25 +351,18 @@ static int daqp_ns_to_timer(unsigned int *ns, unsigned 
int flags)
return timer;
 }
 
-/* cmdtest tests a particular command to see if it is valid.
- * Using the cmdtest ioctl, a user can create a valid cmd
- * and then have it executed by the cmd ioctl.
- *
- * cmdtest returns 1,2,3,4 or 0, depending on which tests
- * the command passes.
- */
-
 static int daqp_ai_cmdtest(struct comedi_device *dev,
-  struct comedi_subdevice *s, struct comedi_cmd *cmd)
+  struct comedi_subdevice *s,
+  struct comedi_cmd *cmd)
 {
+   struct daqp_private *devpriv = dev->private;
int err = 0;
unsigned int arg;
 
/* Step 1 : check if triggers are trivially valid */
 
err |= comedi_check_trigger_src(&cmd->start_src, TRIG_NOW);
-   err |= comedi_check_trigger_src(&cmd->scan_begin_src,
-   TRIG_TIMER | TRIG_FOLLOW);
+   err |= comedi_check_trigger_src(&cmd->scan_begin_src, TRIG_TIMER);
err |= comedi_check_trigger_src(&cmd->convert_src,
TRIG_TIMER | TRIG_NOW);
err |= comedi_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
@@ -377,7 +373,6 @@ static int daqp_ai_cmdtest(struct comedi_device *dev,
 
/* Step 2a : make sure trigger sources are unique */
 
-   err |= comedi_check_trigger_is_unique(cmd->scan_begin_src);
err |= comedi_check_trigger_is_unique(cmd->convert_src);
err |= comedi_check_trigger_is_unique(cmd->stop_src);
 
@@ -390,28 +385,30 @@ static int daqp_ai_cmdtest(struct comedi_device *dev,
 
err |= comedi_check_trigger_arg_is(&cmd->start_arg, 0);
 
-#define MAX_SPEED  1   /* 100 kHz - in nanoseconds */
-
-   if (cmd->scan_begin_src == TRIG_TIMER) {
-   err |= comedi_check_trigger_arg_min(&cmd->scan_begin_arg,
-   MAX_SPEED);
-   }
-
-   /* If both scan_begin and convert are both timer values, the only
-* way that can make sense is if the scan time is the number of
-* conversions times the convert time
-*/
-
-   if (cmd->scan_begin_src == TRIG_TIMER && cmd->convert_src == TRIG_TIMER
-   && cmd->scan_begin_arg != cmd->convert_arg * cmd->scan_end_arg) {
-   err |= -EINVAL;
-   }
-
+   /* 100, 50, and 25 kHz scanrates (conversion times) are supported */
if (cmd->convert_src == TRIG_TIMER) {
-   err |= comedi_check_trigger_arg_min(&cmd->convert_arg,
-   MAX_SPEED);
+   if (cmd->convert_arg <= 1) {
+   devpriv->scanrate = DAQP_COMMAND_SCANRATE_100KHZ;
+   arg = 1;/* 100 kHz (in ns) */
+   } else if (cmd->convert_arg <= 2) {
+   devpriv->scanrate = DAQP_COMMAND_

[PATCH 02/17] staging: comedi: quatech_daqp_cs: there are 4 digital inputs

2015-10-01 Thread H Hartley Sweeten
This board has 4 digital inputs not 1. Fix the subdevice init.

The digital input lines are shared with other functions. Add a
comment about this.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 13 -
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index a4a5244..b2effb8 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -741,10 +741,21 @@ static int daqp_auto_attach(struct comedi_device *dev,
if (ret)
return ret;
 
+   /*
+* Digital Input subdevice
+* NOTE: The digital input lines are shared:
+*
+* Chan  Normal ModeExpansion Mode
+*   -  
+*  0DI0, ext. trigger  Same as normal mode
+*  1DI1External gain select, lo bit
+*  2DI2, ext. clockSame as normal mode
+*  3DI3External gain select, hi bit
+*/
s = &dev->subdevices[2];
s->type = COMEDI_SUBD_DI;
s->subdev_flags = SDF_READABLE;
-   s->n_chan   = 1;
+   s->n_chan   = 4;
s->maxdata  = 1;
s->insn_bits= daqp_di_insn_bits;
 
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 00/17] staging: comedi: quatech_daqp_cs: cleanup driver

2015-10-01 Thread H Hartley Sweeten
Following is the cleanup series for the comedi quatech_daqp_cs PCMCIA
driver.

H Hartley Sweeten (17):
  staging: comedi: quatech_daqp_cs: there are 4 digital outputs
  staging: comedi: quatech_daqp_cs: there are 4 digital inputs
  staging: comedi: quatech_daqp_cs: fix ai cmd timing
  staging: comedi: quatech_daqp_cs: tidy up daqp_ai_set_one_scanlist_entry()
  staging: comedi: quatech_daqp_cs: don't use interrupts for ai (*insn_read)
  staging: comedi: quatech_daqp_cs: fix daqp_ai_cancel()
  staging: comedi: quatech_daqp_cs: remove 'interrupt_mode'
  staging: comedi: quatech_daqp_cs: introduce daqp_ai_get_sample()
  staging: comedi: quatech_daqp_cs: use comedi_offset_munge() in ao 
(*insn_write)
  staging: comedi: quatech_daqp_cs: use comedi_timeout() in ao (*insn_write)
  staging: comedi: quatech_daqp_cs: spaces preferred around that '<<'
  staging: comedi: quatech_daqp_cs: redefine pacer clock options
  staging: comedi: quatech_daqp_cs: introduce daqp_clear_events()
  staging: comedi: quatech_daqp_cs: only hook up cmd support if we have an IRQ
  staging: comedi: quatech_daqp_cs: tidy up multi-line comments
  staging: comedi: quatech_daqp_cs: handle shared interrupt
  staging: comedi: quatech_daqp_cs: tidy up register map defines

 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 710 +++
 1 file changed, 349 insertions(+), 361 deletions(-)

-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 01/17] staging: comedi: quatech_daqp_cs: there are 4 digital outputs

2015-10-01 Thread H Hartley Sweeten
This board has 4 digital outputs not 1. Fix the subdevice init.

The digital output lines are used for the external channel selection
when the expansion mode is enabled. Add a comment about this.

Signed-off-by: H Hartley Sweeten 
Cc: Ian Abbott 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 152cb14..a4a5244 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -748,10 +748,17 @@ static int daqp_auto_attach(struct comedi_device *dev,
s->maxdata  = 1;
s->insn_bits= daqp_di_insn_bits;
 
+   /*
+* Digital Output subdevice
+* NOTE: The digital output lines share the same pins on the
+* interface connector as the four external channel selection
+* bits. If expansion mode is used the digital outputs do not
+* work.
+*/
s = &dev->subdevices[3];
s->type = COMEDI_SUBD_DO;
s->subdev_flags = SDF_WRITABLE;
-   s->n_chan   = 1;
+   s->n_chan   = 4;
s->maxdata  = 1;
s->insn_bits= daqp_do_insn_bits;
 
-- 
2.5.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: rtl8192e: rtl_wx: fix negative noise value

2015-10-01 Thread Mateusz Kulikowski
On 30.09.2015 14:12, Luis de Bethencourt wrote:
> wstats->qual.noise is of type uint8, so it shouldn't be assigned a
> negative number. Assigning it 0x100 - 100, which is the equivalent
> to -100 dBm when IW_QUAL_DBM is set.
> 
> Signed-off-by: Luis de Bethencourt 
> ---
>  drivers/staging/rtl8192e/rtl8192e/rtl_wx.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c 
> b/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c
> index 984cb9a..70df6a1 100644
> --- a/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c
> +++ b/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c
> @@ -1225,7 +1225,7 @@ static struct iw_statistics 
> *_rtl92e_get_wireless_stats(struct net_device *dev)
>   if (ieee->state < RTLLIB_LINKED) {
>   wstats->qual.qual = 10;
>   wstats->qual.level = 0;
> - wstats->qual.noise = -100;
> + wstats->qual.noise = 0x100 - 100;   /* -100 dBm */
>   wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
>   return wstats;
>   }
> 


Tested-by: Mateusz Kulikowski 

Although I still don't understand why someone wanted to have unsigned noise
(historical reasons perhaps?)


Mateusz
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] mtd: nand: pass page number to ecc->write_xxx() methods

2015-10-01 Thread Brian Norris
On Mon, Aug 24, 2015 at 07:10:19PM +0200, Boris Brezillon wrote:
> The ->read_xxx() methods are all passed the page number the NAND controller
> is supposed to read, but ->write_xxx() do not have such a parameter.
> 
> This is a problem if we want to properly implement data
> scrambling/randomization in order to mitigate MLC sensibility to repeated
> pattern: to prevent bitflips in adjacent pages in the same block we need
> to avoid repeating the same pattern at the same offset in those pages,
> hence the randomizer/scrambler engine need to be passed the page value
> in order to adapt its seed accordingly.
> 
> Moreover, adding the page parameter the ->write_xxx() methods add some
> consistency to the current model.
> 
> Signed-off-by: Boris Brezillon 
> CC: Josh Wu 
> CC: Ezequiel Garcia 
> CC: Maxime Ripard 
> CC: Greg Kroah-Hartman 
> CC: Huang Shijie 
> CC: Bryan Wu 
> CC: de...@driverdev.osuosl.org
> CC: linux-arm-ker...@lists.infradead.org
> CC: linux-ker...@vger.kernel.org
> 
> ---
>  drivers/mtd/nand/atmel_nand.c |  6 --
>  drivers/mtd/nand/bf5xx_nand.c |  3 ++-
>  drivers/mtd/nand/brcmnand/brcmnand.c  |  4 ++--
>  drivers/mtd/nand/cafe_nand.c  |  3 ++-
>  drivers/mtd/nand/denali.c |  5 +++--
>  drivers/mtd/nand/docg4.c  |  4 ++--
>  drivers/mtd/nand/fsl_elbc_nand.c  |  4 ++--
>  drivers/mtd/nand/fsl_ifc_nand.c   |  2 +-
>  drivers/mtd/nand/gpmi-nand/gpmi-nand.c|  6 +++---
>  drivers/mtd/nand/hisi504_nand.c   |  3 ++-
>  drivers/mtd/nand/lpc32xx_mlc.c|  3 ++-
>  drivers/mtd/nand/lpc32xx_slc.c|  5 +++--
>  drivers/mtd/nand/nand_base.c  | 31 
> ++-
>  drivers/mtd/nand/omap2.c  |  3 ++-
>  drivers/mtd/nand/pxa3xx_nand.c|  3 ++-
>  drivers/mtd/nand/sh_flctl.c   |  3 ++-
>  drivers/mtd/nand/sunxi_nand.c |  5 +++--
>  drivers/staging/mt29f_spinand/mt29f_spinand.c |  3 ++-
>  include/linux/mtd/nand.h  |  6 +++---
>  19 files changed, 63 insertions(+), 39 deletions(-)

Tip for rebasing -- I noticed one build failure for docg4:

  drivers/mtd/nand/docg4.c: In function ‘docg4_block_markbad’:
  drivers/mtd/nand/docg4.c:1116:2: error: too few arguments to function 
‘docg4_write_page’
  drivers/mtd/nand/docg4.c:985:12: note: declared here

Brian
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] mtd: nand: pass page number to ecc->write_xxx() methods

2015-10-01 Thread Brian Norris
On Thu, Oct 01, 2015 at 05:07:43PM +0200, Boris Brezillon wrote:
> On Mon, 24 Aug 2015 19:10:19 +0200
> Boris Brezillon  wrote:
> 
> > The ->read_xxx() methods are all passed the page number the NAND controller
> > is supposed to read, but ->write_xxx() do not have such a parameter.
> > 
> > This is a problem if we want to properly implement data
> > scrambling/randomization in order to mitigate MLC sensibility to repeated
> > pattern: to prevent bitflips in adjacent pages in the same block we need
> > to avoid repeating the same pattern at the same offset in those pages,
> > hence the randomizer/scrambler engine need to be passed the page value
> > in order to adapt its seed accordingly.
> > 
> > Moreover, adding the page parameter the ->write_xxx() methods add some
> > consistency to the current model.
> 
> Apparently nobody complained (or nobody cares :-)) about that patch,
> and I'll really need the page information if I want to support
> randomization/scrambling in the sunxi driver.
> 
> Do you have any objections to this patch

No, I guess not.

> (I can rebase it on mainline
> and check if new drivers have been added since the submission)?

I recently compile tested it against the tip of tree (don't know why I
didn't merge it then), but I think we added one driver since then. I
suppose a rebase is in order.

> I remember you pointed a trick you've used in the brcmnand driver to
> get this page information (storing it during the ->cmdfunc() or
> ->ctrl_cmd() call), but it would be way easier to have it directly in
> the ecc->write_xxx() parameters...

Right, that's not a pattern I'd really like people to copy...

Regards,
Brian
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 11/13] staging: unisys: visorinput: register & use input_dev open() and close()

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

Registration of visorinput_open() and visorinput_close() for each device
allow us to eliminate unnecessary activity when nobody in user-land
cares.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorinput/visorinput.c | 55 +++---
 1 file changed, 50 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/unisys/visorinput/visorinput.c 
b/drivers/staging/unisys/visorinput/visorinput.c
index d47cc2b..103f72b 100644
--- a/drivers/staging/unisys/visorinput/visorinput.c
+++ b/drivers/staging/unisys/visorinput/visorinput.c
@@ -66,6 +66,7 @@ struct visorinput_devdata {
struct rw_semaphore lock_visor_dev; /* lock for dev */
struct input_dev *visorinput_dev;
bool paused;
+   unsigned int opened;
unsigned int keycode_table_bytes; /* size of following array */
/* for keyboard devices: visorkbd_keycode[] + visorkbd_ext_keycode[] */
unsigned char keycode_table[0];
@@ -216,13 +217,50 @@ static const unsigned char 
visorkbd_ext_keycode[KEYCODE_TABLE_BYTES] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
 };
 
+static int visorinput_open(struct input_dev *visorinput_dev)
+{
+   struct visorinput_devdata *devdata = input_get_drvdata(visorinput_dev);
+
+   if (!devdata) {
+   pr_err("%s input_get_drvdata(%p) returned NULL\n",
+  __func__, visorinput_dev);
+   return -EINVAL;
+   }
+   devdata->opened++;
+   dev_dbg(&visorinput_dev->dev, "%s opened %d\n", __func__,
+   devdata->opened);
+   if (devdata->opened == 1)
+   visorbus_enable_channel_interrupts(devdata->dev);
+   return 0;
+}
+
+static void visorinput_close(struct input_dev *visorinput_dev)
+{
+   struct visorinput_devdata *devdata = input_get_drvdata(visorinput_dev);
+
+   if (!devdata) {
+   pr_err("%s input_get_drvdata(%p) returned NULL\n",
+  __func__, visorinput_dev);
+   return;
+   }
+   if (devdata->opened) {
+   devdata->opened--;
+   dev_dbg(&visorinput_dev->dev, "%s closed %d\n", __func__,
+   devdata->opened);
+   if (devdata->opened == 0)
+   visorbus_disable_channel_interrupts(devdata->dev);
+   } else
+   dev_err(&visorinput_dev->dev, "%s not open\n", __func__);
+}
+
 /*
  * register_client_keyboard() initializes and returns a Linux input node that
  * we can use to deliver keyboard inputs to Linux.  We of course do this when
  * we see keyboard inputs coming in on a keyboard channel.
  */
 static struct input_dev *
-register_client_keyboard(unsigned char *keycode_table)
+register_client_keyboard(void *devdata,  /* opaque on purpose */
+unsigned char *keycode_table)
 
 {
int i, error;
@@ -255,6 +293,10 @@ register_client_keyboard(unsigned char *keycode_table)
set_bit(keycode_table[i + KEYCODE_TABLE_BYTES],
visorinput_dev->keybit);
 
+   visorinput_dev->open = visorinput_open;
+   visorinput_dev->close = visorinput_close;
+   input_set_drvdata(visorinput_dev, devdata); /* pre input_register! */
+
error = input_register_device(visorinput_dev);
if (error) {
input_free_device(visorinput_dev);
@@ -264,7 +306,7 @@ register_client_keyboard(unsigned char *keycode_table)
 }
 
 static struct input_dev *
-register_client_mouse(void)
+register_client_mouse(void *devdata /* opaque on purpose */)
 {
int error;
struct input_dev *visorinput_dev = NULL;
@@ -298,6 +340,10 @@ register_client_mouse(void)
input_set_abs_params(visorinput_dev, ABS_X, 0, xres, 0, 0);
input_set_abs_params(visorinput_dev, ABS_Y, 0, yres, 0, 0);
 
+   visorinput_dev->open = visorinput_open;
+   visorinput_dev->close = visorinput_close;
+   input_set_drvdata(visorinput_dev, devdata); /* pre input_register! */
+
error = input_register_device(visorinput_dev);
if (error) {
input_free_device(visorinput_dev);
@@ -348,12 +394,12 @@ devdata_create(struct visor_device *dev, enum 
visorinput_device_type devtype)
memcpy(devdata->keycode_table + KEYCODE_TABLE_BYTES,
   visorkbd_ext_keycode, KEYCODE_TABLE_BYTES);
devdata->visorinput_dev = register_client_keyboard
-   (devdata->keycode_table);
+   (devdata, devdata->keycode_table);
if (!devdata->visorinput_dev)
goto cleanups_register;
break;
case visorinput_mouse:
-   devdata->visorinput_dev = register_client_mouse();
+   devdata->visorinput_dev = register_client_mouse(devdata);
if (!devdata->visorinput_dev)
goto cleanups_register;
  

[PATCH 13/13] staging: unisys: visorinput: remove extraneous do_key function

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

do_key() is no longer needed.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorinput/visorinput.c | 18 ++
 1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/unisys/visorinput/visorinput.c 
b/drivers/staging/unisys/visorinput/visorinput.c
index a002e07..3a1b24f 100644
--- a/drivers/staging/unisys/visorinput/visorinput.c
+++ b/drivers/staging/unisys/visorinput/visorinput.c
@@ -452,12 +452,6 @@ visorinput_remove(struct visor_device *dev)
kfree(devdata);
 }
 
-static void
-do_key(struct input_dev *inpt, int keycode, int down)
-{
-   input_report_key(inpt, keycode, down);
-}
-
 /*
  * Make it so the current locking state of the locking key indicated by
  *  is as indicated by  (1=locked, 0=unlocked).
@@ -490,9 +484,9 @@ handle_locking_key(struct input_dev *visorinput_dev,
int old_state = (test_bit(led, visorinput_dev->led) != 0);
 
if (old_state != desired_state) {
-   do_key(visorinput_dev, keycode, 1);
+   input_report_key(visorinput_dev, keycode, 1);
input_sync(visorinput_dev);
-   do_key(visorinput_dev, keycode, 0);
+   input_report_key(visorinput_dev, keycode, 0);
input_sync(visorinput_dev);
__change_bit(led, visorinput_dev->led);
}
@@ -563,17 +557,17 @@ visorinput_channel_interrupt(struct visor_device *dev)
keycode = scancode_to_keycode(scancode);
switch (r.activity.action) {
case inputaction_key_down:
-   do_key(visorinput_dev, keycode, 1);
+   input_report_key(visorinput_dev, keycode, 1);
input_sync(visorinput_dev);
break;
case inputaction_key_up:
-   do_key(visorinput_dev, keycode, 0);
+   input_report_key(visorinput_dev, keycode, 0);
input_sync(visorinput_dev);
break;
case inputaction_key_down_up:
-   do_key(visorinput_dev, keycode, 1);
+   input_report_key(visorinput_dev, keycode, 1);
input_sync(visorinput_dev);
-   do_key(visorinput_dev, keycode, 0);
+   input_report_key(visorinput_dev, keycode, 0);
input_sync(visorinput_dev);
break;
case inputaction_set_locking_key_state:
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 09/13] staging: unisys: visorinput: comment tweaks - s/gizmo/input node/g

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

Just a simple search and replace in the comments.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorinput/visorinput.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/unisys/visorinput/visorinput.c 
b/drivers/staging/unisys/visorinput/visorinput.c
index 976effa..adc2cc9 100644
--- a/drivers/staging/unisys/visorinput/visorinput.c
+++ b/drivers/staging/unisys/visorinput/visorinput.c
@@ -217,8 +217,8 @@ static const unsigned char 
visorkbd_ext_keycode[KEYCODE_TABLE_BYTES] = {
 };
 
 /*
- * register_client_keyboard() initializes and returns a Linux gizmo that we
- * can use to deliver keyboard inputs to Linux.  We of course do this when
+ * register_client_keyboard() initializes and returns a Linux input node that
+ * we can use to deliver keyboard inputs to Linux.  We of course do this when
  * we see keyboard inputs coming in on a keyboard channel.
  */
 static struct input_dev *
@@ -337,7 +337,7 @@ devdata_create(struct visor_device *dev, enum 
visorinput_device_type devtype)
 
/*
 * This is an input device in a client guest partition,
-* so we need to create whatever gizmos are necessary to
+* so we need to create whatever input nodes are necessary to
 * deliver our inputs to the guest OS.
 */
switch (devtype) {
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 03/13] staging: unisys: visorhid: rename to visorinput

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

This visorhid driver provides a Human Interface Device, but is not at all
using HID, the protocol.  It's a plain input driver, so for clarity, it is
being renamed to visorinput.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/Documentation/overview.txt  |  22 +-
 drivers/staging/unisys/Kconfig |   2 +-
 drivers/staging/unisys/Makefile|   2 +-
 drivers/staging/unisys/visorhid/Kconfig|  10 -
 drivers/staging/unisys/visorhid/Makefile   |   7 -
 drivers/staging/unisys/visorhid/keyboardchannel.h  |  32 -
 drivers/staging/unisys/visorhid/mousechannel.h |  33 -
 drivers/staging/unisys/visorhid/ultrainputreport.h |  74 ---
 drivers/staging/unisys/visorhid/visorhid.c | 671 -
 drivers/staging/unisys/visorinput/Kconfig  |  10 +
 drivers/staging/unisys/visorinput/Makefile |   7 +
 .../staging/unisys/visorinput/keyboardchannel.h|  32 +
 drivers/staging/unisys/visorinput/mousechannel.h   |  33 +
 .../staging/unisys/visorinput/ultrainputreport.h   |  74 +++
 drivers/staging/unisys/visorinput/visorinput.c | 671 +
 15 files changed, 840 insertions(+), 840 deletions(-)
 delete mode 100644 drivers/staging/unisys/visorhid/Kconfig
 delete mode 100644 drivers/staging/unisys/visorhid/Makefile
 delete mode 100644 drivers/staging/unisys/visorhid/keyboardchannel.h
 delete mode 100644 drivers/staging/unisys/visorhid/mousechannel.h
 delete mode 100644 drivers/staging/unisys/visorhid/ultrainputreport.h
 delete mode 100644 drivers/staging/unisys/visorhid/visorhid.c
 create mode 100644 drivers/staging/unisys/visorinput/Kconfig
 create mode 100644 drivers/staging/unisys/visorinput/Makefile
 create mode 100644 drivers/staging/unisys/visorinput/keyboardchannel.h
 create mode 100644 drivers/staging/unisys/visorinput/mousechannel.h
 create mode 100644 drivers/staging/unisys/visorinput/ultrainputreport.h
 create mode 100644 drivers/staging/unisys/visorinput/visorinput.c

diff --git a/drivers/staging/unisys/Documentation/overview.txt 
b/drivers/staging/unisys/Documentation/overview.txt
index 25f93f2..c2d8dd4 100644
--- a/drivers/staging/unisys/Documentation/overview.txt
+++ b/drivers/staging/unisys/Documentation/overview.txt
@@ -12,7 +12,7 @@ normally be unsharable, specifically:
 
 * visornic - network interface
 * visorhba - scsi disk adapter
-* visorhid - keyboard and mouse
+* visorinput - keyboard and mouse
 
 These drivers conform to the standard Linux bus/device model described
 within Documentation/driver-model/, and utilize a driver named visorbus to
@@ -44,7 +44,7 @@ NOT covered in this document:
 * Because the s-Par back-end provides a standard EFI framebuffer to each
   guest, the already-existing efifb Linux driver is used to provide guest
   video access. Thus, the only s-Par-unique support that is necessary to
-  provide a guest graphics console are for keyboard and mouse (via visorhid).
+  provide a guest graphics console are for keyboard and mouse (via visorinput).
 
 
 2. Driver Descriptions
@@ -296,13 +296,13 @@ i.e.:
 alias visorbus:8cd5994d-c58e-11da-95a9-00e08161165f visornic
 
 
-2.4. visorhid
--
+2.4. visorinput
+---
 
-The visorhid driver registers with visorbus as the function driver to
+The visorinput driver registers with visorbus as the function driver to
 handle human input devices, specified using the
 SPAR_KEYBOARD_CHANNEL_PROTOCOL_UUID and SPAR_MOUSE_CHANNEL_PROTOCOL_UUID
-types in the visorbus_register_visor_driver() call. visorhid uses
+types in the visorbus_register_visor_driver() call. visorinput uses
 input_register_device() to expose devices of class input
 (e.g., /sys/class/input/) for virtual keyboard and virtual mouse devices.
 A s-Par virtual keyboard device maps 1-to-1 with a Linux input device
@@ -312,7 +312,7 @@ devices created for it: 1 named "visor Wheel", and 1 named 
"visor Mouse".
 By registering as input class devices, modern versions of X will
 automatically find and properly use s-Par virtual keyboard and mouse devices.
 As the s-Par back-end reports keyboard and mouse activity via events on the
-virtual device channel, the visorhid driver delivers the activity to the
+virtual device channel, the visorinput driver delivers the activity to the
 Linux environment by calling input_report_key() and input_report_abs().
 
 You can interact with the guest console using the usyscon Partition Desktop
@@ -322,7 +322,7 @@ usyscon_partitiondesktop-*.rpm, or into a Windows 
environment via
 PartitionDesktop.msi, you will be able to launch a console for your guest
 Linux environment by clicking the console icon in the s-Par web UI.
 
-When compiled as a module, visorhid can be autoloaded by visorbus in
+When compiled as a module, visorinput can be autoloaded by visorbus in
 standard udev/systemd environments, as it includes the modules.alias
 definition:
 
@@ -331,8 +331,8 @@ definition:
 
 

[PATCH 08/13] staging: unisys: visorinput: correct code comments per kernel conventions

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

Multi-line comments were modified to conform to kernel conventions:

/*
 * multi-line
 * comments
 */

doc-test /** */ for some comments was removed.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorinput/visorinput.c | 47 --
 1 file changed, 29 insertions(+), 18 deletions(-)

diff --git a/drivers/staging/unisys/visorinput/visorinput.c 
b/drivers/staging/unisys/visorinput/visorinput.c
index 52d01e4..976effa 100644
--- a/drivers/staging/unisys/visorinput/visorinput.c
+++ b/drivers/staging/unisys/visorinput/visorinput.c
@@ -14,7 +14,8 @@
  * details.
  */
 
-/* This driver lives in a generic guest Linux partition, and registers to
+/*
+ * This driver lives in a generic guest Linux partition, and registers to
  * receive keyboard and mouse channels from the visorbus driver.  It reads
  * inputs from such channels, and delivers it to the Linux OS in the
  * standard way the Linux expects for input drivers.
@@ -55,14 +56,14 @@ enum visorinput_device_type {
visorinput_mouse,
 };
 
-/*  This is the private data that we store for each device.
- *  A pointer to this struct is maintained via
- *  dev_get_drvdata() / dev_set_drvdata() for each struct device.
+/*
+ * This is the private data that we store for each device.
+ * A pointer to this struct is maintained via
+ * dev_get_drvdata() / dev_set_drvdata() for each struct device.
  */
 struct visorinput_devdata {
struct visor_device *dev;
-   /** lock for dev */
-   struct rw_semaphore lock_visor_dev;
+   struct rw_semaphore lock_visor_dev; /* lock for dev */
struct input_dev *visorinput_dev;
bool paused;
unsigned int keycode_table_bytes; /* size of following array */
@@ -75,8 +76,10 @@ static const uuid_le spar_keyboard_channel_protocol_uuid =
 static const uuid_le spar_mouse_channel_protocol_uuid =
SPAR_MOUSE_CHANNEL_PROTOCOL_UUID;
 
-/* Borrowed from drivers/input/keyboard/atakbd.c */
-/* This maps 1-byte scancodes to keycodes. */
+/*
+ * Borrowed from drivers/input/keyboard/atakbd.c
+ * This maps 1-byte scancodes to keycodes.
+ */
 static const unsigned char visorkbd_keycode[KEYCODE_TABLE_BYTES] = {
/* American layout */
[0] = KEY_GRAVE,
@@ -193,7 +196,8 @@ static const unsigned char 
visorkbd_keycode[KEYCODE_TABLE_BYTES] = {
[113] = KEY_MUTE
 };
 
-/* This maps the  in extended scancodes of the form "0xE0 " into
+/*
+ * This maps the  in extended scancodes of the form "0xE0 " into
  * keycodes.
  */
 static const unsigned char visorkbd_ext_keycode[KEYCODE_TABLE_BYTES] = {
@@ -212,7 +216,8 @@ static const unsigned char 
visorkbd_ext_keycode[KEYCODE_TABLE_BYTES] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
 };
 
-/* register_client_keyboard() initializes and returns a Linux gizmo that we
+/*
+ * register_client_keyboard() initializes and returns a Linux gizmo that we
  * can use to deliver keyboard inputs to Linux.  We of course do this when
  * we see keyboard inputs coming in on a keyboard channel.
  */
@@ -299,7 +304,8 @@ register_client_mouse(void)
return NULL;
}
 
-   /* Sending top-left and bottom-right positions is ABSOLUTELY
+   /*
+* Sending top-left and bottom-right positions is ABSOLUTELY
 * REQUIRED if we want X to move the mouse to the exact points
 * we tell it.  I have NO IDEA why.
 */
@@ -329,7 +335,8 @@ devdata_create(struct visor_device *dev, enum 
visorinput_device_type devtype)
return NULL;
devdata->dev = dev;
 
-   /* This is an input device in a client guest partition,
+   /*
+* This is an input device in a client guest partition,
 * so we need to create whatever gizmos are necessary to
 * deliver our inputs to the guest OS.
 */
@@ -400,9 +407,10 @@ visorinput_remove(struct visor_device *dev)
 
visorbus_disable_channel_interrupts(dev);
 
-   /* due to above, at this time no thread of execution will be
-   * in visorinput_channel_interrupt()
-   */
+   /*
+* due to above, at this time no thread of execution will be
+* in visorinput_channel_interrupt()
+*/
 
down_write(&devdata->lock_visor_dev);
dev_set_drvdata(&dev->device, NULL);
@@ -417,7 +425,8 @@ do_key(struct input_dev *inpt, int keycode, int down)
input_report_key(inpt, keycode, down);
 }
 
-/* Make it so the current locking state of the locking key indicated by
+/*
+ * Make it so the current locking state of the locking key indicated by
  *  is as indicated by  (1=locked, 0=unlocked).
  */
 static void
@@ -457,7 +466,8 @@ handle_locking_key(struct input_dev *visorinput_dev,
}
 }
 
-/*  is either a 1-byte scancode, or an extended 16-bit scancode
+/*
+ *  is either a 1-byte scancode, or an extended 16-bit scancode
  * with 0xE0 in the low byte and the extended scanco

[PATCH 06/13] staging: unisys: visorinput: add INPUT to dependent driver list

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

Add the renamed driver to the Kconfig.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorinput/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/unisys/visorinput/Kconfig 
b/drivers/staging/unisys/visorinput/Kconfig
index d83deb4..6baba27 100644
--- a/drivers/staging/unisys/visorinput/Kconfig
+++ b/drivers/staging/unisys/visorinput/Kconfig
@@ -4,7 +4,7 @@
 
 config UNISYS_VISORINPUT
tristate "Unisys visorinput driver"
-   depends on UNISYSSPAR && UNISYS_VISORBUS && FB
+   depends on UNISYSSPAR && UNISYS_VISORBUS && FB && INPUT
---help---
If you say Y here, you will enable the Unisys visorinput driver.
 
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 12/13] staging: unisys: visorinput: remove extraneous mouse logic

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

Removes a cursor positioning hack that no longer seems to be required.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorinput/visorinput.c | 12 
 1 file changed, 12 deletions(-)

diff --git a/drivers/staging/unisys/visorinput/visorinput.c 
b/drivers/staging/unisys/visorinput/visorinput.c
index 103f72b..a002e07 100644
--- a/drivers/staging/unisys/visorinput/visorinput.c
+++ b/drivers/staging/unisys/visorinput/visorinput.c
@@ -350,18 +350,6 @@ register_client_mouse(void *devdata /* opaque on purpose 
*/)
return NULL;
}
 
-   /*
-* Sending top-left and bottom-right positions is ABSOLUTELY
-* REQUIRED if we want X to move the mouse to the exact points
-* we tell it.  I have NO IDEA why.
-*/
-   input_report_abs(visorinput_dev, ABS_X, 0);
-   input_report_abs(visorinput_dev, ABS_Y, 0);
-   input_sync(visorinput_dev);
-   input_report_abs(visorinput_dev, ABS_X, xres - 1);
-   input_report_abs(visorinput_dev, ABS_Y, yres - 1);
-   input_sync(visorinput_dev);
-
input_set_capability(visorinput_dev, EV_REL, REL_WHEEL);
 
return visorinput_dev;
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 00/13] visorhid fixes series

2015-10-01 Thread Benjamin Romer
This patch series contains a series of changes requested by Benjamin
Tissoires from Red Hat, after he reviewed the module for us.

Most importantly, the module is renamed from visorhid to visorinput,
since it is not a HID driver.

Tim Sell (13):
  staging: unisys: visorhid: correctly map keys with extended scancodes
  staging: unisys: visorhid: remove unnecessary include of serio.h
  staging: unisys: visorhid: rename to visorinput
  staging: unisys: visorinput: subsume .h files directly into
visorinput.c
  staging: unisys: visorinput: re-order declarations for consistency
  staging: unisys: visorinput: add INPUT to dependent driver list
  staging: unisys: visorinput: make structs & arrays const where
possible
  staging: unisys: visorinput: correct code comments per kernel
conventions
  staging: unisys: visorinput: comment tweaks - s/gizmo/input node/g
  staging: unisys: visorinput: change input bus type to BUS_VIRTUAL (6)
  staging: unisys: visorinput: register & use input_dev open() and
close()
  staging: unisys: visorinput: remove extraneous mouse logic
  staging: unisys: visorinput: remove extraneous do_key function

 drivers/staging/unisys/Documentation/overview.txt  |  22 +-
 drivers/staging/unisys/Kconfig |   2 +-
 drivers/staging/unisys/Makefile|   2 +-
 drivers/staging/unisys/visorhid/Kconfig|  10 -
 drivers/staging/unisys/visorhid/Makefile   |   7 -
 drivers/staging/unisys/visorhid/keyboardchannel.h  |  32 -
 drivers/staging/unisys/visorhid/mousechannel.h |  33 -
 drivers/staging/unisys/visorhid/ultrainputreport.h |  74 ---
 drivers/staging/unisys/visorhid/visorhid.c | 668 ---
 drivers/staging/unisys/visorinput/Kconfig  |  10 +
 drivers/staging/unisys/visorinput/Makefile |   7 +
 .../staging/unisys/visorinput/ultrainputreport.h   |  74 +++
 drivers/staging/unisys/visorinput/visorinput.c | 728 +
 13 files changed, 832 insertions(+), 837 deletions(-)
 delete mode 100644 drivers/staging/unisys/visorhid/Kconfig
 delete mode 100644 drivers/staging/unisys/visorhid/Makefile
 delete mode 100644 drivers/staging/unisys/visorhid/keyboardchannel.h
 delete mode 100644 drivers/staging/unisys/visorhid/mousechannel.h
 delete mode 100644 drivers/staging/unisys/visorhid/ultrainputreport.h
 delete mode 100644 drivers/staging/unisys/visorhid/visorhid.c
 create mode 100644 drivers/staging/unisys/visorinput/Kconfig
 create mode 100644 drivers/staging/unisys/visorinput/Makefile
 create mode 100644 drivers/staging/unisys/visorinput/ultrainputreport.h
 create mode 100644 drivers/staging/unisys/visorinput/visorinput.c

-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 10/13] staging: unisys: visorinput: change input bus type to BUS_VIRTUAL (6)

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

BUS_HOST wasn't really appropriate, so I changed to BUS_VIRTUAL, which is
what virtio uses.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorinput/visorinput.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/unisys/visorinput/visorinput.c 
b/drivers/staging/unisys/visorinput/visorinput.c
index adc2cc9..d47cc2b 100644
--- a/drivers/staging/unisys/visorinput/visorinput.c
+++ b/drivers/staging/unisys/visorinput/visorinput.c
@@ -234,7 +234,7 @@ register_client_keyboard(unsigned char *keycode_table)
 
visorinput_dev->name = "visor Keyboard";
visorinput_dev->phys = "visorkbd:input0";
-   visorinput_dev->id.bustype = BUS_HOST;
+   visorinput_dev->id.bustype = BUS_VIRTUAL;
visorinput_dev->id.vendor = 0x0001;
visorinput_dev->id.product = 0x0001;
visorinput_dev->id.version = 0x0100;
@@ -277,7 +277,7 @@ register_client_mouse(void)
 
visorinput_dev->name = "visor Mouse";
visorinput_dev->phys = "visormou:input0";
-   visorinput_dev->id.bustype = BUS_HOST;
+   visorinput_dev->id.bustype = BUS_VIRTUAL;
visorinput_dev->id.vendor = 0x0001;
visorinput_dev->id.product = 0x0002;
visorinput_dev->id.version = 0x0100;
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 07/13] staging: unisys: visorinput: make structs & arrays const where possible

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

This also gave me a warning with the assignment:

visorinput_dev->keycode = visorkbd_keycode;

because input_dev->keycode is NOT static but visorkbd_keycode now is, so
I went ahead and also added logic to stash away non-static copies of
visorkbd_keycode[] and visorkbd_ext_keycode[] within visorinput_devdata,
and use the copy to assign to visorinput_dev->keycode.  This change is
also technically required, because user-space can remap keys, and we
don't want this to be shared with the other keyboard devices running on
the same system.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorinput/visorinput.c | 42 ++
 1 file changed, 29 insertions(+), 13 deletions(-)

diff --git a/drivers/staging/unisys/visorinput/visorinput.c 
b/drivers/staging/unisys/visorinput/visorinput.c
index a15924c..52d01e4 100644
--- a/drivers/staging/unisys/visorinput/visorinput.c
+++ b/drivers/staging/unisys/visorinput/visorinput.c
@@ -48,6 +48,7 @@
 
 #define PIXELS_ACROSS_DEFAULT  800
 #define PIXELS_DOWN_DEFAULT600
+#define KEYCODE_TABLE_BYTES256
 
 enum visorinput_device_type {
visorinput_keyboard,
@@ -64,6 +65,9 @@ struct visorinput_devdata {
struct rw_semaphore lock_visor_dev;
struct input_dev *visorinput_dev;
bool paused;
+   unsigned int keycode_table_bytes; /* size of following array */
+   /* for keyboard devices: visorkbd_keycode[] + visorkbd_ext_keycode[] */
+   unsigned char keycode_table[0];
 };
 
 static const uuid_le spar_keyboard_channel_protocol_uuid =
@@ -73,7 +77,8 @@ static const uuid_le spar_mouse_channel_protocol_uuid =
 
 /* Borrowed from drivers/input/keyboard/atakbd.c */
 /* This maps 1-byte scancodes to keycodes. */
-static unsigned char visorkbd_keycode[256] = { /* American layout */
+static const unsigned char visorkbd_keycode[KEYCODE_TABLE_BYTES] = {
+   /* American layout */
[0] = KEY_GRAVE,
[1] = KEY_ESC,
[2] = KEY_1,
@@ -191,7 +196,7 @@ static unsigned char visorkbd_keycode[256] = {  /* 
American layout */
 /* This maps the  in extended scancodes of the form "0xE0 " into
  * keycodes.
  */
-static unsigned char visorkbd_ext_keycode[256] = {
+static const unsigned char visorkbd_ext_keycode[KEYCODE_TABLE_BYTES] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
0, 0, 0, 0, KEY_KPENTER, KEY_RIGHTCTRL, 0, 0,   /* 0x18 */
@@ -212,7 +217,8 @@ static unsigned char visorkbd_ext_keycode[256] = {
  * we see keyboard inputs coming in on a keyboard channel.
  */
 static struct input_dev *
-register_client_keyboard(void)
+register_client_keyboard(unsigned char *keycode_table)
+
 {
int i, error;
struct input_dev *visorinput_dev = NULL;
@@ -234,15 +240,15 @@ register_client_keyboard(void)
visorinput_dev->ledbit[0] = BIT_MASK(LED_CAPSL) |
BIT_MASK(LED_SCROLLL) |
BIT_MASK(LED_NUML);
-   visorinput_dev->keycode = visorkbd_keycode;
-   visorinput_dev->keycodesize = sizeof(unsigned char);
-   visorinput_dev->keycodemax = ARRAY_SIZE(visorkbd_keycode);
-
-   for (i = 1; i < ARRAY_SIZE(visorkbd_keycode); i++)
-   set_bit(visorkbd_keycode[i], visorinput_dev->keybit);
+   visorinput_dev->keycode = keycode_table;
+   visorinput_dev->keycodesize = 1; /* sizeof(unsigned char) */
+   visorinput_dev->keycodemax = KEYCODE_TABLE_BYTES;
 
-   for (i = 1; i < ARRAY_SIZE(visorkbd_ext_keycode); i++)
-   set_bit(visorkbd_ext_keycode[i], visorinput_dev->keybit);
+   for (i = 1; i < visorinput_dev->keycodemax; i++)
+   set_bit(keycode_table[i], visorinput_dev->keybit);
+   for (i = 1; i < visorinput_dev->keycodemax; i++)
+   set_bit(keycode_table[i + KEYCODE_TABLE_BYTES],
+   visorinput_dev->keybit);
 
error = input_register_device(visorinput_dev);
if (error) {
@@ -313,8 +319,12 @@ static struct visorinput_devdata *
 devdata_create(struct visor_device *dev, enum visorinput_device_type devtype)
 {
struct visorinput_devdata *devdata = NULL;
+   unsigned int extra_bytes = 0;
 
-   devdata = kzalloc(sizeof(*devdata), GFP_KERNEL);
+   if (devtype == visorinput_keyboard)
+   /* allocate room for devdata->keycode_table, filled in below */
+   extra_bytes = KEYCODE_TABLE_BYTES * 2;
+   devdata = kzalloc(sizeof(*devdata) + extra_bytes, GFP_KERNEL);
if (!devdata)
return NULL;
devdata->dev = dev;
@@ -325,7 +335,13 @@ devdata_create(struct visor_device *dev, enum 
visorinput_device_type devtype)
 */
switch (devtype) {
case visorinput_keyboard:
-   devdata->visorinput_dev = register_client_keyboard();
+   devdata->keycod

[PATCH 01/13] staging: unisys: visorhid: correctly map keys with extended scancodes

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

The most-noticed key that wasn't being mapped correctly was Right-Alt,
which is the AltGr key on many non-US keyboards, used to select many
extended characters.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorhid/visorhid.c | 10 +++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/unisys/visorhid/visorhid.c 
b/drivers/staging/unisys/visorhid/visorhid.c
index cca426b..119b72d 100644
--- a/drivers/staging/unisys/visorhid/visorhid.c
+++ b/drivers/staging/unisys/visorhid/visorhid.c
@@ -213,13 +213,14 @@ static unsigned char visorkbd_keycode[256] = {/* 
American layout */
 /* This maps the  in extended scancodes of the form "0xE0 " into
  * keycodes.
  */
-static unsigned char ext_keycode[256] = {
+static unsigned char visorkbd_ext_keycode[256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
0, 0, 0, 0, KEY_KPENTER, KEY_RIGHTCTRL, 0, 0,   /* 0x18 */
0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
KEY_RIGHTALT, 0, 0, 0, 0, 0, 0, 0,  /* 0x28 */
-   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+   0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+   KEY_RIGHTALT /* AltGr */, 0, 0, 0, 0, 0, 0, 0,  /* 0x38 */
0, 0, 0, 0, 0, 0, 0, KEY_HOME,  /* 0x40 */
KEY_UP, KEY_PAGEUP, 0, KEY_LEFT, 0, KEY_RIGHT, 0, KEY_END,  /* 0x48 */
KEY_DOWN, KEY_PAGEDOWN, KEY_INSERT, KEY_DELETE, 0, 0, 0, 0, /* 0x50 */
@@ -348,6 +349,9 @@ register_client_keyboard(void)
for (i = 1; i < ARRAY_SIZE(visorkbd_keycode); i++)
set_bit(visorkbd_keycode[i], visorinput_dev->keybit);
 
+   for (i = 1; i < ARRAY_SIZE(visorkbd_ext_keycode); i++)
+   set_bit(visorkbd_ext_keycode[i], visorinput_dev->keybit);
+
error = input_register_device(visorinput_dev);
if (error) {
input_free_device(visorinput_dev);
@@ -469,7 +473,7 @@ scancode_to_keycode(int scancode)
int keycode;
 
if (scancode > 0xff)
-   keycode = ext_keycode[(scancode >> 8) & 0xff];
+   keycode = visorkbd_ext_keycode[(scancode >> 8) & 0xff];
else
keycode = visorkbd_keycode[scancode];
return keycode;
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 05/13] staging: unisys: visorinput: re-order declarations for consistency

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

In order to be more consistent with kernel conventions used elsewhere,
I have re-ordered declarations in visorinput.c to follow this general
order (where possible):
* #defines
* struct/enum/union declarations
* static declarations (const if possible for all of them)
* forward function declarations where absolutely necessary

Exceptions were made for the static declarations like the driver
declaration, given that it depends on previously-defined callbacks.
So such declarations are at the end of visorinput.c.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorinput/visorinput.c | 242 -
 1 file changed, 115 insertions(+), 127 deletions(-)

diff --git a/drivers/staging/unisys/visorinput/visorinput.c 
b/drivers/staging/unisys/visorinput/visorinput.c
index 4c5b594..a15924c 100644
--- a/drivers/staging/unisys/visorinput/visorinput.c
+++ b/drivers/staging/unisys/visorinput/visorinput.c
@@ -49,47 +49,6 @@
 #define PIXELS_ACROSS_DEFAULT  800
 #define PIXELS_DOWN_DEFAULT600
 
-static const uuid_le spar_keyboard_channel_protocol_uuid =
-   SPAR_KEYBOARD_CHANNEL_PROTOCOL_UUID;
-static const uuid_le spar_mouse_channel_protocol_uuid =
-   SPAR_MOUSE_CHANNEL_PROTOCOL_UUID;
-static int visorinput_probe(struct visor_device *dev);
-static void visorinput_remove(struct visor_device *dev);
-static void visorinput_channel_interrupt(struct visor_device *dev);
-static int visorinput_pause(struct visor_device *dev,
- visorbus_state_complete_func complete_func);
-static int visorinput_resume(struct visor_device *dev,
-  visorbus_state_complete_func complete_func);
-static struct input_dev *register_client_keyboard(void);
-static struct input_dev *register_client_mouse(void);
-static void unregister_client_input(struct input_dev *visorinput_dev);
-
-/* GUIDS for all channel types supported by this driver. */
-static struct visor_channeltype_descriptor visorinput_channel_types[] = {
-   { SPAR_KEYBOARD_CHANNEL_PROTOCOL_UUID, "keyboard"},
-   { SPAR_MOUSE_CHANNEL_PROTOCOL_UUID, "mouse"},
-   { NULL_UUID_LE, NULL }
-};
-MODULE_DEVICE_TABLE(visorbus, visorinput_channel_types);
-MODULE_ALIAS("visorbus:" SPAR_MOUSE_CHANNEL_PROTOCOL_UUID_STR);
-MODULE_ALIAS("visorbus:" SPAR_KEYBOARD_CHANNEL_PROTOCOL_UUID_STR);
-
-/** This is used to tell the visor bus driver which types of visor devices
- *  we support, and what functions to call when a visor device that we support
- *  is attached or removed.
- */
-static struct visor_driver visorinput_driver = {
-   .name = "visorinput",
-   .vertag = NULL,
-   .owner = THIS_MODULE,
-   .channel_types = visorinput_channel_types,
-   .probe = visorinput_probe,
-   .remove = visorinput_remove,
-   .channel_interrupt = visorinput_channel_interrupt,
-   .pause = visorinput_pause,
-   .resume = visorinput_resume,
-};
-
 enum visorinput_device_type {
visorinput_keyboard,
visorinput_mouse,
@@ -107,6 +66,11 @@ struct visorinput_devdata {
bool paused;
 };
 
+static const uuid_le spar_keyboard_channel_protocol_uuid =
+   SPAR_KEYBOARD_CHANNEL_PROTOCOL_UUID;
+static const uuid_le spar_mouse_channel_protocol_uuid =
+   SPAR_MOUSE_CHANNEL_PROTOCOL_UUID;
+
 /* Borrowed from drivers/input/keyboard/atakbd.c */
 /* This maps 1-byte scancodes to keycodes. */
 static unsigned char visorkbd_keycode[256] = { /* American layout */
@@ -243,92 +207,6 @@ static unsigned char visorkbd_ext_keycode[256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
 };
 
-static struct visorinput_devdata *
-devdata_create(struct visor_device *dev, enum visorinput_device_type devtype)
-{
-   struct visorinput_devdata *devdata = NULL;
-
-   devdata = kzalloc(sizeof(*devdata), GFP_KERNEL);
-   if (!devdata)
-   return NULL;
-   devdata->dev = dev;
-
-   /* This is an input device in a client guest partition,
-* so we need to create whatever gizmos are necessary to
-* deliver our inputs to the guest OS.
-*/
-   switch (devtype) {
-   case visorinput_keyboard:
-   devdata->visorinput_dev = register_client_keyboard();
-   if (!devdata->visorinput_dev)
-   goto cleanups_register;
-   break;
-   case visorinput_mouse:
-   devdata->visorinput_dev = register_client_mouse();
-   if (!devdata->visorinput_dev)
-   goto cleanups_register;
-   break;
-   }
-
-   init_rwsem(&devdata->lock_visor_dev);
-
-   return devdata;
-
-cleanups_register:
-   kfree(devdata);
-   return NULL;
-}
-
-static int
-visorinput_probe(struct visor_device *dev)
-{
-   struct visorinput_devdata *devdata = NULL;
-   uuid_le guid;
-   enum visorinput_device_type devtype;
-
-   guid = visorchannel_get_uuid(dev->visorchannel);

[PATCH 04/13] staging: unisys: visorinput: subsume .h files directly into visorinput.c

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

keyboardchannel.h and mousechannel.h are now included within
visorinput.c directly.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 .../staging/unisys/visorinput/keyboardchannel.h| 32 -
 drivers/staging/unisys/visorinput/mousechannel.h   | 33 --
 drivers/staging/unisys/visorinput/visorinput.c | 19 +++--
 3 files changed, 17 insertions(+), 67 deletions(-)
 delete mode 100644 drivers/staging/unisys/visorinput/keyboardchannel.h
 delete mode 100644 drivers/staging/unisys/visorinput/mousechannel.h

diff --git a/drivers/staging/unisys/visorinput/keyboardchannel.h 
b/drivers/staging/unisys/visorinput/keyboardchannel.h
deleted file mode 100644
index 2ed2602..000
--- a/drivers/staging/unisys/visorinput/keyboardchannel.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright (C) 2010 - 2015 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * 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, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-#ifndef __SPAR_KEYBOARDCHANNEL_H__
-#define __SPAR_KEYBOARDCHANNEL_H__
-
-#include 
-#include 
-
-#include "channel.h"
-#include "ultrainputreport.h"
-
-/* {c73416d0-b0b8-44af-b304-9d2ae99f1b3d} */
-#define SPAR_KEYBOARD_CHANNEL_PROTOCOL_UUID\
-   UUID_LE(0xc73416d0, 0xb0b8, 0x44af, \
-   0xb3, 0x4, 0x9d, 0x2a, 0xe9, 0x9f, 0x1b, 0x3d)
-#define SPAR_KEYBOARD_CHANNEL_PROTOCOL_UUID_STR 
"c73416d0-b0b8-44af-b304-9d2ae99f1b3d"
-#define SPAR_KEYBOARD_CHANNEL_PROTOCOL_VERSIONID 1
-#define KEYBOARD_MAXINPUTREPORTS 50
-
-#endif
diff --git a/drivers/staging/unisys/visorinput/mousechannel.h 
b/drivers/staging/unisys/visorinput/mousechannel.h
deleted file mode 100644
index 256477a..000
--- a/drivers/staging/unisys/visorinput/mousechannel.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2010 - 2015 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * 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, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-#ifndef __SPAR_MOUSECHANNEL_H__
-#define __SPAR_MOUSECHANNEL_H__
-
-#include 
-#include 
-
-#include "channel.h"
-#include "ultrainputreport.h"
-
-/* {addf07d4-94a9-46e2-81c3-61abcdbdbd87} */
-#define SPAR_MOUSE_CHANNEL_PROTOCOL_UUID  \
-   UUID_LE(0xaddf07d4, 0x94a9, 0x46e2, \
-   0x81, 0xc3, 0x61, 0xab, 0xcd, 0xbd, 0xbd, 0x87)
-#define SPAR_MOUSE_CHANNEL_PROTOCOL_UUID_STR \
-   "addf07d4-94a9-46e2-81c3-61abcdbdbd87"
-#define SPAR_MOUSE_CHANNEL_PROTOCOL_VERSIONID 1
-#define MOUSE_MAXINPUTREPORTS 50
-
-#endif
diff --git a/drivers/staging/unisys/visorinput/visorinput.c 
b/drivers/staging/unisys/visorinput/visorinput.c
index e1c328e..4c5b594 100644
--- a/drivers/staging/unisys/visorinput/visorinput.c
+++ b/drivers/staging/unisys/visorinput/visorinput.c
@@ -25,11 +25,26 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 
-#include "keyboardchannel.h"
-#include "mousechannel.h"
 #include "version.h"
 #include "visorbus.h"
+#include "channel.h"
+#include "ultrainputreport.h"
+
+/* Keyboard channel {c73416d0-b0b8-44af-b304-9d2ae99f1b3d} */
+#define SPAR_KEYBOARD_CHANNEL_PROTOCOL_UUID\
+   UUID_LE(0xc73416d0, 0xb0b8, 0x44af, \
+   0xb3, 0x4, 0x9d, 0x2a, 0xe9, 0x9f, 0x1b, 0x3d)
+#define SPAR_KEYBOARD_CHANNEL_PROTOCOL_UUID_STR 
"c73416d0-b0b8-44af-b304-9d2ae99f1b3d"
+
+/* Mouse channel {addf07d4-94a9-46e2-81c3-61abcdbdbd87} */
+#define SPAR_MOUSE_CHANNEL_PROTOCOL_UUID  \
+   UUID_LE(0xaddf07d4, 0x94a9, 0x46e2, \
+   0x81, 0xc3, 0x61, 0xab, 0xcd, 0xbd, 0xbd, 0x87)
+#define SPAR_MOUSE_CHANNEL_PROTOCOL_UUID_STR \
+   "addf07d4-94a9-46e2-81c3-61abcdbdbd87"
 
 #define PIXELS_ACROSS_DEFAULT  800
 #define PIXELS_DOWN_DEFAULT600
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 02/13] staging: unisys: visorhid: remove unnecessary include of serio.h

2015-10-01 Thread Benjamin Romer
From: Tim Sell 

No need for serio.h to be included.

Signed-off-by: Tim Sell 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorhid/visorhid.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/staging/unisys/visorhid/visorhid.c 
b/drivers/staging/unisys/visorhid/visorhid.c
index 119b72d..c24aaf5 100644
--- a/drivers/staging/unisys/visorhid/visorhid.c
+++ b/drivers/staging/unisys/visorhid/visorhid.c
@@ -24,7 +24,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 
 #include "keyboardchannel.h"
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 4/4] staging: unisys: correctly handle return value from queue_delayed_work()

2015-10-01 Thread Benjamin Romer
Properly handle the return value from queue_delayed_work() - it's a
bool, not an int, so using a less than comparison isn't appropriate.

This mistake was found by David Binderman .

Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visorbus/periodic_work.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/periodic_work.c 
b/drivers/staging/unisys/visorbus/periodic_work.c
index a3631c3..115b7aa 100644
--- a/drivers/staging/unisys/visorbus/periodic_work.c
+++ b/drivers/staging/unisys/visorbus/periodic_work.c
@@ -86,8 +86,8 @@ bool visor_periodic_work_nextperiod(struct periodic_work *pw)
pw->want_to_stop = false;
rc = true;  /* yes, true; see visor_periodic_work_stop() */
goto unlock;
-   } else if (queue_delayed_work(pw->workqueue, &pw->work,
- pw->jiffy_interval) < 0) {
+   } else if (!queue_delayed_work(pw->workqueue, &pw->work,
+  pw->jiffy_interval)) {
pw->is_scheduled = false;
rc = false;
goto unlock;
@@ -117,8 +117,8 @@ bool visor_periodic_work_start(struct periodic_work *pw)
goto unlock;
}
INIT_DELAYED_WORK(&pw->work, &periodic_work_func);
-   if (queue_delayed_work(pw->workqueue, &pw->work,
-  pw->jiffy_interval) < 0) {
+   if (!queue_delayed_work(pw->workqueue, &pw->work,
+   pw->jiffy_interval)) {
rc = false;
goto unlock;
}
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 3/4] staging: unisys: get rid of list of devices

2015-10-01 Thread Benjamin Romer
From: David Kershner 

We don't need the list of devices, we can loop through the one
provided by the network api and filter on ours.

Signed-off-by: David Kershner 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visornic/visornic_main.c | 13 -
 1 file changed, 13 deletions(-)

diff --git a/drivers/staging/unisys/visornic/visornic_main.c 
b/drivers/staging/unisys/visornic/visornic_main.c
index b41dbd4..85c9fec 100644
--- a/drivers/staging/unisys/visornic/visornic_main.c
+++ b/drivers/staging/unisys/visornic/visornic_main.c
@@ -115,7 +115,6 @@ struct visornic_devdata {
 * IOPART
 */
struct visor_device *dev;
-   struct list_head list_all;   /* < link within list_all_devices list */
struct net_device *netdev;
struct net_device_stats net_stats;
atomic_t interrupt_rcvd;
@@ -196,12 +195,6 @@ struct visornic_devdata {
struct uiscmdrsp cmdrsp[SIZEOF_CMDRSP];
 };
 
-
-/* List of all visornic_devdata structs,
- * linked via the list_all member
- */
-static LIST_HEAD(list_all_devices);
-static DEFINE_SPINLOCK(lock_all_devices);
 static int visornic_poll(struct napi_struct *napi, int budget);
 static void poll_for_irq(unsigned long v);
 
@@ -1372,9 +1365,6 @@ devdata_initialize(struct visornic_devdata *devdata, 
struct visor_device *dev)
return NULL;
memset(devdata, '\0', sizeof(struct visornic_devdata));
devdata->dev = dev;
-   spin_lock(&lock_all_devices);
-   list_add_tail(&devdata->list_all, &list_all_devices);
-   spin_unlock(&lock_all_devices);
return devdata;
 }
 
@@ -1387,9 +1377,6 @@ devdata_initialize(struct visornic_devdata *devdata, 
struct visor_device *dev)
  */
 static void devdata_release(struct visornic_devdata *devdata)
 {
-   spin_lock(&lock_all_devices);
-   list_del(&devdata->list_all);
-   spin_unlock(&lock_all_devices);
kfree(devdata->rcvbuf);
kfree(devdata->cmdrsp_rcv);
kfree(devdata->xmit_cmdrsp);
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 2/4] staging: unisys: get rid of devnum pool and dev num

2015-10-01 Thread Benjamin Romer
From: David Kershner 

devnum pool and devnum are no longer needed.

Signed-off-by: David Kershner 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visornic/visornic_main.c | 26 -
 1 file changed, 26 deletions(-)

diff --git a/drivers/staging/unisys/visornic/visornic_main.c 
b/drivers/staging/unisys/visornic/visornic_main.c
index be142eb..b41dbd4 100644
--- a/drivers/staging/unisys/visornic/visornic_main.c
+++ b/drivers/staging/unisys/visornic/visornic_main.c
@@ -37,9 +37,6 @@
  */
 #define MAX_BUF 163840
 
-static spinlock_t dev_num_pool_lock;
-static void *dev_num_pool; /**< pool to grab device numbers from */
-
 static int visornic_probe(struct visor_device *dev);
 static void visornic_remove(struct visor_device *dev);
 static int visornic_pause(struct visor_device *dev,
@@ -113,7 +110,6 @@ struct chanstat {
 };
 
 struct visornic_devdata {
-   int devnum;
unsigned short enabled; /* 0 disabled 1 enabled to receive */
unsigned short enab_dis_acked;  /* NET_RCV_ENABLE/DISABLE acked by
 * IOPART
@@ -1372,20 +1368,9 @@ visornic_rx(struct uiscmdrsp *cmdrsp)
 static struct visornic_devdata *
 devdata_initialize(struct visornic_devdata *devdata, struct visor_device *dev)
 {
-   int devnum = -1;
-
if (!devdata)
return NULL;
memset(devdata, '\0', sizeof(struct visornic_devdata));
-   spin_lock(&dev_num_pool_lock);
-   devnum = find_first_zero_bit(dev_num_pool, MAXDEVICES);
-   set_bit(devnum, dev_num_pool);
-   spin_unlock(&dev_num_pool_lock);
-   if (devnum == MAXDEVICES)
-   devnum = -1;
-   if (devnum < 0)
-   return NULL;
-   devdata->devnum = devnum;
devdata->dev = dev;
spin_lock(&lock_all_devices);
list_add_tail(&devdata->list_all, &list_all_devices);
@@ -1402,9 +1387,6 @@ devdata_initialize(struct visornic_devdata *devdata, 
struct visor_device *dev)
  */
 static void devdata_release(struct visornic_devdata *devdata)
 {
-   spin_lock(&dev_num_pool_lock);
-   clear_bit(devdata->devnum, dev_num_pool);
-   spin_unlock(&dev_num_pool_lock);
spin_lock(&lock_all_devices);
list_del(&devdata->list_all);
spin_unlock(&lock_all_devices);
@@ -2123,11 +2105,6 @@ static int visornic_init(void)
if (!visornic_timeout_reset_workqueue)
goto cleanup_workqueue;
 
-   spin_lock_init(&dev_num_pool_lock);
-   dev_num_pool = kzalloc(BITS_TO_LONGS(MAXDEVICES), GFP_KERNEL);
-   if (!dev_num_pool)
-   goto cleanup_workqueue;
-
err = visorbus_register_visor_driver(&visornic_driver);
if (!err)
return 0;
@@ -2157,9 +2134,6 @@ static void visornic_cleanup(void)
destroy_workqueue(visornic_timeout_reset_workqueue);
}
debugfs_remove_recursive(visornic_debugfs_dir);
-
-   kfree(dev_num_pool);
-   dev_num_pool = NULL;
 }
 
 module_init(visornic_init);
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 1/4] staging: unisys: remove devdata->name use netdev->name

2015-10-01 Thread Benjamin Romer
From: David Kershner 

The net device already has a name, so use that instead.

Signed-off-by: David Kershner 
Signed-off-by: Benjamin Romer 
---
 drivers/staging/unisys/visornic/visornic_main.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/staging/unisys/visornic/visornic_main.c 
b/drivers/staging/unisys/visornic/visornic_main.c
index 9d3c1e2..be142eb 100644
--- a/drivers/staging/unisys/visornic/visornic_main.c
+++ b/drivers/staging/unisys/visornic/visornic_main.c
@@ -119,7 +119,6 @@ struct visornic_devdata {
 * IOPART
 */
struct visor_device *dev;
-   char name[99];
struct list_head list_all;   /* < link within list_all_devices list */
struct net_device *netdev;
struct net_device_stats net_stats;
@@ -1388,7 +1387,6 @@ devdata_initialize(struct visornic_devdata *devdata, 
struct visor_device *dev)
return NULL;
devdata->devnum = devnum;
devdata->dev = dev;
-   strncpy(devdata->name, dev_name(&dev->device), sizeof(devdata->name));
spin_lock(&lock_all_devices);
list_add_tail(&devdata->list_all, &list_all_devices);
spin_unlock(&lock_all_devices);
@@ -1964,7 +1962,6 @@ static void host_side_disappeared(struct visornic_devdata 
*devdata)
unsigned long flags;
 
spin_lock_irqsave(&devdata->priv_lock, flags);
-   sprintf(devdata->name, "", devdata->devnum);
devdata->dev = NULL;   /* indicate device destroyed */
spin_unlock_irqrestore(&devdata->priv_lock, flags);
 }
-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 0/4] staging: unisys: visornic cleanup series

2015-10-01 Thread Benjamin Romer
This patch series cleans up redundant variables and structures in
visornic, and fixes a mistake in handling the return value from 
queue_delayed_work().

Benjamin Romer (1):
  staging: unisys: correctly handle return value from
queue_delayed_work()

David Kershner (3):
  staging: unisys: remove devdata->name use netdev->name
  staging: unisys: get rid of devnum pool and dev num
  staging: unisys: get rid of list of devices

 drivers/staging/unisys/visorbus/periodic_work.c |  8 ++---
 drivers/staging/unisys/visornic/visornic_main.c | 42 -
 2 files changed, 4 insertions(+), 46 deletions(-)

-- 
2.1.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH 08/12] staging: wilc1000: use s8 instead of int8_t

2015-10-01 Thread Dan Carpenter
On Thu, Oct 01, 2015 at 10:43:55PM +0900, Chaehyun Lim wrote:
> This patch replaces int8_t with s8 that is a preferred type.
> 

It would be better to just use int.

regards,
dan carpenter

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: fbtft: add typecast in call to vfree()

2015-10-01 Thread Dan Carpenter
On Thu, Oct 01, 2015 at 03:00:12PM +0200, Lars Svensson wrote:
> Member screen_base in struct fb_info is declared __iomem causing
> a sparse warning as below when passed to vfree(). This adds typecast
> (__force void *) to silence the warning.
> 
> fbtft-core.c:922:39: warning: incorrect type in argument 1 \
> (different address spaces)
> fbtft-core.c:922:39:expected void const *addr
> fbtft-core.c:922:39:got char [noderef] *screen_base
> 

I thought we were going to do something like this:

diff --git a/include/linux/fb.h b/include/linux/fb.h
index be40dba..3324c92 100644
--- a/include/linux/fb.h
+++ b/include/linux/fb.h
@@ -483,7 +483,10 @@ struct fb_info {
 #ifdef CONFIG_FB_TILEBLITTING
struct fb_tile_ops *tileops;/* Tile Blitting */
 #endif
-   char __iomem *screen_base;  /* Virtual address */
+   union {
+   char __iomem *screen_base;  /* Virtual address */
+   char *fake_screen_base;
+   };
unsigned long screen_size;  /* Amount of ioremapped VRAM or 0 */ 
void *pseudo_palette;   /* Fake palette of 16 colors */ 
 #define FBINFO_STATE_RUNNING   0

The only question is what to call the fake_screen_base.

regards,
dan carpenter
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: dgap: fix memory leak in dgap_parsefile()

2015-10-01 Thread Ronit Halder
> Why not just reject it earlier instead of allocating more data?
I agree on your point.
But we have to make different mechanism for that and my patch is only
to fix the current code.

regards
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] mtd: nand: pass page number to ecc->write_xxx() methods

2015-10-01 Thread Boris Brezillon
Hi Brian,

On Mon, 24 Aug 2015 19:10:19 +0200
Boris Brezillon  wrote:

> The ->read_xxx() methods are all passed the page number the NAND controller
> is supposed to read, but ->write_xxx() do not have such a parameter.
> 
> This is a problem if we want to properly implement data
> scrambling/randomization in order to mitigate MLC sensibility to repeated
> pattern: to prevent bitflips in adjacent pages in the same block we need
> to avoid repeating the same pattern at the same offset in those pages,
> hence the randomizer/scrambler engine need to be passed the page value
> in order to adapt its seed accordingly.
> 
> Moreover, adding the page parameter the ->write_xxx() methods add some
> consistency to the current model.

Apparently nobody complained (or nobody cares :-)) about that patch,
and I'll really need the page information if I want to support
randomization/scrambling in the sunxi driver.

Do you have any objections to this patch (I can rebase it on mainline
and check if new drivers have been added since the submission)?
I remember you pointed a trick you've used in the brcmnand driver to
get this page information (storing it during the ->cmdfunc() or
->ctrl_cmd() call), but it would be way easier to have it directly in
the ecc->write_xxx() parameters...

Best Regards,

Boris

-- 
Boris Brezillon, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: dgap: fix memory leak in dgap_parsefile()

2015-10-01 Thread Dan Carpenter
On Thu, Oct 01, 2015 at 09:11:31AM +0530, Ronit Halder wrote:
> The existing dgap_parsefile() rejects invalid config file.
> But before we know that config file is invalid a lot of memory leak
> can happen. Removing the chances of memory leak won't heart anyone.
> 

Why not just reject it earlier instead of allocating more data?

regards,
dan carpenter

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 11/12] staging: wilc1000: set_channel: rename s32Error

2015-10-01 Thread Chaehyun Lim
This patch replaces s32Error with result to avoid camelcase.

Signed-off-by: Chaehyun Lim 
---
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index 3b32a6c..6db1325 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -663,7 +663,7 @@ static int set_channel(struct wiphy *wiphy,
 {
u32 channelnum = 0;
struct wilc_priv *priv;
-   int s32Error = 0;
+   int result = 0;
 
priv = wiphy_priv(wiphy);
 
@@ -671,12 +671,12 @@ static int set_channel(struct wiphy *wiphy,
PRINT_D(CFG80211_DBG, "Setting channel %d with frequency %d\n", 
channelnum, chandef->chan->center_freq);
 
u8CurrChannel = channelnum;
-   s32Error   = host_int_set_mac_chnl_num(priv->hWILCWFIDrv, channelnum);
+   result = host_int_set_mac_chnl_num(priv->hWILCWFIDrv, channelnum);
 
-   if (s32Error != 0)
+   if (result != 0)
PRINT_ER("Error in setting channel %d\n", channelnum);
 
-   return s32Error;
+   return result;
 }
 
 /**
-- 
2.6.0

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


  1   2   >