From 6eb94193fa9a54aab0e1dae8311297682634c3bd Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Sun, 3 Jul 2011 14:00:57 -0300 Subject: [media] cxd2099: Update to latest version Import latest driver from ddbridge-0.6.1.tar.bz2. Signed-off-by: Ralph Metzler Signed-off-by: Oliver Endriss Signed-off-by: Mauro Carvalho Chehab --- drivers/staging/cxd2099/cxd2099.c | 250 +++++++++++++++++++++++++------------- drivers/staging/cxd2099/cxd2099.h | 16 ++- 2 files changed, 178 insertions(+), 88 deletions(-) (limited to 'drivers/staging') diff --git a/drivers/staging/cxd2099/cxd2099.c b/drivers/staging/cxd2099/cxd2099.c index b49186c74eb3..803a592b3507 100644 --- a/drivers/staging/cxd2099/cxd2099.c +++ b/drivers/staging/cxd2099/cxd2099.c @@ -1,7 +1,7 @@ /* * cxd2099.c: Driver for the CXD2099AR Common Interface Controller * - * Copyright (C) 2010 DigitalDevices UG + * Copyright (C) 2010-2011 Digital Devices GmbH * * * This program is free software; you can redistribute it and/or @@ -42,13 +42,13 @@ struct cxd { struct dvb_ca_en50221 en; struct i2c_adapter *i2c; - u8 adr; + struct cxd2099_cfg cfg; + u8 regs[0x23]; u8 lastaddress; u8 clk_reg_f; u8 clk_reg_b; int mode; - u32 bitrate; int ready; int dr; int slot_stat; @@ -64,7 +64,7 @@ static int i2c_write_reg(struct i2c_adapter *adapter, u8 adr, u8 reg, u8 data) { u8 m[2] = {reg, data}; - struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = m, .len = 2}; + struct i2c_msg msg = {.addr=adr, .flags=0, .buf=m, .len=2}; if (i2c_transfer(adapter, &msg, 1) != 1) { printk(KERN_ERR "Failed to write to I2C register %02x@%02x!\n", @@ -77,7 +77,7 @@ static int i2c_write_reg(struct i2c_adapter *adapter, u8 adr, static int i2c_write(struct i2c_adapter *adapter, u8 adr, u8 *data, u8 len) { - struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = data, .len = len}; + struct i2c_msg msg = {.addr=adr, .flags=0, .buf=data, .len=len}; if (i2c_transfer(adapter, &msg, 1) != 1) { printk(KERN_ERR "Failed to write to I2C!\n"); @@ -90,9 +90,9 @@ static int i2c_read_reg(struct i2c_adapter *adapter, u8 adr, u8 reg, u8 *val) { struct i2c_msg msgs[2] = {{.addr = adr, .flags = 0, - .buf = ®, .len = 1 }, + .buf = ®, .len = 1}, {.addr = adr, .flags = I2C_M_RD, - .buf = val, .len = 1 } }; + .buf = val, .len = 1}}; if (i2c_transfer(adapter, msgs, 2) != 2) { printk(KERN_ERR "error in i2c_read_reg\n"); @@ -105,9 +105,9 @@ static int i2c_read(struct i2c_adapter *adapter, u8 adr, u8 reg, u8 *data, u8 n) { struct i2c_msg msgs[2] = {{.addr = adr, .flags = 0, - .buf = ®, .len = 1 }, - {.addr = adr, .flags = I2C_M_RD, - .buf = data, .len = n } }; + .buf = ®, .len = 1}, + {.addr = adr, .flags = I2C_M_RD, + .buf = data, .len = n}}; if (i2c_transfer(adapter, msgs, 2) != 2) { printk(KERN_ERR "error in i2c_read\n"); @@ -120,10 +120,10 @@ static int read_block(struct cxd *ci, u8 adr, u8 *data, u8 n) { int status; - status = i2c_write_reg(ci->i2c, ci->adr, 0, adr); + status = i2c_write_reg(ci->i2c, ci->cfg.adr, 0, adr); if (!status) { ci->lastaddress = adr; - status = i2c_read(ci->i2c, ci->adr, 1, data, n); + status = i2c_read(ci->i2c, ci->cfg.adr, 1, data, n); } return status; } @@ -137,24 +137,24 @@ static int read_reg(struct cxd *ci, u8 reg, u8 *val) static int read_pccard(struct cxd *ci, u16 address, u8 *data, u8 n) { int status; - u8 addr[3] = { 2, address&0xff, address>>8 }; + u8 addr[3] = {2, address & 0xff, address >> 8}; - status = i2c_write(ci->i2c, ci->adr, addr, 3); + status=i2c_write(ci->i2c, ci->cfg.adr, addr, 3); if (!status) - status = i2c_read(ci->i2c, ci->adr, 3, data, n); + status = i2c_read(ci->i2c, ci->cfg.adr, 3, data, n); return status; } static int write_pccard(struct cxd *ci, u16 address, u8 *data, u8 n) { int status; - u8 addr[3] = { 2, address&0xff, address>>8 }; + u8 addr[3] = {2, address & 0xff, address >> 8}; - status = i2c_write(ci->i2c, ci->adr, addr, 3); + status=i2c_write(ci->i2c, ci->cfg.adr, addr, 3); if (!status) { u8 buf[256] = {3}; memcpy(buf+1, data, n); - status = i2c_write(ci->i2c, ci->adr, buf, n+1); + status = i2c_write(ci->i2c, ci->cfg.adr, buf, n+1); } return status; } @@ -162,39 +162,64 @@ static int write_pccard(struct cxd *ci, u16 address, u8 *data, u8 n) static int read_io(struct cxd *ci, u16 address, u8 *val) { int status; - u8 addr[3] = { 2, address&0xff, address>>8 }; + u8 addr[3] = {2, address & 0xff, address >> 8}; - status = i2c_write(ci->i2c, ci->adr, addr, 3); + status = i2c_write(ci->i2c, ci->cfg.adr, addr, 3); if (!status) - status = i2c_read(ci->i2c, ci->adr, 3, val, 1); + status = i2c_read(ci->i2c, ci->cfg.adr, 3, val, 1); return status; } static int write_io(struct cxd *ci, u16 address, u8 val) { int status; - u8 addr[3] = { 2, address&0xff, address>>8 }; - u8 buf[2] = { 3, val }; + u8 addr[3] = {2, address & 0xff, address >> 8}; + u8 buf[2] = {3, val}; - status = i2c_write(ci->i2c, ci->adr, addr, 3); + status = i2c_write(ci->i2c, ci->cfg.adr, addr, 3); if (!status) - status = i2c_write(ci->i2c, ci->adr, buf, 2); - + status = i2c_write(ci->i2c, ci->cfg.adr, buf, 2); return status; } +#if 0 +static int read_io_data(struct cxd *ci, u8 *data, u8 n) +{ + int status; + u8 addr[3] = { 2, 0, 0 }; + + status = i2c_write(ci->i2c, ci->cfg.adr, addr, 3); + if (!status) + status = i2c_read(ci->i2c, ci->cfg.adr, 3, data, n); + return 0; +} + +static int write_io_data(struct cxd *ci, u8 *data, u8 n) +{ + int status; + u8 addr[3] = {2, 0, 0}; + + status = i2c_write(ci->i2c, ci->cfg.adr, addr, 3); + if (!status) { + u8 buf[256] = {3}; + memcpy(buf+1, data, n); + status = i2c_write(ci->i2c, ci->cfg.adr, buf, n + 1); + } + return 0; +} +#endif static int write_regm(struct cxd *ci, u8 reg, u8 val, u8 mask) { int status; - status = i2c_write_reg(ci->i2c, ci->adr, 0, reg); - if (!status && reg >= 6 && reg <= 8 && mask != 0xff) - status = i2c_read_reg(ci->i2c, ci->adr, 1, &ci->regs[reg]); - ci->regs[reg] = (ci->regs[reg]&(~mask))|val; + status=i2c_write_reg(ci->i2c, ci->cfg.adr, 0, reg); + if (!status && reg >= 6 && reg <=8 && mask != 0xff) + status = i2c_read_reg(ci->i2c, ci->cfg.adr, 1, &ci->regs[reg]); + ci->regs[reg] = (ci->regs[reg] & (~mask)) | val; if (!status) { ci->lastaddress = reg; - status = i2c_write_reg(ci->i2c, ci->adr, 1, ci->regs[reg]); + status = i2c_write_reg(ci->i2c, ci->cfg.adr, 1, ci->regs[reg]); } if (reg == 0x20) ci->regs[reg] &= 0x7f; @@ -212,11 +237,11 @@ static int write_block(struct cxd *ci, u8 adr, u8 *data, int n) int status; u8 buf[256] = {1}; - status = i2c_write_reg(ci->i2c, ci->adr, 0, adr); + status = i2c_write_reg(ci->i2c, ci->cfg.adr, 0, adr); if (!status) { ci->lastaddress = adr; - memcpy(buf+1, data, n); - status = i2c_write(ci->i2c, ci->adr, buf, n+1); + memcpy(buf + 1, data, n); + status = i2c_write(ci->i2c, ci->cfg.adr, buf, n + 1); } return status; } @@ -250,12 +275,16 @@ static void cam_mode(struct cxd *ci, int mode) write_regm(ci, 0x20, 0x80, 0x80); break; case 0x01: +#ifdef BUFFER_MODE + if (!ci->en.read_data) + return; printk(KERN_INFO "enable cam buffer mode\n"); /* write_reg(ci, 0x0d, 0x00); */ /* write_reg(ci, 0x0e, 0x01); */ write_regm(ci, 0x08, 0x40, 0x40); /* read_reg(ci, 0x12, &dummy); */ write_regm(ci, 0x08, 0x80, 0x80); +#endif break; default: break; @@ -265,14 +294,14 @@ static void cam_mode(struct cxd *ci, int mode) -#define CHK_ERROR(s) if ((status = s)) break +#define CHK_ERROR(s) if( (status = s) ) break static int init(struct cxd *ci) { int status; mutex_lock(&ci->lock); - ci->mode = -1; + ci->mode=-1; do { CHK_ERROR(write_reg(ci, 0x00, 0x00)); CHK_ERROR(write_reg(ci, 0x01, 0x00)); @@ -284,53 +313,84 @@ static int init(struct cxd *ci) CHK_ERROR(write_reg(ci, 0x08, 0x28)); CHK_ERROR(write_reg(ci, 0x14, 0x20)); - CHK_ERROR(write_reg(ci, 0x09, 0x4D)); /* Input Mode C, BYPass Serial, TIVAL = low, MSB */ + /* CHK_ERROR(write_reg(ci, 0x09, 0x4D));*/ /* Input Mode C, BYPass Serial, TIVAL = low, MSB */ CHK_ERROR(write_reg(ci, 0x0A, 0xA7)); /* TOSTRT = 8, Mode B (gated clock), falling Edge, Serial, POL=HIGH, MSB */ - /* Sync detector */ CHK_ERROR(write_reg(ci, 0x0B, 0x33)); CHK_ERROR(write_reg(ci, 0x0C, 0x33)); CHK_ERROR(write_regm(ci, 0x14, 0x00, 0x0F)); CHK_ERROR(write_reg(ci, 0x15, ci->clk_reg_b)); CHK_ERROR(write_regm(ci, 0x16, 0x00, 0x0F)); - CHK_ERROR(write_reg(ci, 0x17, ci->clk_reg_f)); + CHK_ERROR(write_reg(ci, 0x17,ci->clk_reg_f)); - CHK_ERROR(write_reg(ci, 0x20, 0x28)); /* Integer Divider, Falling Edge, Internal Sync, */ - CHK_ERROR(write_reg(ci, 0x21, 0x00)); /* MCLKI = TICLK/8 */ - CHK_ERROR(write_reg(ci, 0x22, 0x07)); /* MCLKI = TICLK/8 */ + if (ci->cfg.clock_mode) { + if (ci->cfg.polarity) { + CHK_ERROR(write_reg(ci, 0x09, 0x6f)); + } else { + CHK_ERROR(write_reg(ci, 0x09, 0x6d)); + } + CHK_ERROR(write_reg(ci, 0x20, 0x68)); + CHK_ERROR(write_reg(ci, 0x21, 0x00)); + CHK_ERROR(write_reg(ci, 0x22, 0x02)); + } else { + if (ci->cfg.polarity) { + CHK_ERROR(write_reg(ci, 0x09, 0x4f)); + } else { + CHK_ERROR(write_reg(ci, 0x09, 0x4d)); + } + CHK_ERROR(write_reg(ci, 0x20, 0x28)); + CHK_ERROR(write_reg(ci, 0x21, 0x00)); + CHK_ERROR(write_reg(ci, 0x22, 0x07)); + } - CHK_ERROR(write_regm(ci, 0x20, 0x80, 0x80)); /* Reset CAM state machine */ + CHK_ERROR(write_regm(ci, 0x20, 0x80, 0x80)); + CHK_ERROR(write_regm(ci, 0x03, 0x02, 0x02)); + CHK_ERROR(write_reg(ci, 0x01, 0x04)); + CHK_ERROR(write_reg(ci, 0x00, 0x31)); - CHK_ERROR(write_regm(ci, 0x03, 0x02, 02)); /* Enable IREQA Interrupt */ - CHK_ERROR(write_reg(ci, 0x01, 0x04)); /* Enable CD Interrupt */ - CHK_ERROR(write_reg(ci, 0x00, 0x31)); /* Enable TS1,Hot Swap,Slot A */ - CHK_ERROR(write_regm(ci, 0x09, 0x08, 0x08)); /* Put TS in bypass */ - ci->cammode = -1; -#ifdef BUFFER_MODE + /* Put TS in bypass */ + CHK_ERROR(write_regm(ci, 0x09, 0x08, 0x08)); + ci->cammode=-1; cam_mode(ci, 0); -#endif - } while (0); + } while(0); mutex_unlock(&ci->lock); return 0; } - static int read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address) { struct cxd *ci = ca->data; +#if 0 + if (ci->amem_read) { + if (address <=0 || address>1024) + return -EIO; + return ci->amem[address]; + } + + mutex_lock(&ci->lock); + write_regm(ci, 0x06, 0x00, 0x05); + read_pccard(ci, 0, &ci->amem[0], 128); + read_pccard(ci, 128, &ci->amem[0], 128); + read_pccard(ci, 256, &ci->amem[0], 128); + read_pccard(ci, 384, &ci->amem[0], 128); + write_regm(ci, 0x06, 0x05, 0x05); + mutex_unlock(&ci->lock); + return ci->amem[address]; +#else u8 val; mutex_lock(&ci->lock); set_mode(ci, 1); read_pccard(ci, address, &val, 1); mutex_unlock(&ci->lock); + //printk("%02x:%02x\n", address,val); return val; +#endif } - static int write_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address, u8 value) { @@ -373,20 +433,41 @@ static int slot_reset(struct dvb_ca_en50221 *ca, int slot) struct cxd *ci = ca->data; mutex_lock(&ci->lock); +#if 0 + write_reg(ci, 0x00, 0x21); + write_reg(ci, 0x06, 0x1F); + write_reg(ci, 0x00, 0x31); +#else +#if 0 + write_reg(ci, 0x06, 0x1F); + write_reg(ci, 0x06, 0x2F); +#else cam_mode(ci, 0); write_reg(ci, 0x00, 0x21); write_reg(ci, 0x06, 0x1F); write_reg(ci, 0x00, 0x31); write_regm(ci, 0x20, 0x80, 0x80); write_reg(ci, 0x03, 0x02); - ci->ready = 0; - ci->mode = -1; + ci->ready=0; +#endif +#endif + ci->mode=-1; { int i; - for (i = 0; i < 100; i++) { +#if 0 + u8 val; +#endif + for (i=0; i<100;i++) { msleep(10); +#if 0 + read_reg(ci, 0x06,&val); + printk(KERN_INFO "%d:%02x\n", i, val); + if (!(val&0x10)) + break; +#else if (ci->ready) break; +#endif } } mutex_unlock(&ci->lock); @@ -400,12 +481,12 @@ static int slot_shutdown(struct dvb_ca_en50221 *ca, int slot) printk(KERN_INFO "slot_shutdown\n"); mutex_lock(&ci->lock); - /* write_regm(ci, 0x09, 0x08, 0x08); */ - write_regm(ci, 0x20, 0x80, 0x80); - write_regm(ci, 0x06, 0x07, 0x07); + write_regm(ci, 0x09, 0x08, 0x08); + write_regm(ci, 0x20, 0x80, 0x80); /* Reset CAM Mode */ + write_regm(ci, 0x06, 0x07, 0x07); /* Clear IO Mode */ ci->mode = -1; mutex_unlock(&ci->lock); - return 0; /* shutdown(ci); */ + return 0; } static int slot_ts_enable(struct dvb_ca_en50221 *ca, int slot) @@ -433,7 +514,7 @@ static int campoll(struct cxd *ci) write_reg(ci, 0x05, istat); if (istat&0x40) { - ci->dr = 1; + ci->dr=1; printk(KERN_INFO "DR\n"); } if (istat&0x20) @@ -445,22 +526,21 @@ static int campoll(struct cxd *ci) read_reg(ci, 0x01, &slotstat); if (!(2&slotstat)) { if (!ci->slot_stat) { - ci->slot_stat |= DVB_CA_EN50221_POLL_CAM_PRESENT; + ci->slot_stat|=DVB_CA_EN50221_POLL_CAM_PRESENT; write_regm(ci, 0x03, 0x08, 0x08); } } else { if (ci->slot_stat) { - ci->slot_stat = 0; + ci->slot_stat=0; write_regm(ci, 0x03, 0x00, 0x08); printk(KERN_INFO "NO CAM\n"); - ci->ready = 0; + ci->ready=0; } } - if (istat&8 && ci->slot_stat == DVB_CA_EN50221_POLL_CAM_PRESENT) { - ci->ready = 1; - ci->slot_stat |= DVB_CA_EN50221_POLL_CAM_READY; - printk(KERN_INFO "READY\n"); + if (istat&8 && ci->slot_stat==DVB_CA_EN50221_POLL_CAM_PRESENT) { + ci->ready=1; + ci->slot_stat|=DVB_CA_EN50221_POLL_CAM_READY; } } return 0; @@ -481,7 +561,7 @@ static int poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open) } #ifdef BUFFER_MODE -static int read_data(struct dvb_ca_en50221 *ca, int slot, u8 *ebuf, int ecount) +static int read_data(struct dvb_ca_en50221* ca, int slot, u8 *ebuf, int ecount) { struct cxd *ci = ca->data; u8 msb, lsb; @@ -498,20 +578,20 @@ static int read_data(struct dvb_ca_en50221 *ca, int slot, u8 *ebuf, int ecount) mutex_lock(&ci->lock); read_reg(ci, 0x0f, &msb); read_reg(ci, 0x10, &lsb); - len = (msb<<8)|lsb; + len=(msb<<8)|lsb; read_block(ci, 0x12, ebuf, len); - ci->dr = 0; + ci->dr=0; mutex_unlock(&ci->lock); return len; } -static int write_data(struct dvb_ca_en50221 *ca, int slot, u8 *ebuf, int ecount) +static int write_data(struct dvb_ca_en50221* ca, int slot, u8 * ebuf, int ecount) { struct cxd *ci = ca->data; mutex_lock(&ci->lock); - printk(KERN_INFO "write_data %d\n", ecount); + printk("write_data %d\n", ecount); write_reg(ci, 0x0d, ecount>>8); write_reg(ci, 0x0e, ecount&0xff); write_block(ci, 0x11, ebuf, ecount); @@ -536,15 +616,15 @@ static struct dvb_ca_en50221 en_templ = { }; -struct dvb_ca_en50221 *cxd2099_attach(u8 adr, void *priv, +struct dvb_ca_en50221 *cxd2099_attach(struct cxd2099_cfg *cfg, + void *priv, struct i2c_adapter *i2c) { struct cxd *ci = 0; - u32 bitrate = 62000000; u8 val; - if (i2c_read_reg(i2c, adr, 0, &val) < 0) { - printk(KERN_ERR "No CXD2099 detected at %02x\n", adr); + if (i2c_read_reg(i2c, cfg->adr, 0, &val)<0) { + printk("No CXD2099 detected at %02x\n", cfg->adr); return 0; } @@ -554,21 +634,21 @@ struct dvb_ca_en50221 *cxd2099_attach(u8 adr, void *priv, memset(ci, 0, sizeof(*ci)); mutex_init(&ci->lock); + memcpy(&ci->cfg, cfg, sizeof(struct cxd2099_cfg)); ci->i2c = i2c; - ci->adr = adr; - ci->lastaddress = 0xff; - ci->clk_reg_b = 0x4a; - ci->clk_reg_f = 0x1b; - ci->bitrate = bitrate; + ci->lastaddress=0xff; + ci->clk_reg_b=0x4a; + ci->clk_reg_f=0x1b; memcpy(&ci->en, &en_templ, sizeof(en_templ)); - ci->en.data = ci; + ci->en.data=ci; init(ci); - printk(KERN_INFO "Attached CXD2099AR at %02x\n", ci->adr); + printk(KERN_INFO "Attached CXD2099AR at %02x\n", ci->cfg.adr); return &ci->en; } + EXPORT_SYMBOL(cxd2099_attach); MODULE_DESCRIPTION("cxd2099"); -MODULE_AUTHOR("Ralph Metzler "); +MODULE_AUTHOR("Ralph Metzler"); MODULE_LICENSE("GPL"); diff --git a/drivers/staging/cxd2099/cxd2099.h b/drivers/staging/cxd2099/cxd2099.h index bed54ff3e30b..cf26c93de096 100644 --- a/drivers/staging/cxd2099/cxd2099.h +++ b/drivers/staging/cxd2099/cxd2099.h @@ -1,7 +1,7 @@ /* * cxd2099.h: Driver for the CXD2099AR Common Interface Controller * - * Copyright (C) 2010 DigitalDevices UG + * Copyright (C) 2010-2011 Digital Devices GmbH * * * This program is free software; you can redistribute it and/or @@ -27,11 +27,21 @@ #include +struct cxd2099_cfg { + u32 bitrate; + u8 adr; + u8 polarity : 1; + u8 clock_mode : 1; +}; + #if defined(CONFIG_DVB_CXD2099) || \ (defined(CONFIG_DVB_CXD2099_MODULE) && defined(MODULE)) -struct dvb_ca_en50221 *cxd2099_attach(u8 adr, void *priv, struct i2c_adapter *i2c); +struct dvb_ca_en50221 *cxd2099_attach(struct cxd2099_cfg *cfg, + void *priv, struct i2c_adapter *i2c); #else -static inline struct dvb_ca_en50221 *cxd2099_attach(u8 adr, void *priv, struct i2c_adapter *i2c) + +static inline struct dvb_ca_en50221 *cxd2099_attach(struct cxd2099_cfg *cfg, + void *priv, struct i2c_adapter *i2c); { printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); return NULL; -- cgit v1.2.3 From 9daf9bccb3f82a61edfc62515297f1b2b876a591 Mon Sep 17 00:00:00 2001 From: Oliver Endriss Date: Sun, 3 Jul 2011 14:02:24 -0300 Subject: [media] cxd2099: Codingstyle fixes Codingstyle fixes. Signed-off-by: Oliver Endriss Signed-off-by: Mauro Carvalho Chehab --- drivers/staging/cxd2099/cxd2099.c | 75 +++++++++++++++++++-------------------- drivers/staging/cxd2099/cxd2099.h | 6 ++-- 2 files changed, 40 insertions(+), 41 deletions(-) (limited to 'drivers/staging') diff --git a/drivers/staging/cxd2099/cxd2099.c b/drivers/staging/cxd2099/cxd2099.c index 803a592b3507..6ec30c1fd4cb 100644 --- a/drivers/staging/cxd2099/cxd2099.c +++ b/drivers/staging/cxd2099/cxd2099.c @@ -64,7 +64,7 @@ static int i2c_write_reg(struct i2c_adapter *adapter, u8 adr, u8 reg, u8 data) { u8 m[2] = {reg, data}; - struct i2c_msg msg = {.addr=adr, .flags=0, .buf=m, .len=2}; + struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = m, .len = 2}; if (i2c_transfer(adapter, &msg, 1) != 1) { printk(KERN_ERR "Failed to write to I2C register %02x@%02x!\n", @@ -77,7 +77,7 @@ static int i2c_write_reg(struct i2c_adapter *adapter, u8 adr, static int i2c_write(struct i2c_adapter *adapter, u8 adr, u8 *data, u8 len) { - struct i2c_msg msg = {.addr=adr, .flags=0, .buf=data, .len=len}; + struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = data, .len = len}; if (i2c_transfer(adapter, &msg, 1) != 1) { printk(KERN_ERR "Failed to write to I2C!\n"); @@ -92,7 +92,7 @@ static int i2c_read_reg(struct i2c_adapter *adapter, u8 adr, struct i2c_msg msgs[2] = {{.addr = adr, .flags = 0, .buf = ®, .len = 1}, {.addr = adr, .flags = I2C_M_RD, - .buf = val, .len = 1}}; + .buf = val, .len = 1} }; if (i2c_transfer(adapter, msgs, 2) != 2) { printk(KERN_ERR "error in i2c_read_reg\n"); @@ -107,7 +107,7 @@ static int i2c_read(struct i2c_adapter *adapter, u8 adr, struct i2c_msg msgs[2] = {{.addr = adr, .flags = 0, .buf = ®, .len = 1}, {.addr = adr, .flags = I2C_M_RD, - .buf = data, .len = n}}; + .buf = data, .len = n} }; if (i2c_transfer(adapter, msgs, 2) != 2) { printk(KERN_ERR "error in i2c_read\n"); @@ -139,7 +139,7 @@ static int read_pccard(struct cxd *ci, u16 address, u8 *data, u8 n) int status; u8 addr[3] = {2, address & 0xff, address >> 8}; - status=i2c_write(ci->i2c, ci->cfg.adr, addr, 3); + status = i2c_write(ci->i2c, ci->cfg.adr, addr, 3); if (!status) status = i2c_read(ci->i2c, ci->cfg.adr, 3, data, n); return status; @@ -150,7 +150,7 @@ static int write_pccard(struct cxd *ci, u16 address, u8 *data, u8 n) int status; u8 addr[3] = {2, address & 0xff, address >> 8}; - status=i2c_write(ci->i2c, ci->cfg.adr, addr, 3); + status = i2c_write(ci->i2c, ci->cfg.adr, addr, 3); if (!status) { u8 buf[256] = {3}; memcpy(buf+1, data, n); @@ -213,8 +213,8 @@ static int write_regm(struct cxd *ci, u8 reg, u8 val, u8 mask) { int status; - status=i2c_write_reg(ci->i2c, ci->cfg.adr, 0, reg); - if (!status && reg >= 6 && reg <=8 && mask != 0xff) + status = i2c_write_reg(ci->i2c, ci->cfg.adr, 0, reg); + if (!status && reg >= 6 && reg <= 8 && mask != 0xff) status = i2c_read_reg(ci->i2c, ci->cfg.adr, 1, &ci->regs[reg]); ci->regs[reg] = (ci->regs[reg] & (~mask)) | val; if (!status) { @@ -294,14 +294,14 @@ static void cam_mode(struct cxd *ci, int mode) -#define CHK_ERROR(s) if( (status = s) ) break +#define CHK_ERROR(s) if ((status = s)) break static int init(struct cxd *ci) { int status; mutex_lock(&ci->lock); - ci->mode=-1; + ci->mode = -1; do { CHK_ERROR(write_reg(ci, 0x00, 0x00)); CHK_ERROR(write_reg(ci, 0x01, 0x00)); @@ -322,7 +322,7 @@ static int init(struct cxd *ci) CHK_ERROR(write_regm(ci, 0x14, 0x00, 0x0F)); CHK_ERROR(write_reg(ci, 0x15, ci->clk_reg_b)); CHK_ERROR(write_regm(ci, 0x16, 0x00, 0x0F)); - CHK_ERROR(write_reg(ci, 0x17,ci->clk_reg_f)); + CHK_ERROR(write_reg(ci, 0x17, ci->clk_reg_f)); if (ci->cfg.clock_mode) { if (ci->cfg.polarity) { @@ -352,9 +352,9 @@ static int init(struct cxd *ci) /* Put TS in bypass */ CHK_ERROR(write_regm(ci, 0x09, 0x08, 0x08)); - ci->cammode=-1; + ci->cammode = -1; cam_mode(ci, 0); - } while(0); + } while (0); mutex_unlock(&ci->lock); return 0; @@ -366,7 +366,7 @@ static int read_attribute_mem(struct dvb_ca_en50221 *ca, struct cxd *ci = ca->data; #if 0 if (ci->amem_read) { - if (address <=0 || address>1024) + if (address <= 0 || address > 1024) return -EIO; return ci->amem[address]; } @@ -386,7 +386,7 @@ static int read_attribute_mem(struct dvb_ca_en50221 *ca, set_mode(ci, 1); read_pccard(ci, address, &val, 1); mutex_unlock(&ci->lock); - //printk("%02x:%02x\n", address,val); + /* printk(KERN_INFO "%02x:%02x\n", address,val); */ return val; #endif } @@ -448,19 +448,19 @@ static int slot_reset(struct dvb_ca_en50221 *ca, int slot) write_reg(ci, 0x00, 0x31); write_regm(ci, 0x20, 0x80, 0x80); write_reg(ci, 0x03, 0x02); - ci->ready=0; + ci->ready = 0; #endif #endif - ci->mode=-1; + ci->mode = -1; { int i; #if 0 u8 val; #endif - for (i=0; i<100;i++) { + for (i = 0; i < 100; i++) { msleep(10); #if 0 - read_reg(ci, 0x06,&val); + read_reg(ci, 0x06, &val); printk(KERN_INFO "%d:%02x\n", i, val); if (!(val&0x10)) break; @@ -514,7 +514,7 @@ static int campoll(struct cxd *ci) write_reg(ci, 0x05, istat); if (istat&0x40) { - ci->dr=1; + ci->dr = 1; printk(KERN_INFO "DR\n"); } if (istat&0x20) @@ -526,21 +526,21 @@ static int campoll(struct cxd *ci) read_reg(ci, 0x01, &slotstat); if (!(2&slotstat)) { if (!ci->slot_stat) { - ci->slot_stat|=DVB_CA_EN50221_POLL_CAM_PRESENT; + ci->slot_stat |= DVB_CA_EN50221_POLL_CAM_PRESENT; write_regm(ci, 0x03, 0x08, 0x08); } } else { if (ci->slot_stat) { - ci->slot_stat=0; + ci->slot_stat = 0; write_regm(ci, 0x03, 0x00, 0x08); printk(KERN_INFO "NO CAM\n"); - ci->ready=0; + ci->ready = 0; } } - if (istat&8 && ci->slot_stat==DVB_CA_EN50221_POLL_CAM_PRESENT) { - ci->ready=1; - ci->slot_stat|=DVB_CA_EN50221_POLL_CAM_READY; + if (istat&8 && ci->slot_stat == DVB_CA_EN50221_POLL_CAM_PRESENT) { + ci->ready = 1; + ci->slot_stat |= DVB_CA_EN50221_POLL_CAM_READY; } } return 0; @@ -561,7 +561,7 @@ static int poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open) } #ifdef BUFFER_MODE -static int read_data(struct dvb_ca_en50221* ca, int slot, u8 *ebuf, int ecount) +static int read_data(struct dvb_ca_en50221 *ca, int slot, u8 *ebuf, int ecount) { struct cxd *ci = ca->data; u8 msb, lsb; @@ -578,20 +578,20 @@ static int read_data(struct dvb_ca_en50221* ca, int slot, u8 *ebuf, int ecount) mutex_lock(&ci->lock); read_reg(ci, 0x0f, &msb); read_reg(ci, 0x10, &lsb); - len=(msb<<8)|lsb; + len = (msb<<8)|lsb; read_block(ci, 0x12, ebuf, len); - ci->dr=0; + ci->dr = 0; mutex_unlock(&ci->lock); return len; } -static int write_data(struct dvb_ca_en50221* ca, int slot, u8 * ebuf, int ecount) +static int write_data(struct dvb_ca_en50221 *ca, int slot, u8 *ebuf, int ecount) { struct cxd *ci = ca->data; mutex_lock(&ci->lock); - printk("write_data %d\n", ecount); + printk(kern_INFO "write_data %d\n", ecount); write_reg(ci, 0x0d, ecount>>8); write_reg(ci, 0x0e, ecount&0xff); write_block(ci, 0x11, ebuf, ecount); @@ -623,8 +623,8 @@ struct dvb_ca_en50221 *cxd2099_attach(struct cxd2099_cfg *cfg, struct cxd *ci = 0; u8 val; - if (i2c_read_reg(i2c, cfg->adr, 0, &val)<0) { - printk("No CXD2099 detected at %02x\n", cfg->adr); + if (i2c_read_reg(i2c, cfg->adr, 0, &val) < 0) { + printk(KERN_INFO "No CXD2099 detected at %02x\n", cfg->adr); return 0; } @@ -636,17 +636,16 @@ struct dvb_ca_en50221 *cxd2099_attach(struct cxd2099_cfg *cfg, mutex_init(&ci->lock); memcpy(&ci->cfg, cfg, sizeof(struct cxd2099_cfg)); ci->i2c = i2c; - ci->lastaddress=0xff; - ci->clk_reg_b=0x4a; - ci->clk_reg_f=0x1b; + ci->lastaddress = 0xff; + ci->clk_reg_b = 0x4a; + ci->clk_reg_f = 0x1b; memcpy(&ci->en, &en_templ, sizeof(en_templ)); - ci->en.data=ci; + ci->en.data = ci; init(ci); printk(KERN_INFO "Attached CXD2099AR at %02x\n", ci->cfg.adr); return &ci->en; } - EXPORT_SYMBOL(cxd2099_attach); MODULE_DESCRIPTION("cxd2099"); diff --git a/drivers/staging/cxd2099/cxd2099.h b/drivers/staging/cxd2099/cxd2099.h index cf26c93de096..75459d41afc1 100644 --- a/drivers/staging/cxd2099/cxd2099.h +++ b/drivers/staging/cxd2099/cxd2099.h @@ -30,12 +30,12 @@ struct cxd2099_cfg { u32 bitrate; u8 adr; - u8 polarity : 1; - u8 clock_mode : 1; + u8 polarity:1; + u8 clock_mode:1; }; #if defined(CONFIG_DVB_CXD2099) || \ - (defined(CONFIG_DVB_CXD2099_MODULE) && defined(MODULE)) + (defined(CONFIG_DVB_CXD2099_MODULE) && defined(MODULE)) struct dvb_ca_en50221 *cxd2099_attach(struct cxd2099_cfg *cfg, void *priv, struct i2c_adapter *i2c); #else -- cgit v1.2.3 From af070bd60fc3aef4afc2a3de5562139ad3f031d9 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Sun, 3 Jul 2011 18:45:37 -0300 Subject: cxd2099: Remove the CHK_ERROR macro The CHK_ERROR macro does a flow control, violating chapter 12 of the Documentation/CodingStyle. Doing flow controls inside macros is a bad idea, as it hides what's happening. It also hides the var "status" with is also a bad idea. The changes were done by this small perl script: my $blk=0; while (<>) { s/^\s+// if ($blk); $f =~ s/\s+$// if ($blk && /^\(/); $blk = 1 if (!m/\#/ && m/CHK_ERROR/); $blk=0 if ($blk && m/\;/); s/\n/ / if ($blk); $f.=$_; }; $f=~ s,\n(\t+)CHK_ERROR\((.*)\)\;([^\n]*),\n\1status = \2;\3\n\1if (status < 0)\n\1\tbreak;,g; print $f; And manually fixed. Signed-off-by: Mauro Carvalho Chehab --- drivers/staging/cxd2099/cxd2099.c | 138 ++++++++++++++++++++++++++++---------- 1 file changed, 101 insertions(+), 37 deletions(-) (limited to 'drivers/staging') diff --git a/drivers/staging/cxd2099/cxd2099.c b/drivers/staging/cxd2099/cxd2099.c index 6ec30c1fd4cb..39d21157a9b8 100644 --- a/drivers/staging/cxd2099/cxd2099.c +++ b/drivers/staging/cxd2099/cxd2099.c @@ -294,8 +294,6 @@ static void cam_mode(struct cxd *ci, int mode) -#define CHK_ERROR(s) if ((status = s)) break - static int init(struct cxd *ci) { int status; @@ -303,55 +301,121 @@ static int init(struct cxd *ci) mutex_lock(&ci->lock); ci->mode = -1; do { - CHK_ERROR(write_reg(ci, 0x00, 0x00)); - CHK_ERROR(write_reg(ci, 0x01, 0x00)); - CHK_ERROR(write_reg(ci, 0x02, 0x10)); - CHK_ERROR(write_reg(ci, 0x03, 0x00)); - CHK_ERROR(write_reg(ci, 0x05, 0xFF)); - CHK_ERROR(write_reg(ci, 0x06, 0x1F)); - CHK_ERROR(write_reg(ci, 0x07, 0x1F)); - CHK_ERROR(write_reg(ci, 0x08, 0x28)); - CHK_ERROR(write_reg(ci, 0x14, 0x20)); - - /* CHK_ERROR(write_reg(ci, 0x09, 0x4D));*/ /* Input Mode C, BYPass Serial, TIVAL = low, MSB */ - CHK_ERROR(write_reg(ci, 0x0A, 0xA7)); /* TOSTRT = 8, Mode B (gated clock), falling Edge, Serial, POL=HIGH, MSB */ - - CHK_ERROR(write_reg(ci, 0x0B, 0x33)); - CHK_ERROR(write_reg(ci, 0x0C, 0x33)); - - CHK_ERROR(write_regm(ci, 0x14, 0x00, 0x0F)); - CHK_ERROR(write_reg(ci, 0x15, ci->clk_reg_b)); - CHK_ERROR(write_regm(ci, 0x16, 0x00, 0x0F)); - CHK_ERROR(write_reg(ci, 0x17, ci->clk_reg_f)); + status = write_reg(ci, 0x00, 0x00); + if (status < 0) + break; + status = write_reg(ci, 0x01, 0x00); + if (status < 0) + break; + status = write_reg(ci, 0x02, 0x10); + if (status < 0) + break; + status = write_reg(ci, 0x03, 0x00); + if (status < 0) + break; + status = write_reg(ci, 0x05, 0xFF); + if (status < 0) + break; + status = write_reg(ci, 0x06, 0x1F); + if (status < 0) + break; + status = write_reg(ci, 0x07, 0x1F); + if (status < 0) + break; + status = write_reg(ci, 0x08, 0x28); + if (status < 0) + break; + status = write_reg(ci, 0x14, 0x20); + if (status < 0) + break; + +#if 0 + status = write_reg(ci, 0x09, 0x4D); /* Input Mode C, BYPass Serial, TIVAL = low, MSB */ + if (status < 0) + break; +#endif + status = write_reg(ci, 0x0A, 0xA7); /* TOSTRT = 8, Mode B (gated clock), falling Edge, Serial, POL=HIGH, MSB */ + if (status < 0) + break; + + status = write_reg(ci, 0x0B, 0x33); + if (status < 0) + break; + status = write_reg(ci, 0x0C, 0x33); + if (status < 0) + break; + + status = write_regm(ci, 0x14, 0x00, 0x0F); + if (status < 0) + break; + status = write_reg(ci, 0x15, ci->clk_reg_b); + if (status < 0) + break; + status = write_regm(ci, 0x16, 0x00, 0x0F); + if (status < 0) + break; + status = write_reg(ci, 0x17, ci->clk_reg_f); + if (status < 0) + break; if (ci->cfg.clock_mode) { if (ci->cfg.polarity) { - CHK_ERROR(write_reg(ci, 0x09, 0x6f)); + status = write_reg(ci, 0x09, 0x6f); + if (status < 0) + break; } else { - CHK_ERROR(write_reg(ci, 0x09, 0x6d)); + status = write_reg(ci, 0x09, 0x6d); + if (status < 0) + break; } - CHK_ERROR(write_reg(ci, 0x20, 0x68)); - CHK_ERROR(write_reg(ci, 0x21, 0x00)); - CHK_ERROR(write_reg(ci, 0x22, 0x02)); + status = write_reg(ci, 0x20, 0x68); + if (status < 0) + break; + status = write_reg(ci, 0x21, 0x00); + if (status < 0) + break; + status = write_reg(ci, 0x22, 0x02); + if (status < 0) + break; } else { if (ci->cfg.polarity) { - CHK_ERROR(write_reg(ci, 0x09, 0x4f)); + status = write_reg(ci, 0x09, 0x4f); + if (status < 0) + break; } else { - CHK_ERROR(write_reg(ci, 0x09, 0x4d)); + status = write_reg(ci, 0x09, 0x4d); + if (status < 0) + break; } - CHK_ERROR(write_reg(ci, 0x20, 0x28)); - CHK_ERROR(write_reg(ci, 0x21, 0x00)); - CHK_ERROR(write_reg(ci, 0x22, 0x07)); + status = write_reg(ci, 0x20, 0x28); + if (status < 0) + break; + status = write_reg(ci, 0x21, 0x00); + if (status < 0) + break; + status = write_reg(ci, 0x22, 0x07); + if (status < 0) + break; } - CHK_ERROR(write_regm(ci, 0x20, 0x80, 0x80)); - CHK_ERROR(write_regm(ci, 0x03, 0x02, 0x02)); - CHK_ERROR(write_reg(ci, 0x01, 0x04)); - CHK_ERROR(write_reg(ci, 0x00, 0x31)); + status = write_regm(ci, 0x20, 0x80, 0x80); + if (status < 0) + break; + status = write_regm(ci, 0x03, 0x02, 0x02); + if (status < 0) + break; + status = write_reg(ci, 0x01, 0x04); + if (status < 0) + break; + status = write_reg(ci, 0x00, 0x31); + if (status < 0) + break; /* Put TS in bypass */ - CHK_ERROR(write_regm(ci, 0x09, 0x08, 0x08)); + status = write_regm(ci, 0x09, 0x08, 0x08); + if (status < 0) + break; ci->cammode = -1; cam_mode(ci, 0); } while (0); -- cgit v1.2.3 From 7dfd071271bb237d16d8088287bf52a2684cb3ca Mon Sep 17 00:00:00 2001 From: Oliver Endriss Date: Sun, 3 Jul 2011 18:26:22 -0300 Subject: [media] cxd2099: Fix compilation of ngene/ddbridge for DVB_CXD2099=n Fix compilation of ngene/ddbridge for DVB_CXD2099=n. Note: Bug was introduced by commit 'cxd2099: Update to latest version'. Signed-off-by: Oliver Endriss Signed-off-by: Mauro Carvalho Chehab --- drivers/staging/cxd2099/cxd2099.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/staging') diff --git a/drivers/staging/cxd2099/cxd2099.h b/drivers/staging/cxd2099/cxd2099.h index 75459d41afc1..19c588a59588 100644 --- a/drivers/staging/cxd2099/cxd2099.h +++ b/drivers/staging/cxd2099/cxd2099.h @@ -41,7 +41,7 @@ struct dvb_ca_en50221 *cxd2099_attach(struct cxd2099_cfg *cfg, #else static inline struct dvb_ca_en50221 *cxd2099_attach(struct cxd2099_cfg *cfg, - void *priv, struct i2c_adapter *i2c); + void *priv, struct i2c_adapter *i2c) { printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); return NULL; -- cgit v1.2.3 From 8d31bac155d0d891a2380d5b683e6b285cc23e34 Mon Sep 17 00:00:00 2001 From: Oliver Endriss Date: Sun, 3 Jul 2011 18:27:51 -0300 Subject: [media] cxd2099: Update Kconfig description (ddbridge support) Update Kconfig description (ddbridge with cxd2099) Signed-off-by: Oliver Endriss Signed-off-by: Mauro Carvalho Chehab --- drivers/staging/cxd2099/Kconfig | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'drivers/staging') diff --git a/drivers/staging/cxd2099/Kconfig b/drivers/staging/cxd2099/Kconfig index 9d638c30735d..b48aefddc84c 100644 --- a/drivers/staging/cxd2099/Kconfig +++ b/drivers/staging/cxd2099/Kconfig @@ -1,9 +1,10 @@ config DVB_CXD2099 - tristate "CXD2099AR Common Interface driver" - depends on DVB_CORE && PCI && I2C && DVB_NGENE - ---help--- - Support for the CI module found on cineS2 DVB-S2, supported by - the Micronas PCIe device driver (ngene). + tristate "CXD2099AR Common Interface driver" + depends on DVB_CORE && PCI && I2C + ---help--- + Support for the CI module found on cards based on + - Micronas ngene PCIe bridge: cineS2 etc. + - Digital Devices PCIe bridge: Octopus series For now, data is passed through '/dev/dvb/adapterX/sec0': - Encrypted data must be written to 'sec0'. -- cgit v1.2.3 From 51b6d717fb8e261e9705d66351f425561f114d4b Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Wed, 13 Jul 2011 19:15:57 -0300 Subject: [media] tm6000: remove a check for NO_PCM_LOCK This was likely used by some test. There's no sense on keeping it upstream. Signed-off-by: Mauro Carvalho Chehab --- drivers/staging/tm6000/tm6000-alsa.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'drivers/staging') diff --git a/drivers/staging/tm6000/tm6000-alsa.c b/drivers/staging/tm6000/tm6000-alsa.c index 2b96047c2983..a588f299af49 100644 --- a/drivers/staging/tm6000/tm6000-alsa.c +++ b/drivers/staging/tm6000/tm6000-alsa.c @@ -254,9 +254,7 @@ static int tm6000_fillbuf(struct tm6000_core *core, char *buf, int size) memcpy(runtime->dma_area + buf_pos * stride, buf, length * stride); -#ifndef NO_PCM_LOCK snd_pcm_stream_lock(substream); -#endif chip->buf_pos += length; if (chip->buf_pos >= runtime->buffer_size) @@ -268,9 +266,7 @@ static int tm6000_fillbuf(struct tm6000_core *core, char *buf, int size) period_elapsed = 1; } -#ifndef NO_PCM_LOCK snd_pcm_stream_unlock(substream); -#endif if (period_elapsed) snd_pcm_period_elapsed(substream); -- cgit v1.2.3 From 37f9619dd5df9f1c9878ac53e27033519b8760ec Mon Sep 17 00:00:00 2001 From: "Adam M. Dutko" Date: Thu, 23 Jun 2011 11:57:45 -0300 Subject: [media] TM6000: alsa: Clean up kernel coding style errors There were several coding style errors as reported by checkpatch.pl. This patch should fix those errors with the single exception of the open square bracket issue on line 45. [mchehab@redhat.com: Fix a merge conflict] Signed-off-by: Adam M. Dutko Signed-off-by: Mauro Carvalho Chehab --- drivers/staging/tm6000/tm6000-alsa.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'drivers/staging') diff --git a/drivers/staging/tm6000/tm6000-alsa.c b/drivers/staging/tm6000/tm6000-alsa.c index a588f299af49..018ff73ab71d 100644 --- a/drivers/staging/tm6000/tm6000-alsa.c +++ b/drivers/staging/tm6000/tm6000-alsa.c @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include #include @@ -84,7 +84,6 @@ static int _tm6000_start_audio_dma(struct snd_tm6000_card *chip) tm6000_set_audio_bitrate(core, 48000); - return 0; } @@ -123,6 +122,7 @@ static int dsp_buffer_alloc(struct snd_pcm_substream *substream, int size) if (substream->runtime->dma_area) { if (substream->runtime->dma_bytes > size) return 0; + dsp_buffer_free(substream); } @@ -152,9 +152,9 @@ static struct snd_pcm_hardware snd_tm6000_digital_hw = { SNDRV_PCM_INFO_MMAP_VALID, .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rates = SNDRV_PCM_RATE_CONTINUOUS, - .rate_min = 48000, - .rate_max = 48000, + .rates = SNDRV_PCM_RATE_CONTINUOUS, + .rate_min = 48000, + .rate_max = 48000, .channels_min = 2, .channels_max = 2, .period_bytes_min = 64, @@ -457,7 +457,7 @@ int tm6000_audio_init(struct tm6000_core *dev) if (rc < 0) goto error_chip; - dprintk(1,"Registered audio driver for %s\n", card->longname); + dprintk(1, "Registered audio driver for %s\n", card->longname); return 0; -- cgit v1.2.3