| .. | .. |
|---|
| 118 | 118 | } |
|---|
| 119 | 119 | } |
|---|
| 120 | 120 | |
|---|
| 121 | | -int htc_egpio_get_wakeup_irq(struct device *dev) |
|---|
| 122 | | -{ |
|---|
| 123 | | - struct egpio_info *ei = dev_get_drvdata(dev); |
|---|
| 124 | | - |
|---|
| 125 | | - /* Read current pins. */ |
|---|
| 126 | | - u16 readval = egpio_readw(ei, ei->ack_register); |
|---|
| 127 | | - /* Ack/unmask interrupts. */ |
|---|
| 128 | | - ack_irqs(ei); |
|---|
| 129 | | - /* Return first set pin. */ |
|---|
| 130 | | - readval &= ei->irqs_enabled; |
|---|
| 131 | | - return ei->irq_start + ffs(readval) - 1; |
|---|
| 132 | | -} |
|---|
| 133 | | -EXPORT_SYMBOL(htc_egpio_get_wakeup_irq); |
|---|
| 134 | | - |
|---|
| 135 | 121 | static inline int egpio_pos(struct egpio_info *ei, int bit) |
|---|
| 136 | 122 | { |
|---|
| 137 | 123 | return bit >> ei->reg_shift; |
|---|
| .. | .. |
|---|
| 189 | 175 | unsigned long flag; |
|---|
| 190 | 176 | struct egpio_chip *egpio; |
|---|
| 191 | 177 | struct egpio_info *ei; |
|---|
| 192 | | - unsigned bit; |
|---|
| 193 | 178 | int pos; |
|---|
| 194 | 179 | int reg; |
|---|
| 195 | 180 | int shift; |
|---|
| .. | .. |
|---|
| 199 | 184 | |
|---|
| 200 | 185 | egpio = gpiochip_get_data(chip); |
|---|
| 201 | 186 | ei = dev_get_drvdata(egpio->dev); |
|---|
| 202 | | - bit = egpio_bit(ei, offset); |
|---|
| 203 | 187 | pos = egpio_pos(ei, offset); |
|---|
| 204 | 188 | reg = egpio->reg_start + pos; |
|---|
| 205 | 189 | shift = pos << ei->reg_shift; |
|---|
| .. | .. |
|---|
| 236 | 220 | |
|---|
| 237 | 221 | egpio = gpiochip_get_data(chip); |
|---|
| 238 | 222 | |
|---|
| 239 | | - return !test_bit(offset, &egpio->is_out); |
|---|
| 223 | + if (test_bit(offset, &egpio->is_out)) |
|---|
| 224 | + return GPIO_LINE_DIRECTION_OUT; |
|---|
| 225 | + |
|---|
| 226 | + return GPIO_LINE_DIRECTION_IN; |
|---|
| 240 | 227 | } |
|---|
| 241 | 228 | |
|---|
| 242 | 229 | static void egpio_write_cache(struct egpio_info *ei) |
|---|
| .. | .. |
|---|
| 281 | 268 | struct gpio_chip *chip; |
|---|
| 282 | 269 | unsigned int irq, irq_end; |
|---|
| 283 | 270 | int i; |
|---|
| 284 | | - int ret; |
|---|
| 285 | 271 | |
|---|
| 286 | 272 | /* Initialize ei data structure. */ |
|---|
| 287 | 273 | ei = devm_kzalloc(&pdev->dev, sizeof(*ei), GFP_KERNEL); |
|---|
| .. | .. |
|---|
| 291 | 277 | spin_lock_init(&ei->lock); |
|---|
| 292 | 278 | |
|---|
| 293 | 279 | /* Find chained irq */ |
|---|
| 294 | | - ret = -EINVAL; |
|---|
| 295 | 280 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
|---|
| 296 | 281 | if (res) |
|---|
| 297 | 282 | ei->chained_irq = res->start; |
|---|
| 298 | 283 | |
|---|
| 299 | 284 | /* Map egpio chip into virtual address space. */ |
|---|
| 300 | | - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 301 | | - if (!res) |
|---|
| 302 | | - goto fail; |
|---|
| 303 | | - ei->base_addr = devm_ioremap_nocache(&pdev->dev, res->start, |
|---|
| 304 | | - resource_size(res)); |
|---|
| 305 | | - if (!ei->base_addr) |
|---|
| 306 | | - goto fail; |
|---|
| 307 | | - pr_debug("EGPIO phys=%08x virt=%p\n", (u32)res->start, ei->base_addr); |
|---|
| 285 | + ei->base_addr = devm_platform_ioremap_resource(pdev, 0); |
|---|
| 286 | + if (IS_ERR(ei->base_addr)) |
|---|
| 287 | + return PTR_ERR(ei->base_addr); |
|---|
| 308 | 288 | |
|---|
| 309 | 289 | if ((pdata->bus_width != 16) && (pdata->bus_width != 32)) |
|---|
| 310 | | - goto fail; |
|---|
| 290 | + return -EINVAL; |
|---|
| 291 | + |
|---|
| 311 | 292 | ei->bus_shift = fls(pdata->bus_width - 1) - 3; |
|---|
| 312 | 293 | pr_debug("bus_shift = %d\n", ei->bus_shift); |
|---|
| 313 | 294 | |
|---|
| 314 | 295 | if ((pdata->reg_width != 8) && (pdata->reg_width != 16)) |
|---|
| 315 | | - goto fail; |
|---|
| 296 | + return -EINVAL; |
|---|
| 297 | + |
|---|
| 316 | 298 | ei->reg_shift = fls(pdata->reg_width - 1); |
|---|
| 317 | 299 | pr_debug("reg_shift = %d\n", ei->reg_shift); |
|---|
| 318 | 300 | |
|---|
| .. | .. |
|---|
| 324 | 306 | ei->chip = devm_kcalloc(&pdev->dev, |
|---|
| 325 | 307 | ei->nchips, sizeof(struct egpio_chip), |
|---|
| 326 | 308 | GFP_KERNEL); |
|---|
| 327 | | - if (!ei->chip) { |
|---|
| 328 | | - ret = -ENOMEM; |
|---|
| 329 | | - goto fail; |
|---|
| 330 | | - } |
|---|
| 309 | + if (!ei->chip) |
|---|
| 310 | + return -ENOMEM; |
|---|
| 311 | + |
|---|
| 331 | 312 | for (i = 0; i < ei->nchips; i++) { |
|---|
| 332 | 313 | ei->chip[i].reg_start = pdata->chip[i].reg_start; |
|---|
| 333 | 314 | ei->chip[i].cached_values = pdata->chip[i].initial_values; |
|---|
| 334 | 315 | ei->chip[i].is_out = pdata->chip[i].direction; |
|---|
| 335 | 316 | ei->chip[i].dev = &(pdev->dev); |
|---|
| 336 | 317 | chip = &(ei->chip[i].chip); |
|---|
| 337 | | - chip->label = "htc-egpio"; |
|---|
| 318 | + chip->label = devm_kasprintf(&pdev->dev, GFP_KERNEL, |
|---|
| 319 | + "htc-egpio-%d", |
|---|
| 320 | + i); |
|---|
| 321 | + if (!chip->label) |
|---|
| 322 | + return -ENOMEM; |
|---|
| 323 | + |
|---|
| 338 | 324 | chip->parent = &pdev->dev; |
|---|
| 339 | 325 | chip->owner = THIS_MODULE; |
|---|
| 340 | 326 | chip->get = egpio_get; |
|---|
| .. | .. |
|---|
| 376 | 362 | } |
|---|
| 377 | 363 | |
|---|
| 378 | 364 | return 0; |
|---|
| 379 | | - |
|---|
| 380 | | -fail: |
|---|
| 381 | | - printk(KERN_ERR "EGPIO failed to setup\n"); |
|---|
| 382 | | - return ret; |
|---|
| 383 | 365 | } |
|---|
| 384 | 366 | |
|---|
| 385 | 367 | #ifdef CONFIG_PM |
|---|