⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsl_soc.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
#ifdef CONFIG_PPC_83xxstatic int __init mpc83xx_wdt_init(void){	struct resource r;	struct device_node *soc, *np;	struct platform_device *dev;	const unsigned int *freq;	int ret;	np = of_find_compatible_node(NULL, "watchdog", "mpc83xx_wdt");	if (!np) {		ret = -ENODEV;		goto nodev;	}	soc = of_find_node_by_type(NULL, "soc");	if (!soc) {		ret = -ENODEV;		goto nosoc;	}	freq = of_get_property(soc, "bus-frequency", NULL);	if (!freq) {		ret = -ENODEV;		goto err;	}	memset(&r, 0, sizeof(r));	ret = of_address_to_resource(np, 0, &r);	if (ret)		goto err;	dev = platform_device_register_simple("mpc83xx_wdt", 0, &r, 1);	if (IS_ERR(dev)) {		ret = PTR_ERR(dev);		goto err;	}	ret = platform_device_add_data(dev, freq, sizeof(int));	if (ret)		goto unreg;	of_node_put(soc);	of_node_put(np);	return 0;unreg:	platform_device_unregister(dev);err:	of_node_put(soc);nosoc:	of_node_put(np);nodev:	return ret;}arch_initcall(mpc83xx_wdt_init);#endifstatic enum fsl_usb2_phy_modes determine_usb_phy(const char *phy_type){	if (!phy_type)		return FSL_USB2_PHY_NONE;	if (!strcasecmp(phy_type, "ulpi"))		return FSL_USB2_PHY_ULPI;	if (!strcasecmp(phy_type, "utmi"))		return FSL_USB2_PHY_UTMI;	if (!strcasecmp(phy_type, "utmi_wide"))		return FSL_USB2_PHY_UTMI_WIDE;	if (!strcasecmp(phy_type, "serial"))		return FSL_USB2_PHY_SERIAL;	return FSL_USB2_PHY_NONE;}static int __init fsl_usb_of_init(void){	struct device_node *np;	unsigned int i;	struct platform_device *usb_dev_mph = NULL, *usb_dev_dr_host = NULL,		*usb_dev_dr_client = NULL;	int ret;	for (np = NULL, i = 0;	     (np = of_find_compatible_node(np, "usb", "fsl-usb2-mph")) != NULL;	     i++) {		struct resource r[2];		struct fsl_usb2_platform_data usb_data;		const unsigned char *prop = NULL;		memset(&r, 0, sizeof(r));		memset(&usb_data, 0, sizeof(usb_data));		ret = of_address_to_resource(np, 0, &r[0]);		if (ret)			goto err;		of_irq_to_resource(np, 0, &r[1]);		usb_dev_mph =		    platform_device_register_simple("fsl-ehci", i, r, 2);		if (IS_ERR(usb_dev_mph)) {			ret = PTR_ERR(usb_dev_mph);			goto err;		}		usb_dev_mph->dev.coherent_dma_mask = 0xffffffffUL;		usb_dev_mph->dev.dma_mask = &usb_dev_mph->dev.coherent_dma_mask;		usb_data.operating_mode = FSL_USB2_MPH_HOST;		prop = of_get_property(np, "port0", NULL);		if (prop)			usb_data.port_enables |= FSL_USB2_PORT0_ENABLED;		prop = of_get_property(np, "port1", NULL);		if (prop)			usb_data.port_enables |= FSL_USB2_PORT1_ENABLED;		prop = of_get_property(np, "phy_type", NULL);		usb_data.phy_mode = determine_usb_phy(prop);		ret =		    platform_device_add_data(usb_dev_mph, &usb_data,					     sizeof(struct						    fsl_usb2_platform_data));		if (ret)			goto unreg_mph;	}	for (np = NULL;	     (np = of_find_compatible_node(np, "usb", "fsl-usb2-dr")) != NULL;	     i++) {		struct resource r[2];		struct fsl_usb2_platform_data usb_data;		const unsigned char *prop = NULL;		memset(&r, 0, sizeof(r));		memset(&usb_data, 0, sizeof(usb_data));		ret = of_address_to_resource(np, 0, &r[0]);		if (ret)			goto unreg_mph;		of_irq_to_resource(np, 0, &r[1]);		prop = of_get_property(np, "dr_mode", NULL);		if (!prop || !strcmp(prop, "host")) {			usb_data.operating_mode = FSL_USB2_DR_HOST;			usb_dev_dr_host = platform_device_register_simple(					"fsl-ehci", i, r, 2);			if (IS_ERR(usb_dev_dr_host)) {				ret = PTR_ERR(usb_dev_dr_host);				goto err;			}		} else if (prop && !strcmp(prop, "peripheral")) {			usb_data.operating_mode = FSL_USB2_DR_DEVICE;			usb_dev_dr_client = platform_device_register_simple(					"fsl-usb2-udc", i, r, 2);			if (IS_ERR(usb_dev_dr_client)) {				ret = PTR_ERR(usb_dev_dr_client);				goto err;			}		} else if (prop && !strcmp(prop, "otg")) {			usb_data.operating_mode = FSL_USB2_DR_OTG;			usb_dev_dr_host = platform_device_register_simple(					"fsl-ehci", i, r, 2);			if (IS_ERR(usb_dev_dr_host)) {				ret = PTR_ERR(usb_dev_dr_host);				goto err;			}			usb_dev_dr_client = platform_device_register_simple(					"fsl-usb2-udc", i, r, 2);			if (IS_ERR(usb_dev_dr_client)) {				ret = PTR_ERR(usb_dev_dr_client);				goto err;			}		} else {			ret = -EINVAL;			goto err;		}		prop = of_get_property(np, "phy_type", NULL);		usb_data.phy_mode = determine_usb_phy(prop);		if (usb_dev_dr_host) {			usb_dev_dr_host->dev.coherent_dma_mask = 0xffffffffUL;			usb_dev_dr_host->dev.dma_mask = &usb_dev_dr_host->				dev.coherent_dma_mask;			if ((ret = platform_device_add_data(usb_dev_dr_host,						&usb_data, sizeof(struct						fsl_usb2_platform_data))))				goto unreg_dr;		}		if (usb_dev_dr_client) {			usb_dev_dr_client->dev.coherent_dma_mask = 0xffffffffUL;			usb_dev_dr_client->dev.dma_mask = &usb_dev_dr_client->				dev.coherent_dma_mask;			if ((ret = platform_device_add_data(usb_dev_dr_client,						&usb_data, sizeof(struct						fsl_usb2_platform_data))))				goto unreg_dr;		}	}	return 0;unreg_dr:	if (usb_dev_dr_host)		platform_device_unregister(usb_dev_dr_host);	if (usb_dev_dr_client)		platform_device_unregister(usb_dev_dr_client);unreg_mph:	if (usb_dev_mph)		platform_device_unregister(usb_dev_mph);err:	return ret;}arch_initcall(fsl_usb_of_init);#ifndef CONFIG_PPC_CPM_NEW_BINDING#ifdef CONFIG_CPM2extern void init_scc_ioports(struct fs_uart_platform_info*);static const char fcc_regs[] = "fcc_regs";static const char fcc_regs_c[] = "fcc_regs_c";static const char fcc_pram[] = "fcc_pram";static char bus_id[9][BUS_ID_SIZE];static int __init fs_enet_of_init(void){	struct device_node *np;	unsigned int i;	struct platform_device *fs_enet_dev;	struct resource res;	int ret;	for (np = NULL, i = 0;	     (np = of_find_compatible_node(np, "network", "fs_enet")) != NULL;	     i++) {		struct resource r[4];		struct device_node *phy, *mdio;		struct fs_platform_info fs_enet_data;		const unsigned int *id, *phy_addr, *phy_irq;		const void *mac_addr;		const phandle *ph;		const char *model;		memset(r, 0, sizeof(r));		memset(&fs_enet_data, 0, sizeof(fs_enet_data));		ret = of_address_to_resource(np, 0, &r[0]);		if (ret)			goto err;		r[0].name = fcc_regs;		ret = of_address_to_resource(np, 1, &r[1]);		if (ret)			goto err;		r[1].name = fcc_pram;		ret = of_address_to_resource(np, 2, &r[2]);		if (ret)			goto err;		r[2].name = fcc_regs_c;		fs_enet_data.fcc_regs_c = r[2].start;		of_irq_to_resource(np, 0, &r[3]);		fs_enet_dev =		    platform_device_register_simple("fsl-cpm-fcc", i, &r[0], 4);		if (IS_ERR(fs_enet_dev)) {			ret = PTR_ERR(fs_enet_dev);			goto err;		}		model = of_get_property(np, "model", NULL);		if (model == NULL) {			ret = -ENODEV;			goto unreg;		}		mac_addr = of_get_mac_address(np);		if (mac_addr)			memcpy(fs_enet_data.macaddr, mac_addr, 6);		ph = of_get_property(np, "phy-handle", NULL);		phy = of_find_node_by_phandle(*ph);		if (phy == NULL) {			ret = -ENODEV;			goto unreg;		}		phy_addr = of_get_property(phy, "reg", NULL);		fs_enet_data.phy_addr = *phy_addr;		phy_irq = of_get_property(phy, "interrupts", NULL);		id = of_get_property(np, "device-id", NULL);		fs_enet_data.fs_no = *id;		strcpy(fs_enet_data.fs_type, model);		mdio = of_get_parent(phy);                ret = of_address_to_resource(mdio, 0, &res);                if (ret) {                        of_node_put(phy);                        of_node_put(mdio);                        goto unreg;                }		fs_enet_data.clk_rx = *((u32 *)of_get_property(np,						"rx-clock", NULL));		fs_enet_data.clk_tx = *((u32 *)of_get_property(np,						"tx-clock", NULL));		if (strstr(model, "FCC")) {			int fcc_index = *id - 1;			const unsigned char *mdio_bb_prop;			fs_enet_data.dpram_offset = (u32)cpm_dpram_addr(0);			fs_enet_data.rx_ring = 32;			fs_enet_data.tx_ring = 32;			fs_enet_data.rx_copybreak = 240;			fs_enet_data.use_napi = 0;			fs_enet_data.napi_weight = 17;			fs_enet_data.mem_offset = FCC_MEM_OFFSET(fcc_index);			fs_enet_data.cp_page = CPM_CR_FCC_PAGE(fcc_index);			fs_enet_data.cp_block = CPM_CR_FCC_SBLOCK(fcc_index);			snprintf((char*)&bus_id[(*id)], BUS_ID_SIZE, "%x:%02x",							(u32)res.start, fs_enet_data.phy_addr);			fs_enet_data.bus_id = (char*)&bus_id[(*id)];			fs_enet_data.init_ioports = init_fcc_ioports;			mdio_bb_prop = of_get_property(phy, "bitbang", NULL);			if (mdio_bb_prop) {				struct platform_device *fs_enet_mdio_bb_dev;				struct fs_mii_bb_platform_info fs_enet_mdio_bb_data;				fs_enet_mdio_bb_dev =					platform_device_register_simple("fsl-bb-mdio",							i, NULL, 0);				memset(&fs_enet_mdio_bb_data, 0,						sizeof(struct fs_mii_bb_platform_info));				fs_enet_mdio_bb_data.mdio_dat.bit =					mdio_bb_prop[0];				fs_enet_mdio_bb_data.mdio_dir.bit =					mdio_bb_prop[1];				fs_enet_mdio_bb_data.mdc_dat.bit =					mdio_bb_prop[2];				fs_enet_mdio_bb_data.mdio_port =					mdio_bb_prop[3];				fs_enet_mdio_bb_data.mdc_port =					mdio_bb_prop[4];				fs_enet_mdio_bb_data.delay =					mdio_bb_prop[5];				fs_enet_mdio_bb_data.irq[0] = phy_irq[0];				fs_enet_mdio_bb_data.irq[1] = -1;				fs_enet_mdio_bb_data.irq[2] = -1;				fs_enet_mdio_bb_data.irq[3] = phy_irq[0];				fs_enet_mdio_bb_data.irq[31] = -1;				fs_enet_mdio_bb_data.mdio_dat.offset =					(u32)&cpm2_immr->im_ioport.iop_pdatc;				fs_enet_mdio_bb_data.mdio_dir.offset =					(u32)&cpm2_immr->im_ioport.iop_pdirc;				fs_enet_mdio_bb_data.mdc_dat.offset =					(u32)&cpm2_immr->im_ioport.iop_pdatc;				ret = platform_device_add_data(						fs_enet_mdio_bb_dev,						&fs_enet_mdio_bb_data,						sizeof(struct fs_mii_bb_platform_info));				if (ret)					goto unreg;			}			of_node_put(phy);			of_node_put(mdio);			ret = platform_device_add_data(fs_enet_dev, &fs_enet_data,						     sizeof(struct							    fs_platform_info));			if (ret)				goto unreg;		}	}	return 0;unreg:	platform_device_unregister(fs_enet_dev);err:	return ret;}arch_initcall(fs_enet_of_init);static const char scc_regs[] = "regs";static const char scc_pram[] = "pram";static int __init cpm_uart_of_init(void){	struct device_node *np;	unsigned int i;	struct platform_device *cpm_uart_dev;	int ret;	for (np = NULL, i = 0;	     (np = of_find_compatible_node(np, "serial", "cpm_uart")) != NULL;	     i++) {		struct resource r[3];		struct fs_uart_platform_info cpm_uart_data;		const int *id;		const char *model;		memset(r, 0, sizeof(r));		memset(&cpm_uart_data, 0, sizeof(cpm_uart_data));		ret = of_address_to_resource(np, 0, &r[0]);		if (ret)			goto err;		r[0].name = scc_regs;		ret = of_address_to_resource(np, 1, &r[1]);		if (ret)			goto err;		r[1].name = scc_pram;		of_irq_to_resource(np, 0, &r[2]);		cpm_uart_dev =		    platform_device_register_simple("fsl-cpm-scc:uart", i, &r[0], 3);		if (IS_ERR(cpm_uart_dev)) {			ret = PTR_ERR(cpm_uart_dev);			goto err;		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -