create branch for barrier breaker (from trunk r41863)
[14.07/openwrt.git] / target / linux / ar71xx / patches-3.10 / 451-gpio-74x164-improve-platform-device-support.patch
1 --- a/drivers/gpio/gpio-74x164.c
2 +++ b/drivers/gpio/gpio-74x164.c
3 @@ -109,10 +109,14 @@ static int gen_74x164_probe(struct spi_d
4  {
5         struct gen_74x164_chip *chip;
6         struct gen_74x164_chip_platform_data *pdata;
7 +       struct device_node *np;
8         int ret;
9  
10 -       if (!spi->dev.of_node) {
11 -               dev_err(&spi->dev, "No device tree data available.\n");
12 +       pdata = spi->dev.platform_data;
13 +       np = spi->dev.of_node;
14 +
15 +       if (!np && !pdata) {
16 +               dev_err(&spi->dev, "No configuration data available.\n");
17                 return -EINVAL;
18         }
19  
20 @@ -129,7 +133,6 @@ static int gen_74x164_probe(struct spi_d
21         if (!chip)
22                 return -ENOMEM;
23  
24 -       pdata = spi->dev.platform_data;
25         if (pdata && pdata->base)
26                 chip->gpio_chip.base = pdata->base;
27         else
28 @@ -146,12 +149,19 @@ static int gen_74x164_probe(struct spi_d
29         chip->gpio_chip.get = gen_74x164_get_value;
30         chip->gpio_chip.set = gen_74x164_set_value;
31  
32 -       if (of_property_read_u32(spi->dev.of_node, "registers-number", &chip->registers)) {
33 -               dev_err(&spi->dev, "Missing registers-number property in the DT.\n");
34 -               ret = -EINVAL;
35 -               goto exit_destroy;
36 +       if (np) {
37 +               if (of_property_read_u32(spi->dev.of_node, "registers-number", &chip->registers)) {
38 +                       dev_err(&spi->dev, "Missing registers-number property in the DT.\n");
39 +                       ret = -EINVAL;
40 +                       goto exit_destroy;
41 +               }
42 +       } else if (pdata) {
43 +               chip->registers = pdata->num_registers;
44         }
45  
46 +       if (!chip->registers)
47 +               chip->registers = 1;
48 +
49         chip->gpio_chip.ngpio = GEN_74X164_NUMBER_GPIOS * chip->registers;
50         chip->buffer = devm_kzalloc(&spi->dev, chip->registers, GFP_KERNEL);
51         if (!chip->buffer) {
52 @@ -159,6 +169,9 @@ static int gen_74x164_probe(struct spi_d
53                 goto exit_destroy;
54         }
55  
56 +       if (pdata && pdata->init_data)
57 +               memcpy(chip->buffer, pdata->init_data, chip->registers);
58 +
59         chip->gpio_chip.can_sleep = 1;
60         chip->gpio_chip.dev = &spi->dev;
61         chip->gpio_chip.owner = THIS_MODULE;
62 --- a/include/linux/spi/74x164.h
63 +++ b/include/linux/spi/74x164.h
64 @@ -4,6 +4,10 @@
65  struct gen_74x164_chip_platform_data {
66         /* number assigned to the first GPIO */
67         unsigned        base;
68 +       /* number of chained registers */
69 +       unsigned        num_registers;
70 +       /* address of a buffer containing initial data */
71 +       u8              *init_data;
72  };
73  
74  #endif