📄 pmac_feature.c
字号:
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 + -