On Tue, Aug 27, 2013 at 12:30 PM, George Cherian <george.cherian@xxxxxx> wrote:okay
This patchCan you please split this up? It seems like three different patches,
- removes the irq_demux_work
- Uses devm_request_threaded_irq
- Call the user handler iff gpio_to_irq is done.
Signed-off-by: George Cherian <george.cherian@xxxxxx>
and now they block each other. The threading patch is fine and
I could apply it unless this was mixed up with other stuff.
I'd like Kuninoro and/or Nikolay to have a look at this, so please
CC them on subsequent iterations.
NB: I really like that you move the irq handling to a thread, goodpcf857x driver supports expanders with 8 and 16 gpio lines.
job.
static const struct i2c_device_id pcf857x_id[] = {This seems like an u32 or atleast unsigned, and state that its one
@@ -89,12 +89,12 @@ struct pcf857x {
struct gpio_chip chip;
struct i2c_client *client;
struct mutex lock; /* protect 'out' */
- struct work_struct work; /* irq demux work */
struct irq_domain *irq_domain; /* for irq demux */
spinlock_t slock; /* protect irq demux */
unsigned out; /* software latch */
unsigned status; /* current status */
int irq; /* real irq number */
+ int irq_mapped; /* mapped gpio irqs */
bit flag per IRQ. How many GPIO lines are there?
While testing I got prints like bad irq and no handler installed.-static void pcf857x_irq_demux_work(struct work_struct *work)I don't know if that is right.
+static irqreturn_t pcf857x_irq(int irq, void *data)
{
- struct pcf857x *gpio = container_of(work,
- struct pcf857x,
- work);
+ struct pcf857x *gpio = data;
unsigned long change, i, status, flags;
status = gpio->read(gpio->client);
spin_lock_irqsave(&gpio->slock, flags);
+
+ /*
+ * call the interrupt handler iff gpio is used as
+ * interrupt source, just to avoid bad irqs
+ */
- change = gpio->status ^ status;
+ change = ((gpio->status ^ status) & gpio->irq_mapped);
If this happens you are getting what we call a "spurious IRQ"
and this shall be reported to the IRQ core by returning
IRQ_NONE and handled from there.
Mainly these expanders dont have an ier sort of registers and if at all the initial value is not set proper
@@ -226,9 +223,13 @@ static irqreturn_t pcf857x_irq_demux(int irq, void *data)I'm a bit uneasy about this. It feels like its the irqdomain's
static int pcf857x_irq_domain_map(struct irq_domain *domain, unsigned int virq,
irq_hw_number_t hw)
{
+ struct pcf857x *gpio = domain->host_data;
irq_set_chip_and_handler(virq,
&dummy_irq_chip,
handle_level_irq);
+ set_irq_flags(virq, IRQF_VALID);
+ gpio->irq_mapped |= (1 << hw);
responsibility to keep track of whether an IRQ is mapped
or not.
Maybe Grant should have a look at this.
Yours,
Linus Walleij