注册mt_usb驱动
kernel-3.18/drivers/misc/mediatek/usb20/mt6735/usb20.c
static int __init usb20_init(void)
{
......
platform_driver_register(&mt_usb_driver); //注册mt_usb驱动
return platform_driver_register(&mt_usb_dts_driver); //根据设备节点,注册mt_usb设备
}
mt_usb_driver定义如下
static struct platform_driver mt_usb_driver = {
.remove = mt_usb_remove,
.probe = mt_usb_probe,
.driver = {
.name = "mt_usb",
},
};
对应的platform_device如下
static struct platform_device mt_usb_device = {
.name = "mt_usb",
.id = -1,
};
mt_usb_probe负责初始化mt_usb设备,mt_usb_probe在mt_usb设备注册时会通过设备模型被调用
mt_usb设备在哪里注册
在usb20_init函数中mt_usb驱动注册之后,紧接着又注册了mt_usb_dts驱动
static struct platform_driver mt_usb_dts_driver = {
.remove = mt_usb_dts_remove,
.probe = mt_usb_dts_probe,
.driver = {
.name = "mt_dts_usb",
#ifdef CONFIG_OF
.of_match_table = apusb_of_ids,
#endif
},
};
当系统启动之后,解析设备树,当满足apusb_of_ids时候就会调用mt_usb_dts_probe函数
static int mt_usb_dts_probe(struct platform_device *pdev)
{
......
mt_usb_device.dev.of_node = pdev->dev.of_node;
retval = platform_device_register(&mt_usb_device);
......
}
mt_usb_dts_probe中注册了mt_usb设备
#ifdef CONFIG_OF
static const struct of_device_id apusb_of_ids[] = {
{.compatible = "mediatek,mt6735-usb20",},
{},
};
static struct platform_device mt_usb_device = {
.name = "mt_usb",
.id = -1,
};
#endif
触发mt_usb_dts_probe函数被调用的设备节点如下
usb0:usb20@11200000 {
compatible = "mediatek,mt6735-usb20";
cell-index = <0>;
reg = <0x11200000 0x10000>,
<0x11210000 0x10000>;
interrupts = <0 72 0x8>;
mode = <2>;
multipoint = <1>;
dyn_fifo = <1>;
soft_con = <1>;
dma = <1>;
num_eps = <16>;
dma_channels = <8>;
clocks = <&perisys PERI_USB0>;
clock-names = "usb0";
VUSB33-supply = <&mt_pmic_vusb33_ldo_reg>;
iddig_gpio = <0 1>;
drvvbus_gpio = <83 2>;
};
初始化mt_usb设备
mt_usb_dts_probe函数中调用platform_device_register(&mt_usb_device); 根据Linux设备模型,此处会match到mt_usb_driver,调用mt_usb_probe函数
static int mt_usb_probe(struct platform_device *pdev)
{
musb_hdrc_platform_data有三种角色[MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG]
struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
struct platform_device *musb;
struct mt_usb_glue *glue;
#ifdef CONFIG_OF
struct musb_hdrc_config *config;
struct device_node *np = pdev->dev.of_node;
#endif
......
musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
if (!musb) {
dev_err(&pdev->dev, "failed to allocate musb device\n");
goto err1;
}
//初始化musb和pdata
pdata->config = config;
musb->dev.parent = &pdev->dev;
musb->dev.dma_mask = &mt_usb_dmamask;
musb->dev.coherent_dma_mask = mt_usb_dmamask;
......
pdata->platform_ops = &mt_usb_ops;
platform_set_drvdata(pdev, glue);
ret = platform_device_add_resources(musb, pdev->resource, pdev->num_resources);
if (ret) {
dev_err(&pdev->dev, "failed to add resources\n");
goto err2;
}
ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
if (ret) {
dev_err(&pdev->dev, "failed to add platform_data\n");
goto err2;
}
ret = platform_device_add(musb);
//创建各种节点
}
sta