Roland Dreier wrote:
>  > If i uncomment the saa716x_read or write, what i get is a solid freeze
>  > on module load. If i leave it commented out, the module loads fine.
> 
> That sounds like a typical bug during driver development... you're
> probably wedging the hardware by doing the wrong access.
> 
> I didn't see the source for saa716x_read or write in the code you
> posted, so it's hard to say if there's a problem with them.
> 

Attaching saa716x_read/write in saa716x_priv.h

> Is your interrupt handler getting called?  Is the device generating
> interrupts?

It looks so, from the logs. The only problem is i can't disable the
interrupts, if i write "0" to 0x500, the interrupt/enable register, it
gives me a solid freeze. If i read from the handler, commenting out the
disable interrupts in init, that read also gives me a solid freeze. This
lead me to think that there could be some problem with the MMIO block
access.


May 23 03:25:48 manu-04 kernel: [  383.602737] saa716x_pci_init: found a
Twinhan VP-6090 device
May 23 03:25:48 manu-04 kernel: [  383.602764] ACPI: PCI Interrupt
0000:06:00.0[A] -> GSI 16 (level, low) -> IRQ 16
May 23 03:25:48 manu-04 kernel: [  383.603020]      SAA7160/1/2 Rev 1
[1822:0027], irq: 16, latency: 0
May 23 03:25:48 manu-04 kernel: [  383.603024]      memory: 0x32200000,
mmio: 0xe046e000
May 23 03:25:48 manu-04 kernel: [  383.610761] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.624056] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.637348] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.650650] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.663951] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.677253] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.690554] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.703858] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.717156] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.730459] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.743760] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.757064] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.770364] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.783665] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.796966] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.810269] === Interrupts[0010] [] ==
May 23 03:25:48 manu-04 kernel: [  383.823569] === Interrupts[0010] [] ==


> 
>  > That part is then fine. Does MSI require any special tinkering ?
> 
> Just pci_enable_msi() as usual.

Thanks


Regards,
Manu

#ifndef __SAA716x_PRIV_H
#define __SAA716x_PRIV_H

#include <linux/interrupt.h>
#include <linux/pci.h>
#include <linux/sched.h>
#include <linux/mutex.h>
#include "dvbdev.h"
#include "dvb_demux.h"
#include "dmxdev.h"
#include "dvb_frontend.h"
#include "dvb_net.h"

#define SAA716x_ERROR                   0
#define SAA716x_NOTICE                  1
#define SAA716x_INFO                    2
#define SAA716x_DEBUG                   3

#define dprintk(x, y, z, format, arg...) do {                                   
                \
        if (z) {                                                                
                \
                if ((x > SAA716x_ERROR) && (x > y))                             
                \
                        printk(KERN_ERR "%s (%d): " format "\n", __func__, 
saa716x->num, ##arg);\
                else if ((x > SAA716x_NOTICE) && (x > y))                       
                \
                        printk(KERN_ERR "%s (%d): " format "\n", __func__, 
saa716x->num, ##arg);\
                else if ((x > SAA716x_INFO) && (x > y))                         
                \
                        printk(KERN_ERR "%s (%d): " format "\n", __func__, 
saa716x->num, ##arg);\
                else if ((x > SAA716x_DEBUG) && (x > y))                        
                \
                        printk(KERN_ERR "%s (%d): " format "\n", __func__, 
saa716x->num, ##arg);\
        } else {                                                                
                \
                if (x > y)                                                      
                \
                        printk(format, ##arg);                                  
                \
        }                                                                       
                \
} while (0);


#define MAKE_ENTRY(subven, subdev, configptr) {                 \
                .vendor         = 0x1131,                       \
                .device         = 0x7162,                       \
                .subvendor      = (subven),                     \
                .subdevice      = (subdev),                     \
                .driver_data    = (unsigned long) (configptr)   \
}

#define saa716x_write(dat, addr)        writel((dat), (saa716x->mmio)+(addr))
#define saa716x_read(addr)              readl((saa716x->mmio)+(addr))

struct saa716x;

typedef int (*saa716x_load_config_t)(struct saa716x *saa716x);

struct saa716x_hwconfig {
        char                    *model_name;
        char                    *dev_type;
        saa716x_load_config_t   load_config;
};

struct saa716x_dma {
        struct tasklet_struct   dma_tasklet;
};

struct saa716x_dvb {
        struct dvb_adapter      adapter;
        struct dvb_frontend     *fe;
        struct dvb_demux        demux;
        struct dmxdev           dmxdev;
        struct dmx_frontend     fe_hw;
        struct dmx_frontend     fe_mem;
        struct dvb_net          dvbnet;
};

struct saa716x_i2c {
        struct device           *dev;
        struct i2c_adapter      adapter;
        wait_queue_head_t       i2c_queue;
};

struct saa716x {
        /* dev priv */
        unsigned int            verbose;
        unsigned int            num;
        struct saa716x_hwconfig *hwconfig;

        /* PCI */
        struct pci_dev          *pdev;
        void __iomem            *mmio;
        unsigned int            irq;

        /* I2C */
        struct saa716x_i2c      i2c_adapter_a;
        struct saa716x_i2c      i2c_adapter_b;

        /* DMA */
        struct saa716x_dma      dma_device_a;
        struct saa716x_dma      dma_device_b;

        /* DVB */
        struct saa716x_dvb      dvb_device_a;
        struct saa716x_dvb      dvb_device_b;
};

extern void saa716x_i2c_disable(struct saa716x *saa716x);
extern void saa716x_i2c_enable(struct saa716x *saa716x);

extern int saa716x_pcie_init(struct saa716x *saa716x);
extern void saa716x_pcie_exit(struct saa716x *saa716x);

#endif //__SAA716x_PRIV_H

Reply via email to