wct4xxp: Hold a pointer to the devtype directly
Eliminates the need to store a copy of the flags and variety from the global devtype. Signed-off-by: Shaun Ruffell <sruffell@digium.com> Acked-by: Michael Spiceland <mspiceland@digium.com> Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com> git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@10238 a0bf4364-ded3-4de4-8d8a-66a801d63aff
This commit is contained in:
parent
a01f74d64a
commit
0544f8c7cc
@ -342,7 +342,7 @@ struct t4 {
|
|||||||
#endif
|
#endif
|
||||||
int irq; /* IRQ used by device */
|
int irq; /* IRQ used by device */
|
||||||
int order; /* Order */
|
int order; /* Order */
|
||||||
int flags; /* Device flags */
|
const struct devtype *devtype;
|
||||||
unsigned int falc31 : 1; /* are we falc v3.1 (atomic not necessary) */
|
unsigned int falc31 : 1; /* are we falc v3.1 (atomic not necessary) */
|
||||||
int ledreg; /* LED Register */
|
int ledreg; /* LED Register */
|
||||||
unsigned int gpio;
|
unsigned int gpio;
|
||||||
@ -356,7 +356,6 @@ struct t4 {
|
|||||||
atomic_t worklist;
|
atomic_t worklist;
|
||||||
struct workqueue_struct *workq;
|
struct workqueue_struct *workq;
|
||||||
#endif
|
#endif
|
||||||
char *variety;
|
|
||||||
int last0; /* for detecting double-missed IRQ */
|
int last0; /* for detecting double-missed IRQ */
|
||||||
|
|
||||||
/* DMA related fields */
|
/* DMA related fields */
|
||||||
@ -1971,7 +1970,7 @@ static void set_span_devicetype(struct t4 *wc)
|
|||||||
|
|
||||||
for (x = 0; x < wc->numspans; x++) {
|
for (x = 0; x < wc->numspans; x++) {
|
||||||
ts = wc->tspans[x];
|
ts = wc->tspans[x];
|
||||||
strlcpy(ts->span.devicetype, wc->variety,
|
strlcpy(ts->span.devicetype, wc->devtype->desc,
|
||||||
sizeof(ts->span.devicetype));
|
sizeof(ts->span.devicetype));
|
||||||
#ifdef VPM_SUPPORT
|
#ifdef VPM_SUPPORT
|
||||||
if (wc->vpm == T4_VPM_PRESENT) {
|
if (wc->vpm == T4_VPM_PRESENT) {
|
||||||
@ -2189,13 +2188,13 @@ static void t4_serial_setup(struct t4 *wc, int unit)
|
|||||||
/* Configure ports */
|
/* Configure ports */
|
||||||
t4_framer_out(wc, unit, 0x80, 0x00); /* PC1: SPYR/SPYX input on RPA/XPA */
|
t4_framer_out(wc, unit, 0x80, 0x00); /* PC1: SPYR/SPYX input on RPA/XPA */
|
||||||
if (wc->falc31) {
|
if (wc->falc31) {
|
||||||
t4_framer_out(wc, unit, 0x81, 0xBB); /* PC2: RMFB/XSIG output/input on RPB/XPB */
|
t4_framer_out(wc, unit, 0x81, 0xBB);
|
||||||
t4_framer_out(wc, unit, 0x82, 0xBB); /* PC3: Some unused stuff */
|
t4_framer_out(wc, unit, 0x82, 0xBB);
|
||||||
t4_framer_out(wc, unit, 0x83, 0xBB); /* PC4: Some more unused stuff */
|
t4_framer_out(wc, unit, 0x83, 0xBB);
|
||||||
} else {
|
} else {
|
||||||
t4_framer_out(wc, unit, 0x81, 0x22); /* PC2: RMFB/XSIG output/input on RPB/XPB */
|
t4_framer_out(wc, unit, 0x81, 0x22);
|
||||||
t4_framer_out(wc, unit, 0x82, 0x65); /* PC3: Some unused stuff */
|
t4_framer_out(wc, unit, 0x82, 0x65);
|
||||||
t4_framer_out(wc, unit, 0x83, 0x35); /* PC4: Some more unused stuff */
|
t4_framer_out(wc, unit, 0x83, 0x35);
|
||||||
}
|
}
|
||||||
t4_framer_out(wc, unit, 0x84, 0x01); /* PC5: XMFS active low, SCLKR is input, RCLK is output */
|
t4_framer_out(wc, unit, 0x84, 0x01); /* PC5: XMFS active low, SCLKR is input, RCLK is output */
|
||||||
if (debug & DEBUG_MAIN)
|
if (debug & DEBUG_MAIN)
|
||||||
@ -2212,7 +2211,6 @@ static void __t4_set_rclk_src(struct t4 *wc, int span)
|
|||||||
{
|
{
|
||||||
int cmr1 = 0x38; /* Clock Mode: RCLK sourced by DCO-R1
|
int cmr1 = 0x38; /* Clock Mode: RCLK sourced by DCO-R1
|
||||||
by default, Disable Clock-Switching */
|
by default, Disable Clock-Switching */
|
||||||
|
|
||||||
cmr1 |= (span << 6);
|
cmr1 |= (span << 6);
|
||||||
__t4_framer_out(wc, 0, 0x44, cmr1);
|
__t4_framer_out(wc, 0, 0x44, cmr1);
|
||||||
|
|
||||||
@ -2674,7 +2672,7 @@ static int t4_startup(struct file *file, struct dahdi_span *span)
|
|||||||
span->flags |= DAHDI_FLAG_RUNNING;
|
span->flags |= DAHDI_FLAG_RUNNING;
|
||||||
wc->spansstarted++;
|
wc->spansstarted++;
|
||||||
|
|
||||||
if (wc->flags & FLAG_5THGEN)
|
if (wc->devtype->flags & FLAG_5THGEN)
|
||||||
__t4_pci_out(wc, 5, (ms_per_irq << 16) | wc->numbufs);
|
__t4_pci_out(wc, 5, (ms_per_irq << 16) | wc->numbufs);
|
||||||
/* enable interrupts */
|
/* enable interrupts */
|
||||||
/* Start DMA, enabling DMA interrupts on read only */
|
/* Start DMA, enabling DMA interrupts on read only */
|
||||||
@ -3812,7 +3810,7 @@ DAHDI_IRQ_HANDLER(t4_interrupt_gen2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
wc->intcount++;
|
wc->intcount++;
|
||||||
if ((wc->flags & FLAG_5THGEN) && (status & 0x2)) {
|
if ((wc->devtype->flags & FLAG_5THGEN) && (status & 0x2)) {
|
||||||
rxident = (status >> 16) & 0x7f;
|
rxident = (status >> 16) & 0x7f;
|
||||||
expected = (wc->rxident + ms_per_irq) % 128;
|
expected = (wc->rxident + ms_per_irq) % 128;
|
||||||
|
|
||||||
@ -3900,7 +3898,7 @@ DAHDI_IRQ_HANDLER(t4_interrupt_gen2)
|
|||||||
dev_info(&wc->dev->dev, "Reg 5 is %08x\n", reg5);
|
dev_info(&wc->dev->dev, "Reg 5 is %08x\n", reg5);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (wc->flags & FLAG_5THGEN) {
|
if (wc->devtype->flags & FLAG_5THGEN) {
|
||||||
unsigned int current_index = (reg5 >> 8) & 0x7f;
|
unsigned int current_index = (reg5 >> 8) & 0x7f;
|
||||||
#if 0
|
#if 0
|
||||||
int catchup = 0;
|
int catchup = 0;
|
||||||
@ -4426,7 +4424,7 @@ static int t4_hardware_init_1(struct t4 *wc, unsigned int cardflags)
|
|||||||
#if defined(CONFIG_FORCE_EXTENDED_RESET)
|
#if defined(CONFIG_FORCE_EXTENDED_RESET)
|
||||||
t4_extended_reset(wc);
|
t4_extended_reset(wc);
|
||||||
#elif !defined(CONFIG_NOEXTENDED_RESET)
|
#elif !defined(CONFIG_NOEXTENDED_RESET)
|
||||||
if (wc->flags & FLAG_EXPRESS)
|
if (wc->devtype->flags & FLAG_EXPRESS)
|
||||||
t4_extended_reset(wc);
|
t4_extended_reset(wc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -4614,7 +4612,6 @@ static int __devinit t4_init_one(struct pci_dev *pdev, const struct pci_device_i
|
|||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
struct t4 *wc;
|
struct t4 *wc;
|
||||||
struct devtype *dt;
|
|
||||||
unsigned int x, f;
|
unsigned int x, f;
|
||||||
int init_latency;
|
int init_latency;
|
||||||
|
|
||||||
@ -4628,17 +4625,13 @@ static int __devinit t4_init_one(struct pci_dev *pdev, const struct pci_device_i
|
|||||||
|
|
||||||
memset(wc, 0x0, sizeof(*wc));
|
memset(wc, 0x0, sizeof(*wc));
|
||||||
spin_lock_init(&wc->reglock);
|
spin_lock_init(&wc->reglock);
|
||||||
dt = (struct devtype *) (ent->driver_data);
|
wc->devtype = (const struct devtype *)(ent->driver_data);
|
||||||
|
|
||||||
wc->flags = dt->flags;
|
if (wc->devtype->flags & FLAG_2PORT)
|
||||||
|
|
||||||
if (wc->flags & FLAG_2PORT)
|
|
||||||
wc->numspans = 2;
|
wc->numspans = 2;
|
||||||
else
|
else
|
||||||
wc->numspans = 4;
|
wc->numspans = 4;
|
||||||
|
|
||||||
wc->variety = dt->desc;
|
|
||||||
|
|
||||||
wc->membase = pci_iomap(pdev, 0, 0);
|
wc->membase = pci_iomap(pdev, 0, 0);
|
||||||
/* This rids of the Double missed interrupt message after loading */
|
/* This rids of the Double missed interrupt message after loading */
|
||||||
wc->last0 = 1;
|
wc->last0 = 1;
|
||||||
@ -4647,7 +4640,7 @@ static int __devinit t4_init_one(struct pci_dev *pdev, const struct pci_device_i
|
|||||||
dev_info(&wc->dev->dev, "wct4: Unable to request memory "
|
dev_info(&wc->dev->dev, "wct4: Unable to request memory "
|
||||||
"region :(, using anyway...\n");
|
"region :(, using anyway...\n");
|
||||||
#endif
|
#endif
|
||||||
if (pci_request_regions(pdev, wc->variety))
|
if (pci_request_regions(pdev, wc->devtype->desc))
|
||||||
dev_info(&pdev->dev, "wct%dxxp: Unable to request regions\n",
|
dev_info(&pdev->dev, "wct%dxxp: Unable to request regions\n",
|
||||||
wc->numspans);
|
wc->numspans);
|
||||||
|
|
||||||
@ -4662,7 +4655,7 @@ static int __devinit t4_init_one(struct pci_dev *pdev, const struct pci_device_i
|
|||||||
/* Keep track of which device we are */
|
/* Keep track of which device we are */
|
||||||
pci_set_drvdata(pdev, wc);
|
pci_set_drvdata(pdev, wc);
|
||||||
|
|
||||||
if (wc->flags & FLAG_5THGEN) {
|
if (wc->devtype->flags & FLAG_5THGEN) {
|
||||||
if ((ms_per_irq > 1) && (latency <= ((ms_per_irq) << 1))) {
|
if ((ms_per_irq > 1) && (latency <= ((ms_per_irq) << 1))) {
|
||||||
init_latency = ms_per_irq << 1;
|
init_latency = ms_per_irq << 1;
|
||||||
} else {
|
} else {
|
||||||
@ -4674,7 +4667,7 @@ static int __devinit t4_init_one(struct pci_dev *pdev, const struct pci_device_i
|
|||||||
dev_info(&wc->dev->dev, "5th gen card with initial latency of "
|
dev_info(&wc->dev->dev, "5th gen card with initial latency of "
|
||||||
"%d and %d ms per IRQ\n", init_latency, ms_per_irq);
|
"%d and %d ms per IRQ\n", init_latency, ms_per_irq);
|
||||||
} else {
|
} else {
|
||||||
if (wc->flags & FLAG_2NDGEN)
|
if (wc->devtype->flags & FLAG_2NDGEN)
|
||||||
init_latency = 1;
|
init_latency = 1;
|
||||||
else
|
else
|
||||||
init_latency = 2;
|
init_latency = 2;
|
||||||
@ -4690,7 +4683,7 @@ static int __devinit t4_init_one(struct pci_dev *pdev, const struct pci_device_i
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize hardware */
|
/* Initialize hardware */
|
||||||
t4_hardware_init_1(wc, wc->flags);
|
t4_hardware_init_1(wc, wc->devtype->flags);
|
||||||
|
|
||||||
for(x = 0; x < MAX_T4_CARDS; x++) {
|
for(x = 0; x < MAX_T4_CARDS; x++) {
|
||||||
if (!cards[x])
|
if (!cards[x])
|
||||||
@ -4707,7 +4700,7 @@ static int __devinit t4_init_one(struct pci_dev *pdev, const struct pci_device_i
|
|||||||
cards[x] = wc;
|
cards[x] = wc;
|
||||||
|
|
||||||
#ifdef ENABLE_WORKQUEUES
|
#ifdef ENABLE_WORKQUEUES
|
||||||
if (wc->flags & FLAG_2NDGEN) {
|
if (wc->devtype->flags & FLAG_2NDGEN) {
|
||||||
char tmp[20];
|
char tmp[20];
|
||||||
|
|
||||||
sprintf(tmp, "te%dxxp[%d]", wc->numspans, wc->num);
|
sprintf(tmp, "te%dxxp[%d]", wc->numspans, wc->num);
|
||||||
@ -4749,14 +4742,17 @@ static int __devinit t4_init_one(struct pci_dev *pdev, const struct pci_device_i
|
|||||||
#ifdef ENABLE_WORKQUEUES
|
#ifdef ENABLE_WORKQUEUES
|
||||||
INIT_WORK(&wc->tspans[x]->swork, workq_handlespan, wc->tspans[x]);
|
INIT_WORK(&wc->tspans[x]->swork, workq_handlespan, wc->tspans[x]);
|
||||||
#endif
|
#endif
|
||||||
wc->tspans[x]->spanflags |= wc->flags;
|
wc->tspans[x]->spanflags |= wc->devtype->flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Continue hardware intiialization */
|
/* Continue hardware intiialization */
|
||||||
t4_hardware_init_2(wc);
|
t4_hardware_init_2(wc);
|
||||||
|
|
||||||
#ifdef SUPPORT_GEN1
|
#ifdef SUPPORT_GEN1
|
||||||
if (request_irq(pdev->irq, (wc->flags & FLAG_2NDGEN) ? t4_interrupt_gen2 : t4_interrupt, DAHDI_IRQ_SHARED_DISABLED, (wc->numspans == 2) ? "wct2xxp" : "wct4xxp", wc))
|
if (request_irq(pdev->irq, (wc->devtype->flags & FLAG_2NDGEN) ?
|
||||||
|
t4_interrupt_gen2 : t4_interrupt,
|
||||||
|
DAHDI_IRQ_SHARED_DISABLED,
|
||||||
|
(wc->numspans == 2) ? "wct2xxp" : "wct4xxp", wc))
|
||||||
#else
|
#else
|
||||||
if (!(wc->tspans[0]->spanflags & FLAG_2NDGEN)) {
|
if (!(wc->tspans[0]->spanflags & FLAG_2NDGEN)) {
|
||||||
dev_notice(&wc->dev->dev, "This driver does not "
|
dev_notice(&wc->dev->dev, "This driver does not "
|
||||||
@ -4778,7 +4774,7 @@ static int __devinit t4_init_one(struct pci_dev *pdev, const struct pci_device_i
|
|||||||
if (!ignore_rotary)
|
if (!ignore_rotary)
|
||||||
wct4xxp_sort_cards();
|
wct4xxp_sort_cards();
|
||||||
|
|
||||||
dev_info(&wc->dev->dev, "Found a Wildcard: %s\n", wc->variety);
|
dev_info(&wc->dev->dev, "Found a Wildcard: %s\n", wc->devtype->desc);
|
||||||
wc->gpio = 0x00000000;
|
wc->gpio = 0x00000000;
|
||||||
t4_pci_out(wc, WC_GPIO, wc->gpio);
|
t4_pci_out(wc, WC_GPIO, wc->gpio);
|
||||||
t4_gpio_setdir(wc, (1 << 17), (1 << 17));
|
t4_gpio_setdir(wc, (1 << 17), (1 << 17));
|
||||||
|
Loading…
Reference in New Issue
Block a user