1. 15 1月, 2014 3 次提交
    • L
      pinctrl: sirf: lock IRQs when starting them · 655dada6
      Linus Walleij 提交于
      This uses the new API for tagging GPIO lines as in use by
      IRQs. This enforces a few semantic checks on how the underlying
      GPIO line is used.
      
      Also assign the gpio_chip.dev pointer to be used for error
      messages.
      
      Cc: Barry Song <Baohua.Song@csr.com>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      655dada6
    • B
      pinctrl: sirf: put gpio interrupt pin into input status automatically · b07ddcdc
      Barry Song 提交于
      busses like i2c, spi and so on can parse the virq of their subnode automatically by
      irq_of_parse_and_map(). for example, i2c will do that in of_i2c_register_devices().
      people can put hwirq number attached to a gpio controller in dts, and drivers can
      directly request the parsed virq.
      
      for example, for an i2c client as below,
      tangoc-ts@5c{
      	compatible = "pixcir,tangoc-ts";
      	interrupt-parent = <&gpio>;
      	interrupts = <3 0>;
      	reg = <0x5c>;
      };
      in i2c client probe(), it will request_irq(client->irq, ...) without
      calling gpio_direction_input().
      so here when we set irq type, we also put the pin to input direction.
      Signed-off-by: NBarry Song <Baohua.Song@csr.com>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      b07ddcdc
    • B
      pinctrl: sirf: use only one irq_domain for the whole device node · 8daeffb0
      Barry Song 提交于
      in sirfsoc gpio probe(), we create 5 irq_domains for 5 gpio banks. but
      in irq_create_of_mapping() of irqchip core level, irq_find_host() can
      only return the 1st irq_domain attached the pinctrl dt device node as
      we can see from the codes:
      
      unsigned int irq_create_of_mapping(struct device_node *controller,
      				   const u32 *intspec, unsigned int intsize)
      {
      	struct irq_domain *domain;
      	...
      	domain = controller ? irq_find_host(controller) : irq_default_domain;
      }
      
      struct irq_domain *irq_find_host(struct device_node *node)
      {
      	struct irq_domain *h, *found = NULL;
      	int rc;
      
      	/* We might want to match the legacy controller last since
      	 * it might potentially be set to match all interrupts in
      	 * the absence of a device node. This isn't a problem so far
      	 * yet though...
      	 */
      	mutex_lock(&irq_domain_mutex);
      	list_for_each_entry(h, &irq_domain_list, link) {
      		if (h->ops->match)
      			rc = h->ops->match(h, node);
      		else
      			rc = (h->of_node != NULL) && (h->of_node == node);
      
      		if (rc) {
      			found = h;
      			break;
      		}
      	}
      	mutex_unlock(&irq_domain_mutex);
      	return found;
      }
      
      for sirfsoc, the 1st irq_domain attached to the device_node(controller) only
      can do linear for the 1st 32 gpios. so for devices who use gpio hwirq above
      32 and put the information in dt like:
                                      tangoc-ts@5c{
                                              compatible = "pixcir,tangoc-ts";
      +                                       interrupt-parent = <&gpio>;
      +                                       interrupts = <34 0>;
                                      };
      
      we will fail to get the virq for these devices as hwirq will be bigger than
      domain->revmap_data.linear.size in:
      unsigned int irq_linear_revmap(struct irq_domain *domain,
      			       irq_hw_number_t hwirq)
      {
      
      	/* Check revmap bounds; complain if exceeded */
      	if (WARN_ON(hwirq >= domain->revmap_data.linear.size))
      		return 0;
      
      	return domain->revmap_data.linear.revmap[hwirq];
      }
      
      this patch drops redundant irq_domain and keep only one to fix the problem.
      Signed-off-by: NBarry Song <Baohua.Song@csr.com>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      8daeffb0
  2. 08 10月, 2013 1 次提交
  3. 08 8月, 2013 1 次提交
    • J
      pinctrl: sirf: add missing __iomem annotation · 2c9fdcf1
      Jingoo Han 提交于
      Added missing __iomem annotation in order to fix the following
      sparse warnings:
      
      drivers/pinctrl/sirf/pinctrl-sirf.c:846:14: warning: incorrect type in assignment (different address spaces)
      drivers/pinctrl/sirf/pinctrl-sirf.c:846:14:    expected void *regs
      drivers/pinctrl/sirf/pinctrl-sirf.c:846:14:    got void [noderef] <asn:2>*
      drivers/pinctrl/sirf/pinctrl-sirf.c:869:33: warning: incorrect type in assignment (different address spaces)
      drivers/pinctrl/sirf/pinctrl-sirf.c:869:33:    expected void [noderef] <asn:2>*regs
      drivers/pinctrl/sirf/pinctrl-sirf.c:869:33:    got void *regs
      drivers/pinctrl/sirf/pinctrl-sirf.c:909:17: warning: incorrect type in argument 1 (different address spaces)
      drivers/pinctrl/sirf/pinctrl-sirf.c:909:17:    expected void volatile [noderef] <asn:2>*addr
      drivers/pinctrl/sirf/pinctrl-sirf.c:909:17:    got void *regs
      Signed-off-by: NJingoo Han <jg1.han@samsung.com>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      2c9fdcf1
  4. 23 7月, 2013 2 次提交
  5. 16 6月, 2013 2 次提交