mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	Thank you Peter Wagner for the patch. I refreshed the kernel patches and added the md5sum of the kernel. SVN-Revision: 26905
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/drivers/cbus/tahvo-usb.c
 | |
| +++ b/drivers/cbus/tahvo-usb.c
 | |
| @@ -98,6 +98,7 @@ struct tahvo_usb {
 | |
|  #ifdef CONFIG_USB_OTG
 | |
|  	int tahvo_mode;
 | |
|  #endif
 | |
| +	struct clk *ick;
 | |
|  };
 | |
|  static struct tahvo_usb *tahvo_usb_device;
 | |
|  
 | |
| @@ -673,6 +674,14 @@ static int __init tahvo_usb_probe(struct
 | |
|  	INIT_WORK(&tu->irq_work, tahvo_usb_irq_work);
 | |
|  	mutex_init(&tu->serialize);
 | |
|  
 | |
| +	tu->ick = clk_get(NULL, "usb_l4_ick");
 | |
| +	if (IS_ERR(tu->ick)) {
 | |
| +		dev_err(dev, "Failed to get usb_l4_ick\n");
 | |
| +		ret = PTR_ERR(tu->ick);
 | |
| +		goto err_free_tu;
 | |
| +	}
 | |
| +	clk_enable(tu->ick);
 | |
| +
 | |
|  	/* Set initial state, so that we generate kevents only on
 | |
|  	 * state changes */
 | |
|  	tu->vbus_state = tahvo_read_reg(TAHVO_REG_IDSR) & 0x01;
 | |
| @@ -681,10 +690,8 @@ static int __init tahvo_usb_probe(struct
 | |
|  	ret = tahvo_request_irq(TAHVO_INT_VBUSON, tahvo_usb_vbus_interrupt,
 | |
|  				(unsigned long) tu, "vbus_interrupt");
 | |
|  	if (ret != 0) {
 | |
| -		kfree(tu);
 | |
| -		tahvo_usb_device = NULL;
 | |
|  		printk(KERN_ERR "Could not register Tahvo interrupt for VBUS\n");
 | |
| -		return ret;
 | |
| +		goto err_release_clk;
 | |
|  	}
 | |
|  
 | |
|  	/* Attributes */
 | |
| @@ -709,10 +716,7 @@ static int __init tahvo_usb_probe(struct
 | |
|  	ret = otg_set_transceiver(&tu->otg);
 | |
|  	if (ret < 0) {
 | |
|  		printk(KERN_ERR "Cannot register USB transceiver\n");
 | |
| -		tahvo_usb_device = NULL;
 | |
| -		kfree(tu);
 | |
| -		tahvo_free_irq(TAHVO_INT_VBUSON);
 | |
| -		return ret;
 | |
| +		goto err_free_irq;
 | |
|  	}
 | |
|  
 | |
|  	dev_set_drvdata(dev, tu);
 | |
| @@ -721,6 +725,17 @@ static int __init tahvo_usb_probe(struct
 | |
|  	 * may not be generated in addition to this. */
 | |
|  	schedule_work(&tu->irq_work);
 | |
|  	return 0;
 | |
| +
 | |
| +err_free_irq:
 | |
| +	tahvo_free_irq(TAHVO_INT_VBUSON);
 | |
| +err_release_clk:
 | |
| +	clk_disable(tu->ick);
 | |
| +	clk_put(tu->ick);
 | |
| +err_free_tu:
 | |
| +	kfree(tu);
 | |
| +	tahvo_usb_device = NULL;
 | |
| +
 | |
| +	return ret;
 | |
|  }
 | |
|  
 | |
|  static int __exit tahvo_usb_remove(struct platform_device *pdev)
 | |
| @@ -736,6 +751,8 @@ static int __exit tahvo_usb_remove(struc
 | |
|  #ifdef CONFIG_USB_OTG
 | |
|  	device_remove_file(&pdev->dev, &dev_attr_otg_mode);
 | |
|  #endif
 | |
| +	clk_disable(tu->ick);
 | |
| +	clk_put(tu->ick);
 | |
|  
 | |
|  	kfree(tu);
 | |
|  	tahvo_usb_device = NULL;
 |