Skip to content

Commit

Permalink
usb: add clock support to r8a66597 gadget driver
Browse files Browse the repository at this point in the history
Add support for the clock framework to the r8a66597 gadget driver.
This is needed to control the clock driving the USB block.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Magnus Damm authored and Paul Mundt committed Aug 20, 2009
1 parent c414424 commit d2e27bd
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 3 deletions.
37 changes: 34 additions & 3 deletions drivers/usb/gadget/r8a66597-udc.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/platform_device.h>
#include <linux/clk.h>

#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
Expand Down Expand Up @@ -1475,6 +1476,12 @@ static int __exit r8a66597_remove(struct platform_device *pdev)
iounmap((void *)r8a66597->reg);
free_irq(platform_get_irq(pdev, 0), r8a66597);
r8a66597_free_request(&r8a66597->ep[0].ep, r8a66597->ep0_req);
#ifdef CONFIG_HAVE_CLK
if (r8a66597->pdata->on_chip) {
clk_disable(r8a66597->clk);
clk_put(r8a66597->clk);
}
#endif
kfree(r8a66597);
return 0;
}
Expand All @@ -1485,6 +1492,9 @@ static void nop_completion(struct usb_ep *ep, struct usb_request *r)

static int __init r8a66597_probe(struct platform_device *pdev)
{
#ifdef CONFIG_HAVE_CLK
char clk_name[8];
#endif
struct resource *res, *ires;
int irq;
void __iomem *reg = NULL;
Expand Down Expand Up @@ -1545,13 +1555,27 @@ static int __init r8a66597_probe(struct platform_device *pdev)

r8a66597->bi_bufnum = R8A66597_BASE_BUFNUM;

#ifdef CONFIG_HAVE_CLK
if (r8a66597->pdata->on_chip) {
snprintf(clk_name, sizeof(clk_name), "usb%d", pdev->id);
r8a66597->clk = clk_get(&pdev->dev, clk_name);
if (IS_ERR(r8a66597->clk)) {
dev_err(&pdev->dev, "cannot get clock \"%s\"\n",
clk_name);
ret = PTR_ERR(r8a66597->clk);
goto clean_up;
}
clk_enable(r8a66597->clk);
}
#endif

disable_controller(r8a66597); /* make sure controller is disabled */

ret = request_irq(irq, r8a66597_irq, IRQF_DISABLED | IRQF_SHARED,
udc_name, r8a66597);
if (ret < 0) {
printk(KERN_ERR "request_irq error (%d)\n", ret);
goto clean_up;
goto clean_up2;
}

INIT_LIST_HEAD(&r8a66597->gadget.ep_list);
Expand Down Expand Up @@ -1586,16 +1610,23 @@ static int __init r8a66597_probe(struct platform_device *pdev)
r8a66597->ep0_req = r8a66597_alloc_request(&r8a66597->ep[0].ep,
GFP_KERNEL);
if (r8a66597->ep0_req == NULL)
goto clean_up2;
goto clean_up3;
r8a66597->ep0_req->complete = nop_completion;

init_controller(r8a66597);

dev_info(&pdev->dev, "version %s\n", DRIVER_VERSION);
return 0;

clean_up2:
clean_up3:
free_irq(irq, r8a66597);
clean_up2:
#ifdef CONFIG_HAVE_CLK
if (r8a66597->pdata->on_chip) {
clk_disable(r8a66597->clk);
clk_put(r8a66597->clk);
}
#endif
clean_up:
if (r8a66597) {
if (r8a66597->ep0_req)
Expand Down
7 changes: 7 additions & 0 deletions drivers/usb/gadget/r8a66597-udc.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
#ifndef __R8A66597_H__
#define __R8A66597_H__

#ifdef CONFIG_HAVE_CLK
#include <linux/clk.h>
#endif

#include <linux/usb/r8a66597.h>

#define R8A66597_MAX_SAMPLING 10
Expand Down Expand Up @@ -88,6 +92,9 @@ struct r8a66597 {
spinlock_t lock;
unsigned long reg;

#ifdef CONFIG_HAVE_CLK
struct clk *clk;
#endif
struct r8a66597_platdata *pdata;

struct usb_gadget gadget;
Expand Down

0 comments on commit d2e27bd

Please sign in to comment.