Changeset 12443


Ignore:
Timestamp:
2008-08-31T13:32:26+02:00 (8 years ago)
Author:
florian
Message:

Fix divisor settings for external devices like wireless devices, thanks sn9

Location:
trunk/target/linux/ar7/files
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar7/files/drivers/vlynq/vlynq.c

    r10752 r12443  
    305305        struct vlynq_device_id *ids = vdrv->id_table; 
    306306        u32 id = 0; 
    307         int result; 
     307        int result, flag; 
    308308 
    309309        while (ids->id) { 
    310                 vdev->divisor = ids->divisor; 
    311                 result = __vlynq_enable_device(vdev); 
    312                 if (result == 0) { 
    313                         id = vlynq_reg_read(vdev->remote->chip); 
    314                         ops->off(vdev); 
    315                         if (ids->id == id) { 
    316                                 vlynq_set_drvdata(vdev, ids); 
    317                                 return 1; 
    318                         } 
     310                flag = 0; 
     311                if (ids->divisor != vlynq_div_auto 
     312                                && vdev->divisor == vlynq_div_auto) { 
     313                        flag = 1; 
     314                        vdev->divisor = ids->divisor; 
     315                        result = __vlynq_enable_device(vdev); 
     316                        if (result == 0) { 
     317                                id = vlynq_reg_read(vdev->remote->chip); 
     318                                vlynq_reg_write(vdev->local->control, 0); 
     319                                vlynq_reg_write(vdev->remote->control, 0); 
     320                                ops->off(vdev); 
     321                        } else 
     322                                id = vdev->dev_id; 
     323                } else 
     324                        id = vdev->dev_id; 
     325                if (ids->id == id) { 
     326                        vdev->dev_id = id; 
     327                        vlynq_set_drvdata(vdev, ids); 
     328                        printk(KERN_INFO "Driver found for VLYNQ " \ 
     329                                "device: %08x\n", id); 
     330                        return 1; 
    319331                } 
     332                printk(KERN_INFO "Not using the %08x VLYNQ device's " \ 
     333                        "driver for VLYNQ device: %08x\n", ids->id, id); 
    320334                ids++; 
     335                if (flag) 
     336                        vdev->divisor = vlynq_div_auto; 
    321337        } 
    322338        return 0; 
     
    603619               (void *)dev->mem_start); 
    604620 
     621        dev->divisor = vlynq_div_auto; 
     622        result = __vlynq_enable_device(dev); 
     623        if (result == 0) { 
     624                dev->dev_id = vlynq_reg_read(dev->remote->chip); 
     625                vlynq_reg_write(dev->local->control, 0); 
     626                vlynq_reg_write(dev->remote->control, 0); 
     627                ((struct plat_vlynq_ops *)(dev->dev.platform_data))->off(dev); 
     628        } else 
     629                dev->dev_id = 0; 
     630        if (dev->dev_id) 
     631                printk(KERN_INFO "Found a VLYNQ device: %08x\n", dev->dev_id); 
     632 
    605633        return 0; 
    606634 
     
    627655} 
    628656 
    629 static struct platform_driver vlynq_driver = { 
     657static struct platform_driver vlynq_platform_driver = { 
    630658        .driver.name = "vlynq", 
    631659        .probe = vlynq_probe, 
     
    649677                goto fail_bus; 
    650678 
    651         res = platform_driver_register(&vlynq_driver); 
     679        res = platform_driver_register(&vlynq_platform_driver); 
    652680        if (res) 
    653681                goto fail_platform; 
     
    663691static void __devexit vlynq_exit(void) 
    664692{ 
    665         platform_driver_unregister(&vlynq_driver); 
     693        platform_driver_unregister(&vlynq_platform_driver); 
    666694        bus_unregister(&vlynq_bus_type); 
    667695} 
  • trunk/target/linux/ar7/files/include/linux/vlynq.h

    r10709 r12443  
    6060struct vlynq_regs; 
    6161struct vlynq_device { 
    62         u32 id; 
     62        u32 id, dev_id; 
    6363        int local_irq; 
    6464        int remote_irq; 
Note: See TracChangeset for help on using the changeset viewer.