Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpio: sx150x: Add support for sx1502

Signed-off-by: Peter Rosin <peda@axentia.se>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Peter Rosin and committed by
Linus Walleij
50e8df09 9ae48210

+51 -5
+2 -1
Documentation/devicetree/bindings/gpio/gpio-sx150x.txt
··· 5 5 6 6 - compatible: should be "semtech,sx1506q", 7 7 "semtech,sx1508q", 8 - "semtech,sx1509q". 8 + "semtech,sx1509q", 9 + "semtech,sx1502q". 9 10 10 11 - reg: The I2C slave address for this device. 11 12
+49 -4
drivers/gpio/gpio-sx150x.c
··· 32 32 #define NO_UPDATE_PENDING -1 33 33 34 34 /* The chip models of sx150x */ 35 - #define SX150X_456 0 36 - #define SX150X_789 1 35 + #define SX150X_123 0 36 + #define SX150X_456 1 37 + #define SX150X_789 2 38 + 39 + struct sx150x_123_pri { 40 + u8 reg_pld_mode; 41 + u8 reg_pld_table0; 42 + u8 reg_pld_table1; 43 + u8 reg_pld_table2; 44 + u8 reg_pld_table3; 45 + u8 reg_pld_table4; 46 + u8 reg_advance; 47 + }; 37 48 38 49 struct sx150x_456_pri { 39 50 u8 reg_pld_mode; ··· 76 65 u8 reg_sense; 77 66 u8 ngpios; 78 67 union { 68 + struct sx150x_123_pri x123; 79 69 struct sx150x_456_pri x456; 80 70 struct sx150x_789_pri x789; 81 71 } pri; ··· 154 142 }, 155 143 .ngpios = 16 156 144 }, 145 + [3] = { /* sx1502q */ 146 + .model = SX150X_123, 147 + .reg_pullup = 0x02, 148 + .reg_pulldn = 0x03, 149 + .reg_dir = 0x01, 150 + .reg_data = 0x00, 151 + .reg_irq_mask = 0x05, 152 + .reg_irq_src = 0x08, 153 + .reg_sense = 0x07, 154 + .pri.x123 = { 155 + .reg_pld_mode = 0x10, 156 + .reg_pld_table0 = 0x11, 157 + .reg_pld_table1 = 0x12, 158 + .reg_pld_table2 = 0x13, 159 + .reg_pld_table3 = 0x14, 160 + .reg_pld_table4 = 0x15, 161 + .reg_advance = 0xad, 162 + }, 163 + .ngpios = 8, 164 + }, 157 165 }; 158 166 159 167 static const struct i2c_device_id sx150x_id[] = { 160 168 {"sx1508q", 0}, 161 169 {"sx1509q", 1}, 162 170 {"sx1506q", 2}, 171 + {"sx1502q", 3}, 163 172 {} 164 173 }; 165 174 MODULE_DEVICE_TABLE(i2c, sx150x_id); ··· 189 156 { .compatible = "semtech,sx1508q" }, 190 157 { .compatible = "semtech,sx1509q" }, 191 158 { .compatible = "semtech,sx1506q" }, 159 + { .compatible = "semtech,sx1502q" }, 192 160 {}, 193 161 }; 194 162 MODULE_DEVICE_TABLE(of, sx150x_of_match); ··· 579 545 err = sx150x_i2c_write(chip->client, 580 546 chip->dev_cfg->pri.x789.reg_misc, 581 547 0x01); 582 - else 548 + else if (chip->dev_cfg->model == SX150X_456) 583 549 err = sx150x_i2c_write(chip->client, 584 550 chip->dev_cfg->pri.x456.reg_advance, 585 551 0x04); 552 + else 553 + err = sx150x_i2c_write(chip->client, 554 + chip->dev_cfg->pri.x123.reg_advance, 555 + 0x00); 586 556 if (err < 0) 587 557 return err; 588 558 ··· 612 574 pdata->io_polarity); 613 575 if (err < 0) 614 576 return err; 615 - } else { 577 + } else if (chip->dev_cfg->model == SX150X_456) { 616 578 /* Set all pins to work in normal mode */ 617 579 err = sx150x_init_io(chip, 618 580 chip->dev_cfg->pri.x456.reg_pld_mode, 581 + 0); 582 + if (err < 0) 583 + return err; 584 + } else { 585 + /* Set all pins to work in normal mode */ 586 + err = sx150x_init_io(chip, 587 + chip->dev_cfg->pri.x123.reg_pld_mode, 619 588 0); 620 589 if (err < 0) 621 590 return err;