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

📄 pmac_feature.c

📁 一个2.4.21版本的嵌入式linux内核
💻 C
📖 第 1 页 / 共 5 页
字号:
	LOCK(flags);	if (value)		UN_BIS(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_GMAC);	else		UN_BIC(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_GMAC);	(void)UN_IN(UNI_N_CLOCK_CNTL);	UNLOCK(flags);	udelay(20);	return 0;}static int __pmaccore99_gmac_phy_reset(struct device_node* node, int param, int value){	unsigned long flags;	struct macio_chip* macio;		macio = &macio_chips[0];	if (macio->type != macio_keylargo && macio->type != macio_pangea &&	    macio->type != macio_intrepid)		return -ENODEV;	LOCK(flags);	MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, KEYLARGO_GPIO_OUTPUT_ENABLE);	(void)MACIO_IN8(KL_GPIO_ETH_PHY_RESET);	UNLOCK(flags);	mdelay(10);	LOCK(flags);	MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, KEYLARGO_GPIO_OUTPUT_ENABLE		| KEYLARGO_GPIO_OUTOUT_DATA);	UNLOCK(flags);	mdelay(10);	return 0;}static int __pmaccore99_sound_chip_enable(struct device_node* node, int param, int value){	struct macio_chip*	macio;	unsigned long		flags;		macio = macio_find(node, 0);	if (!macio)		return -ENODEV;	/* Do a better probe code, screamer G4 desktops &	 * iMacs can do that too, add a recalibrate  in	 * the driver as well	 */	if (pmac_mb.model_id == PMAC_TYPE_PISMO ||	    pmac_mb.model_id == PMAC_TYPE_TITANIUM) {		LOCK(flags);		if (value)	    		MACIO_OUT8(KL_GPIO_SOUND_POWER,	    			KEYLARGO_GPIO_OUTPUT_ENABLE |	    			KEYLARGO_GPIO_OUTOUT_DATA);	    	else	    		MACIO_OUT8(KL_GPIO_SOUND_POWER,	    			KEYLARGO_GPIO_OUTPUT_ENABLE);	    	(void)MACIO_IN8(KL_GPIO_SOUND_POWER);	    	UNLOCK(flags);	}	return 0;}static int __pmaccore99_airport_enable(struct device_node* node, int param, int value){	struct macio_chip*	macio;	unsigned long		flags;	int			state;		macio = macio_find(node, 0);	if (!macio)		return -ENODEV;		/* Hint: we allow passing of macio itself for the sake of the	 * sleep code	 */	if (node != macio->of_node &&	    (!node->parent || node->parent != macio->of_node))		return -ENODEV;	state = (macio->flags & MACIO_FLAG_AIRPORT_ON) != 0;	if (value == state)		return 0;	if (value) {		/* This code is a reproduction of OF enable-cardslot		 * and init-wireless methods, slightly hacked until		 * I got it working.		 */		LOCK(flags);		MACIO_OUT8(KEYLARGO_GPIO_0+0xf, 5);		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xf);		UNLOCK(flags);		mdelay(10);		LOCK(flags);		MACIO_OUT8(KEYLARGO_GPIO_0+0xf, 4);		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xf);		UNLOCK(flags);		mdelay(10);		LOCK(flags);		MACIO_BIC(KEYLARGO_FCR2, KL2_CARDSEL_16);		(void)MACIO_IN32(KEYLARGO_FCR2);		udelay(10);		MACIO_OUT8(KEYLARGO_GPIO_EXTINT_0+0xb, 0);		(void)MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+0xb);		udelay(10);		MACIO_OUT8(KEYLARGO_GPIO_EXTINT_0+0xa, 0x28);		(void)MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+0xa);		udelay(10);		MACIO_OUT8(KEYLARGO_GPIO_EXTINT_0+0xd, 0x28);		(void)MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+0xd);		udelay(10);		MACIO_OUT8(KEYLARGO_GPIO_0+0xd, 0x28);		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xd);		udelay(10);		MACIO_OUT8(KEYLARGO_GPIO_0+0xe, 0x28);		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xe);		UNLOCK(flags);		udelay(10);		MACIO_OUT32(0x1c000, 0);		mdelay(1);		MACIO_OUT8(0x1a3e0, 0x41);		(void)MACIO_IN8(0x1a3e0);		udelay(10);		LOCK(flags);		MACIO_BIS(KEYLARGO_FCR2, KL2_CARDSEL_16);		(void)MACIO_IN32(KEYLARGO_FCR2);		UNLOCK(flags);		mdelay(100);		macio->flags |= MACIO_FLAG_AIRPORT_ON;	} else {		LOCK(flags);		MACIO_BIC(KEYLARGO_FCR2, KL2_CARDSEL_16);		(void)MACIO_IN32(KEYLARGO_FCR2);		MACIO_OUT8(KL_GPIO_AIRPORT_0, 0);		MACIO_OUT8(KL_GPIO_AIRPORT_1, 0);		MACIO_OUT8(KL_GPIO_AIRPORT_2, 0);		MACIO_OUT8(KL_GPIO_AIRPORT_3, 0);		MACIO_OUT8(KL_GPIO_AIRPORT_4, 0);		(void)MACIO_IN8(KL_GPIO_AIRPORT_4);		UNLOCK(flags);		macio->flags &= ~MACIO_FLAG_AIRPORT_ON;	}	return 0;}#ifdef CONFIG_SMPstatic int __pmaccore99_reset_cpu(struct device_node* node, int param, int value){	unsigned int reset_io = 0;	unsigned long flags;	struct macio_chip* macio;	struct device_node* np;	const int dflt_reset_lines[] = {	KL_GPIO_RESET_CPU0,						KL_GPIO_RESET_CPU1,						KL_GPIO_RESET_CPU2,						KL_GPIO_RESET_CPU3 };		macio = &macio_chips[0];	if (macio->type != macio_keylargo)		return -ENODEV;			np = find_path_device("/cpus");	if (np == NULL)		return -ENODEV;	for (np = np->child; np != NULL; np = np->sibling) {		u32* num = (u32 *)get_property(np, "reg", NULL);		u32* rst = (u32 *)get_property(np, "soft-reset", NULL);		if (num == NULL || rst == NULL)			continue;		if (param == *num) {			reset_io = *rst;			break;		}	}	if (np == NULL || reset_io == 0)		reset_io = dflt_reset_lines[param];		LOCK(flags);	MACIO_OUT8(reset_io, KEYLARGO_GPIO_OUTPUT_ENABLE);	(void)MACIO_IN8(reset_io);	udelay(1);	MACIO_OUT8(reset_io, KEYLARGO_GPIO_OUTOUT_DATA | KEYLARGO_GPIO_OUTPUT_ENABLE);	(void)MACIO_IN8(reset_io);	UNLOCK(flags);	return 0;}#endif /* CONFIG_SMP */static int __pmaccore99_usb_enable(struct device_node* node, int param, int value){	struct macio_chip* macio;	unsigned long flags;	char* prop;	int number;	u32 reg;		macio = &macio_chips[0];	if (macio->type != macio_keylargo && macio->type != macio_pangea &&	    macio->type != macio_intrepid)		return -ENODEV;	/* XXX Fix handling of 3rd USB controller in Intrepid, move the	 * port connect stuff (KL4_*) to the sleep code eventually	 */	prop = (char *)get_property(node, "AAPL,clock-id", NULL);	if (!prop)		return -ENODEV;	if (strncmp(prop, "usb0u048", 8) == 0)		number = 0;	else if (strncmp(prop, "usb1u148", 8) == 0)		number = 2;	else		return -ENODEV;	/* Sorry for the brute-force locking, but this is only used during	 * sleep and the timing seem to be critical	 */	LOCK(flags);	if (value) {		/* Turn ON */		if (number == 0) {			MACIO_BIC(KEYLARGO_FCR0, (KL0_USB0_PAD_SUSPEND0 | KL0_USB0_PAD_SUSPEND1));			(void)MACIO_IN32(KEYLARGO_FCR0);			UNLOCK(flags);			mdelay(1);			LOCK(flags);			MACIO_BIS(KEYLARGO_FCR0, KL0_USB0_CELL_ENABLE);		} else {			MACIO_BIC(KEYLARGO_FCR0, (KL0_USB1_PAD_SUSPEND0 | KL0_USB1_PAD_SUSPEND1));			UNLOCK(flags);			(void)MACIO_IN32(KEYLARGO_FCR0);			mdelay(1);			LOCK(flags);			MACIO_BIS(KEYLARGO_FCR0, KL0_USB1_CELL_ENABLE);		}		reg = MACIO_IN32(KEYLARGO_FCR4);		reg &=	~(KL4_PORT_WAKEUP_ENABLE(number) | KL4_PORT_RESUME_WAKE_EN(number) |			KL4_PORT_CONNECT_WAKE_EN(number) | KL4_PORT_DISCONNECT_WAKE_EN(number));		reg &=	~(KL4_PORT_WAKEUP_ENABLE(number+1) | KL4_PORT_RESUME_WAKE_EN(number+1) |			KL4_PORT_CONNECT_WAKE_EN(number+1) | KL4_PORT_DISCONNECT_WAKE_EN(number+1));		MACIO_OUT32(KEYLARGO_FCR4, reg);		(void)MACIO_IN32(KEYLARGO_FCR4);		udelay(10);	} else {		/* Turn OFF */		reg = MACIO_IN32(KEYLARGO_FCR4);		reg |=	KL4_PORT_WAKEUP_ENABLE(number) | KL4_PORT_RESUME_WAKE_EN(number) |			KL4_PORT_CONNECT_WAKE_EN(number) | KL4_PORT_DISCONNECT_WAKE_EN(number);		reg |=	KL4_PORT_WAKEUP_ENABLE(number+1) | KL4_PORT_RESUME_WAKE_EN(number+1) |			KL4_PORT_CONNECT_WAKE_EN(number+1) | KL4_PORT_DISCONNECT_WAKE_EN(number+1);		MACIO_OUT32(KEYLARGO_FCR4, reg);		(void)MACIO_IN32(KEYLARGO_FCR4);		udelay(1);		if (number == 0) {			MACIO_BIC(KEYLARGO_FCR0, KL0_USB0_CELL_ENABLE);			(void)MACIO_IN32(KEYLARGO_FCR0);			udelay(1);			MACIO_BIS(KEYLARGO_FCR0, (KL0_USB0_PAD_SUSPEND0 | KL0_USB0_PAD_SUSPEND1));			(void)MACIO_IN32(KEYLARGO_FCR0);		} else {			MACIO_BIC(KEYLARGO_FCR0, KL0_USB1_CELL_ENABLE);			(void)MACIO_IN32(KEYLARGO_FCR0);			udelay(1);			MACIO_BIS(KEYLARGO_FCR0, (KL0_USB1_PAD_SUSPEND0 | KL0_USB1_PAD_SUSPEND1));			(void)MACIO_IN32(KEYLARGO_FCR0);		}		udelay(1);	}	UNLOCK(flags);	return 0;}static int __pmaccore99_firewire_enable(struct device_node* node, int param, int value){	unsigned long flags;	struct macio_chip* macio;	macio = &macio_chips[0];	if (macio->type != macio_keylargo && macio->type != macio_pangea &&	    macio->type != macio_intrepid)		return -ENODEV;	if (!(macio->flags & MACIO_FLAG_FW_SUPPORTED))		return -ENODEV;		LOCK(flags);	if (value) {		UN_BIS(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_FW);		(void)UN_IN(UNI_N_CLOCK_CNTL);	} else {		UN_BIC(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_FW);		(void)UN_IN(UNI_N_CLOCK_CNTL);	}	UNLOCK(flags);	mdelay(1);	return 0;}static int __pmaccore99_firewire_cable_power(struct device_node* node, int param, int value){	unsigned long flags;	struct macio_chip* macio;	/* Trick: we allow NULL node */	if ((pmac_mb.board_flags & PMAC_MB_HAS_FW_POWER) == 0)	    	return -ENODEV;	macio = &macio_chips[0];	if (macio->type != macio_keylargo && macio->type != macio_pangea &&	    macio->type != macio_intrepid)		return -ENODEV;	if (!(macio->flags & MACIO_FLAG_FW_SUPPORTED))		return -ENODEV;		LOCK(flags);	if (value) {		MACIO_OUT8(KL_GPIO_FW_CABLE_POWER , 0);		MACIO_IN8(KL_GPIO_FW_CABLE_POWER);		udelay(10);	} else {		MACIO_OUT8(KL_GPIO_FW_CABLE_POWER , 4);		MACIO_IN8(KL_GPIO_FW_CABLE_POWER); udelay(10);	}	UNLOCK(flags);	mdelay(1);	return 0;}static int __pmaccore99_read_gpio(struct device_node* node, int param, int value){	struct macio_chip* macio = &macio_chips[0];		return MACIO_IN8(param);}static int __pmaccore99_write_gpio(struct device_node* node, int param, int value){	struct macio_chip* macio = &macio_chips[0];	MACIO_OUT8(param, (u8)(value & 0xff));	return 0;}static void __pmackeylargo_shutdown(struct macio_chip* macio, int sleep_mode){	u32 temp;	if (sleep_mode) {		mdelay(1);		MACIO_BIS(KEYLARGO_FCR0, KL0_USB_REF_SUSPEND);		(void)MACIO_IN32(KEYLARGO_FCR0);		mdelay(1);	}	MACIO_BIC(KEYLARGO_FCR0,KL0_SCCA_ENABLE | KL0_SCCB_ENABLE |				KL0_SCC_CELL_ENABLE |		      		KL0_IRDA_ENABLE | KL0_IRDA_CLK32_ENABLE |		      		KL0_IRDA_CLK19_ENABLE);		MACIO_BIC(KEYLARGO_MBCR, KL_MBCR_MB0_DEV_MASK);	MACIO_BIS(KEYLARGO_MBCR, KL_MBCR_MB0_IDE_ENABLE);	MACIO_BIC(KEYLARGO_FCR1,		KL1_AUDIO_SEL_22MCLK | KL1_AUDIO_CLK_ENABLE_BIT |		KL1_AUDIO_CLK_OUT_ENABLE | KL1_AUDIO_CELL_ENABLE |		KL1_I2S0_CELL_ENABLE | KL1_I2S0_CLK_ENABLE_BIT |		KL1_I2S0_ENABLE | KL1_I2S1_CELL_ENABLE |		KL1_I2S1_CLK_ENABLE_BIT | KL1_I2S1_ENABLE |		KL1_EIDE0_ENABLE | KL1_EIDE0_RESET_N |		KL1_EIDE1_ENABLE | KL1_EIDE1_RESET_N |		KL1_UIDE_ENABLE);	MACIO_BIS(KEYLARGO_FCR2, KL2_ALT_DATA_OUT); 	MACIO_BIC(KEYLARGO_FCR2, KL2_IOBUS_ENABLE);	temp = MACIO_IN32(KEYLARGO_FCR3);	if (macio->rev >= 2) {		temp |= KL3_SHUTDOWN_PLL2X;		if (sleep_mode)			temp |= KL3_SHUTDOWN_PLL_TOTAL;	}		temp |= KL3_SHUTDOWN_PLLKW6 | KL3_SHUTDOWN_PLLKW4 |		KL3_SHUTDOWN_PLLKW35;	if (sleep_mode)		temp |= KL3_SHUTDOWN_PLLKW12;	temp &= ~(KL3_CLK66_ENABLE | KL3_CLK49_ENABLE | KL3_CLK45_ENABLE		| KL3_CLK31_ENABLE | KL3_I2S1_CLK18_ENABLE | KL3_I2S0_CLK18_ENABLE);	if (sleep_mode)		temp &= ~(KL3_TIMER_CLK18_ENABLE | KL3_VIA_CLK16_ENABLE);	MACIO_OUT32(KEYLARGO_FCR3, temp);	/* Flush posted writes & wait a bit */	(void)MACIO_IN32(KEYLARGO_FCR0); mdelay(1);}static void __pmacpangea_shutdown(struct macio_chip* macio, int sleep_mode){	u32 temp;	MACIO_BIC(KEYLARGO_FCR0,KL0_SCCA_ENABLE | KL0_SCCB_ENABLE |				KL0_SCC_CELL_ENABLE |				KL0_USB0_CELL_ENABLE | KL0_USB1_CELL_ENABLE);	MACIO_BIC(KEYLARGO_FCR1,		KL1_AUDIO_SEL_22MCLK | KL1_AUDIO_CLK_ENABLE_BIT |		KL1_AUDIO_CLK_OUT_ENABLE | KL1_AUDIO_CELL_ENABLE |		KL1_I2S0_CELL_ENABLE | KL1_I2S0_CLK_ENABLE_BIT |		KL1_I2S0_ENABLE | KL1_I2S1_CELL_ENABLE |		KL1_I2S1_CLK_ENABLE_BIT | KL1_I2S1_ENABLE |		KL1_UIDE_ENABLE);	if (pmac_mb.board_flags & PMAC_MB_MOBILE)		MACIO_BIC(KEYLARGO_FCR1, KL1_UIDE_RESET_N);	MACIO_BIS(KEYLARGO_FCR2, KL2_ALT_DATA_OUT); 		temp = MACIO_IN32(KEYLARGO_FCR3);	temp |= KL3_SHUTDOWN_PLLKW6 | KL3_SHUTDOWN_PLLKW4 |		KL3_SHUTDOWN_PLLKW35;	temp &= ~(KL3_CLK49_ENABLE | KL3_CLK45_ENABLE | KL3_CLK31_ENABLE		| KL3_I2S0_CLK18_ENABLE | KL3_I2S1_CLK18_ENABLE);	if (sleep_mode)		temp &= ~(KL3_VIA_CLK16_ENABLE | KL3_TIMER_CLK18_ENABLE);	MACIO_OUT32(KEYLARGO_FCR3, temp);	/* Flush posted writes & wait a bit */	(void)MACIO_IN32(KEYLARGO_FCR0); mdelay(1);}static void __pmacintrepid_shutdown(struct macio_chip* macio, int sleep_mode){	u32 temp;	MACIO_BIC(KEYLARGO_FCR0,KL0_SCCA_ENABLE | KL0_SCCB_ENABLE |				KL0_SCC_CELL_ENABLE |				KL0_USB0_CELL_ENABLE | KL0_USB1_CELL_ENABLE);	MACIO_BIC(KEYLARGO_FCR1,		KL1_USB2_CELL_ENABLE |		KL1_I2S0_CELL_ENABLE | KL1_I2S0_CLK_ENABLE_BIT |		KL1_I2S0_ENABLE | KL1_I2S1_CELL_ENABLE |		KL1_I2S1_CLK_ENABLE_BIT | KL1_I2S1_ENABLE);	if (pmac_mb.board_flags & PMAC_MB_MOBILE)		MACIO_BIC(KEYLARGO_FCR1, KL1_UIDE_RESET_N);	MACIO_BIS(KEYLARGO_FCR2, KL2_ALT_DATA_OUT); 		temp = MACIO_IN32(KEYLARGO_FCR3);	temp |= KL3_IT_SHUTDOWN_PLL1 | KL3_IT_SHUTDOWN_PLL2 |		KL3_IT_SHUTDOWN_PLL3;	temp &= ~(KL3_CLK49_ENABLE | KL3_CLK45_ENABLE |		  KL3_I2S1_CLK18_ENABLE | KL3_I2S0_CLK18_ENABLE);

⌨️ 快捷键说明

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