Re: [PATCH 08/12] staging: wilc1000: use s8 instead of int8_t
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 '<<'
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
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)
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()
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)
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'
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()
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)
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()
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()
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
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
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
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
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
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
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
> -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
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
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()
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
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
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
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
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
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()
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
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
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
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
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
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
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
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
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()
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 '<<'
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
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)
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)
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()
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()
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()
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)
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'
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
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
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
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
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
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
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
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()
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
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
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
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
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
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
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
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)
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
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
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
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
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
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()
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
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
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
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
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
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()
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()
> 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
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()
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
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