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

📄 pmac_feature.c

📁 这个linux源代码是很全面的~基本完整了~使用c编译的~由于时间问题我没有亲自测试~但就算用来做参考资料也是非常好的
💻 C
📖 第 1 页 / 共 5 页
字号:
	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){	const int reset_lines[] = {	KL_GPIO_RESET_CPU0,					KL_GPIO_RESET_CPU1,					KL_GPIO_RESET_CPU2,					KL_GPIO_RESET_CPU3 };	int reset_io;	unsigned long flags;	struct macio_chip* macio;		macio = &macio_chips[0];	if (macio->type != macio_keylargo && macio->type != macio_pangea)		return -ENODEV;	if (param > 3 || param < 0)		return -ENODEV;	reset_io = 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_OUTPUT_ENABLE | KEYLARGO_GPIO_OUTOUT_DATA);	(void)MACIO_IN8(reset_io);	UNLOCK(flags);	return 0;}static int __pmacrackmac_reset_cpu(struct device_node* node, int param, int value){	int reset_io;	unsigned long flags;	struct macio_chip* macio;	struct device_node* np;		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)		return -ENODEV;		LOCK(flags);	MACIO_OUT8(reset_io, KEYLARGO_GPIO_OUTPUT_ENABLE);	(void)MACIO_IN8(reset_io);	udelay(1);	MACIO_OUT8(reset_io, 0);	(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)		return -ENODEV;		prop = (char *)get_property(node, "AAPL,clock-id", NULL);	if (!prop)		return -ENODEV;	if (strncmp(prop, "usb0u048", strlen("usb0u048")) == 0)		number = 0;	else if (strncmp(prop, "usb1u148", strlen("usb1u148")) == 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)		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)		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 restart){	u32 temp;	mdelay(1);	MACIO_BIS(KEYLARGO_FCR0, KL0_USB_REF_SUSPEND);	(void)MACIO_IN32(KEYLARGO_FCR0);	mdelay(100);	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);	(void)MACIO_IN32(KEYLARGO_FCR0); udelay(10);	MACIO_BIC(KEYLARGO_MBCR, KL_MBCR_MB0_DEV_MASK);	(void)MACIO_IN32(KEYLARGO_MBCR); udelay(10);	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);	(void)MACIO_IN32(KEYLARGO_FCR1); udelay(10);	MACIO_BIS(KEYLARGO_FCR2, KL2_ALT_DATA_OUT); 	udelay(10); 	MACIO_BIC(KEYLARGO_FCR2, KL2_IOBUS_ENABLE); 	udelay(10);	temp = MACIO_IN32(KEYLARGO_FCR3);	if (macio->rev >= 2)		temp |= (KL3_SHUTDOWN_PLL2X | KL3_SHUTDOWN_PLL_TOTAL);			temp |= KL3_SHUTDOWN_PLLKW6 | KL3_SHUTDOWN_PLLKW4 |		KL3_SHUTDOWN_PLLKW35 | KL3_SHUTDOWN_PLLKW12;	temp &= ~(KL3_CLK66_ENABLE | KL3_CLK49_ENABLE | KL3_CLK45_ENABLE		| KL3_CLK31_ENABLE | KL3_TIMER_CLK18_ENABLE | KL3_I2S1_CLK18_ENABLE		| KL3_I2S0_CLK18_ENABLE | KL3_VIA_CLK16_ENABLE);	MACIO_OUT32(KEYLARGO_FCR3, temp);	(void)MACIO_IN32(KEYLARGO_FCR3); udelay(10);}static void __pmacpangea_shutdown(struct macio_chip* macio, int restart){	u32 temp;	MACIO_BIC(KEYLARGO_FCR0,KL0_SCCA_ENABLE | KL0_SCCB_ENABLE |				KL0_SCC_CELL_ENABLE |				KL0_USB0_CELL_ENABLE | KL0_USB1_CELL_ENABLE);	(void)MACIO_IN32(KEYLARGO_FCR0); udelay(10);	MACIO_BIC(KEYLARGO_MBCR, KL_MBCR_MB0_DEV_MASK);	(void)MACIO_IN32(KEYLARGO_MBCR); udelay(10);	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);	(void)MACIO_IN32(KEYLARGO_FCR1); udelay(10);	MACIO_BIS(KEYLARGO_FCR2, KL2_ALT_DATA_OUT); 	udelay(10);	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_TIMER_CLK18_ENABLE | KL3_I2S1_CLK18_ENABLE		| KL3_I2S0_CLK18_ENABLE | KL3_VIA_CLK16_ENABLE);	MACIO_OUT32(KEYLARGO_FCR3, temp);	(void)MACIO_IN32(KEYLARGO_FCR3); udelay(10);}static int __pmaccore99_sleep(void){	struct macio_chip* macio;	int i;	macio = &macio_chips[0];	if (macio->type != macio_keylargo && macio->type != macio_pangea)		return -ENODEV;		/* We power off the wireless slot in case it was not done	 * by the driver. We don't power it on automatically however	 */	if (macio->flags & MACIO_FLAG_AIRPORT_ON)		core99_airport_enable(macio->of_node, 0, 0);	/* We power off the FW cable. Should be done by the driver... */	if (macio->flags & MACIO_FLAG_FW_SUPPORTED) {		core99_firewire_enable(NULL, 0, 0);		core99_firewire_cable_power(NULL, 0, 0);	}	/* We make sure int. modem is off (in case driver lost it) */	core99_modem_enable(macio->of_node, 0, 0);	/* We make sure the sound is off as well */	core99_sound_chip_enable(macio->of_node, 0, 0);	 	/*	 * Save various bits of KeyLargo	 */	/* Save the state of the various GPIOs */	save_gpio_levels[0] = MACIO_IN32(KEYLARGO_GPIO_LEVELS0);	save_gpio_levels[1] = MACIO_IN32(KEYLARGO_GPIO_LEVELS1);	for (i=0; i<KEYLARGO_GPIO_EXTINT_CNT; i++)		save_gpio_extint[i] = MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+i);	for (i=0; i<KEYLARGO_GPIO_CNT; i++)		save_gpio_normal[i] = MACIO_IN8(KEYLARGO_GPIO_0+i);	/* Save the FCRs */	save_mbcr = MACIO_IN32(KEYLARGO_MBCR);	save_fcr[0] = MACIO_IN32(KEYLARGO_FCR0);	save_fcr[1] = MACIO_IN32(KEYLARGO_FCR1);

⌨️ 快捷键说明

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