static void hisi_pmic_otmp_wk_handler(struct work_struct *work)
{
    struct irq_desc *desc = NULL;
    PMIC_MNTN_DESC  *pmic_mntn;
    pmic_mntn = container_of(work, PMIC_MNTN_DESC, otmp_wk);
    unsigned char reg_value = 0;

    memset((void *)pmic_mntn->irq_log_show, '\0', PMIC_PRINT_BUF_SIZE);
    snprintf(pmic_mntn->irq_log_show, PMIC_PRINT_BUF_SIZE, "%s", "PMIC OTMP EVENT HAPPEN.\n");
    pr_info("\n%s\n", pmic_mntn->irq_log_show);

    desc = irq_to_desc(pmic_mntn->otmp_irq);
    if (!desc) {
        pr_err("[%s]irq_to_desc err\n", __func__);
        return;
    }

    if (NULL != desc->irq_data.chip->irq_unmask) {
        desc->irq_data.chip->irq_unmask(&desc->irq_data);
    }

    /*hreset powerdown ctrl,if otmp_hreset_pwrdown_flag is not 0,do cold reset*/
    if (0 != pmic_mntn->otmp_hreset_pwrdown_flag) {
    reg_value = hisi_pmic_reg_read(pmic_mntn->otmp_hreset_pwrdown_reg.addr);
    SET_REG_BIT(reg_value, pmic_mntn->otmp_hreset_pwrdown_reg.shift, pmic_mntn->otmp_hreset_pwrdown_reg.mask, pmic_mntn->otmp_hreset_pwrdown_val);
    hisi_pmic_reg_write(pmic_mntn->otmp_hreset_pwrdown_reg.addr, reg_value);
    }
    hisi_pmic_board_reboot();
    return;
}
예제 #2
0
파일: mac.c 프로젝트: AlexShiLucky/linux
void xge_mac_set_speed(struct xge_pdata *pdata)
{
	u32 icm0, icm2, ecm0, mc2;
	u32 intf_ctrl, rgmii;

	icm0 = xge_rd_csr(pdata, ICM_CONFIG0_REG_0);
	icm2 = xge_rd_csr(pdata, ICM_CONFIG2_REG_0);
	ecm0 = xge_rd_csr(pdata, ECM_CONFIG0_REG_0);
	rgmii = xge_rd_csr(pdata, RGMII_REG_0);
	mc2 = xge_rd_csr(pdata, MAC_CONFIG_2);
	intf_ctrl = xge_rd_csr(pdata, INTERFACE_CONTROL);
	icm2 |= CFG_WAITASYNCRD_EN;

	switch (pdata->phy_speed) {
	case SPEED_10:
		SET_REG_BITS(&mc2, INTF_MODE, 1);
		SET_REG_BITS(&intf_ctrl, HD_MODE, 0);
		SET_REG_BITS(&icm0, CFG_MACMODE, 0);
		SET_REG_BITS(&icm2, CFG_WAITASYNCRD, 500);
		SET_REG_BIT(&rgmii, CFG_SPEED_125, 0);
		break;
	case SPEED_100:
		SET_REG_BITS(&mc2, INTF_MODE, 1);
		SET_REG_BITS(&intf_ctrl, HD_MODE, 1);
		SET_REG_BITS(&icm0, CFG_MACMODE, 1);
		SET_REG_BITS(&icm2, CFG_WAITASYNCRD, 80);
		SET_REG_BIT(&rgmii, CFG_SPEED_125, 0);
		break;
	default:
		SET_REG_BITS(&mc2, INTF_MODE, 2);
		SET_REG_BITS(&intf_ctrl, HD_MODE, 2);
		SET_REG_BITS(&icm0, CFG_MACMODE, 2);
		SET_REG_BITS(&icm2, CFG_WAITASYNCRD, 16);
		SET_REG_BIT(&rgmii, CFG_SPEED_125, 1);
		break;
	}

	mc2 |= FULL_DUPLEX | CRC_EN | PAD_CRC;
	SET_REG_BITS(&ecm0, CFG_WFIFOFULLTHR, 0x32);

	xge_wr_csr(pdata, MAC_CONFIG_2, mc2);
	xge_wr_csr(pdata, INTERFACE_CONTROL, intf_ctrl);
	xge_wr_csr(pdata, RGMII_REG_0, rgmii);
	xge_wr_csr(pdata, ICM_CONFIG0_REG_0, icm0);
	xge_wr_csr(pdata, ICM_CONFIG2_REG_0, icm2);
	xge_wr_csr(pdata, ECM_CONFIG0_REG_0, ecm0);
}
static int hisi_pmic_smpl_mntn_initial(struct platform_device *pdev, PMIC_MNTN_DESC *pmic_mntn)
{

    struct device_node *root = NULL;
    struct device *dev = &pdev->dev;
    struct device_node *np = dev->of_node;
    unsigned char reg_value = 0;
    s32 ret = 0;

    root = of_find_compatible_node(np, NULL, "hisilicon,pmic-mntn-smpl");
    if (!root) {
        dev_err(dev, "[%s]no hisilicon,pmic-mntn-smpl root node\n", __func__);
        return -ENODEV;
    }

    ret |= of_property_read_u32_array(root, "hisilicon,smpl-ctrl-en", &pmic_mntn->smpl_en_val, 0x1);
    ret |= of_property_read_u32_array(root, "hisilicon,smpl-ctrl-en-reg", (u32 *)&pmic_mntn->smpl_en_reg, 0x3);
    ret |= of_property_read_u32_array(root, "hisilicon,smpl-ctrl-time", &pmic_mntn->smpl_tm_val, 0x1);
    ret |= of_property_read_u32_array(root, "hisilicon,smpl-ctrl-time-reg", (u32 *)&pmic_mntn->smpl_tm_reg, 0x3);
    if (ret) {
        dev_err(dev, "[%s]get pmic smpl attribute failed.\n", __func__);
        return -ENODEV;
    }

    /*Set SMPL on/off*/
    reg_value = hisi_pmic_reg_read(pmic_mntn->smpl_en_reg.addr);
    SET_REG_BIT(reg_value, pmic_mntn->smpl_en_reg.shift, pmic_mntn->smpl_en_reg.mask, pmic_mntn->smpl_en_val);
    hisi_pmic_reg_write(pmic_mntn->smpl_en_reg.addr, reg_value);

    /*Set SMPL effective time*/
    reg_value = hisi_pmic_reg_read(pmic_mntn->smpl_tm_reg.addr);
    SET_REG_BIT(reg_value, pmic_mntn->smpl_tm_reg.shift, pmic_mntn->smpl_tm_reg.mask, pmic_mntn->smpl_tm_val);
    hisi_pmic_reg_write(pmic_mntn->smpl_tm_reg.addr, reg_value);

    return 0;

}
int hisi_pmic_mntn_config_smpl(bool enable)
{
    unsigned int reg_value = 0;
    unsigned int value = 0;

    if( !g_pmic_mntn )
        return 1;

    //config smpl(reg:0xDC; bit 0;  0:disable, 1: enable)
    if( enable ) {
        value = 1;
        pr_info("%s %d enable smpl in kernel\n", __func__, __LINE__);
    } else {
        value = 0;
        pr_info("%s %d disable smpl in kernel\n", __func__, __LINE__);
    }

    reg_value = hisi_pmic_reg_read(g_pmic_mntn->smpl_en_reg.addr);
    SET_REG_BIT(reg_value, g_pmic_mntn->smpl_en_reg.shift, g_pmic_mntn->smpl_en_reg.mask, value);
    hisi_pmic_reg_write(g_pmic_mntn->smpl_en_reg.addr, reg_value);

    return 0;
}
int hisi_pmic_mntn_config_vsys_pwroff_abs_pd(bool enable)
{
    unsigned int reg_value = 0;
    unsigned int value = 0;

    if(  !g_pmic_mntn  )
        return 1;

    //config abs_pd (reg:0xDB; bit 0;  0::自动关机(低于2.3v时间超过35us以上才能保证关机成功),
    //1:不自动关机)
    if( enable ) {
        value = g_pmic_mntn->vsys_pwroff_abs_pd_en_val;
        pr_info("%s %d enable abs_pd in kernel\n", __func__, __LINE__);
    } else {
        value = g_pmic_mntn->vsys_pwroff_abs_pd_dis_val;
        pr_info("%s %d disable abs_pd in kernel\n", __func__, __LINE__);
    }

    reg_value = hisi_pmic_reg_read(g_pmic_mntn->vsys_pwroff_abs_pd_tm_reg.addr);
    SET_REG_BIT(reg_value, g_pmic_mntn->vsys_pwroff_abs_pd_tm_reg.shift, g_pmic_mntn->vsys_pwroff_abs_pd_tm_reg.mask, value);
    hisi_pmic_reg_write(g_pmic_mntn->vsys_pwroff_abs_pd_tm_reg.addr, reg_value);

    return 0;
}
static int hisi_pmic_otmp_mntn_initial(struct platform_device *pdev, PMIC_MNTN_DESC *pmic_mntn)
{

    struct device_node *root = NULL;
    struct device *dev = &pdev->dev;
    struct device_node *np = dev->of_node;
    unsigned char reg_value = 0;
    s32 ret = 0;

    root = of_find_compatible_node(np, NULL, "hisilicon,pmic-mntn-otmp");
    if (!root) {
        dev_err(dev, "[%s]no hisilicon,pmic-mntn-otmp root node\n", __func__);
        return -ENODEV;
    }

    ret |= of_property_read_u32_array(root, "hisilicon,otmp-threshold-val", (u32 *)&pmic_mntn->otmp_thshd_val, 0x1);
    ret |= of_property_read_u32_array(root, "hisilicon,otmp-threshold-reg", (u32 *)&pmic_mntn->otmp_thshd_reg, 0x3);
    if (ret) {
        dev_err(dev, "[%s]get pmic otmp attribute failed.\n", __func__);
        return -ENODEV;
    }

    ret |= of_property_read_u32_array(root, "hisilicon,otmp-hreset-pwrdown-flag", (u32 *)&pmic_mntn->otmp_hreset_pwrdown_flag, 0x1);
    ret |= of_property_read_u32_array(root, "hisilicon,otmp-hreset-pwrdown-val", (u32 *)&pmic_mntn->otmp_hreset_pwrdown_val, 0x1);
    ret |= of_property_read_u32_array(root, "hisilicon,otmp-hreset-pwrdown-reg", (u32 *)&pmic_mntn->otmp_hreset_pwrdown_reg, 0x3);
    if (ret) {
        dev_err(dev, "[%s]get pmic otmp attribute failed.\n", __func__);
        return -ENODEV;
    }

	root = of_find_compatible_node(NULL, NULL, "hisilicon,sysctrl");
	if (!root) {
		dev_err("%s: hisilicon,sysctrl No compatible node found\n", __func__);
		return -ENODEV;
	}

	g_sysctrl_base = of_iomap(root, 0);
	if (!g_sysctrl_base) {
		dev_err("%s: hisilicon,sysctrl_base is NULL\n", __func__);
		return -ENODEV;
	}
    /*Set the otmp threshold*/
    reg_value = hisi_pmic_reg_read(pmic_mntn->otmp_thshd_reg.addr);
    SET_REG_BIT(reg_value, pmic_mntn->otmp_thshd_reg.shift, pmic_mntn->otmp_thshd_reg.mask, pmic_mntn->otmp_thshd_val);
    hisi_pmic_reg_write(pmic_mntn->otmp_thshd_reg.addr, reg_value);

    pmic_mntn->otmp_irq = platform_get_irq_byname(pdev, "otmp");
    if (pmic_mntn->ocp_irq  < 0) {
        dev_err(dev, "[%s]platform_get_irq_byname otmp_irq failed.\n", __func__);
        return -ENODEV;
    }

    pmic_mntn->otmp_wq = create_singlethread_workqueue("pmic-otmp-wq");
    INIT_WORK(&pmic_mntn->otmp_wk, (void *)hisi_pmic_otmp_wk_handler);

    ret = devm_request_irq(dev, pmic_mntn->otmp_irq, hisi_pmic_otmp_irq_handler, IRQF_DISABLED|IRQF_NO_SUSPEND,
        "pmic-otmp-irq", (void *)pmic_mntn);
    if (ret) {
        dev_err(dev, "[%s] request_irq otmp_irq err\n", __func__);
        return -ENODEV;
    }

    return 0;

}
예제 #7
0
void sab8253x_init_lineS(struct sab_port *port)
{
	unsigned char stat;
	
	if(port->chip->c_cim)
	{
		if(port->chip->c_cim->ci_type == CIM_SP502)
		{
			aura_sp502_program(port, SP502_OFF_MODE);
		}
	}

	/*
	 * Wait for any commands or immediate characters
	 */
	sab8253x_cec_wait(port);
#if 0
	sab8253x_tec_wait(port);	/* I have to think about this one
					 * should I assume the line was
					 * previously in async mode*/
#endif
	
	/*
	 * Clear the FIFO buffers.
	 */
	
	WRITEB(port, cmdr, SAB82532_CMDR_RHR);
	sab8253x_cec_wait(port);
	WRITEB(port,cmdr,SAB82532_CMDR_XRES);
	
	
	/*
	 * Clear the interrupt registers.
	 */
	stat = READB(port, isr0);	/* acks ints */
	stat = READB(port, isr1);
	
	/*
	 * Now, initialize the UART 
	 */
	WRITEB(port, ccr0, 0);	  /* power-down */
	WRITEB(port, ccr0, getccr0configS(port));
	WRITEB(port, ccr1, getccr1configS(port));
	WRITEB(port, ccr2, getccr2configS(port));
	WRITEB(port, ccr3, getccr3configS(port));
	WRITEB(port, ccr4, getccr4configS(port));	/* 32 byte receive fifo */
	WRITEB(port, mode, getmodeS(port));
	WRITEB(port, tic /* really rlcr */, getrlcrconfigS(port));
	/* power-up */
	
	switch(port->ccontrol.ccr4 & SAB82532_CCR4_RF02)
	{
	case SAB82532_CCR4_RF32:
		port->recv_fifo_size = 32;
		break;
	case SAB82532_CCR4_RF16:
		port->recv_fifo_size = 16;
		break;
	case SAB82532_CCR4_RF04:
		port->recv_fifo_size = 4;
		break;
	case SAB82532_CCR4_RF02:
		port->recv_fifo_size = 2;
		break;
	default:
		port->recv_fifo_size = 32;
		port->ccontrol.ccr4 &= ~SAB82532_CCR4_RF02;
		break;
	}
	
	if(port->ccontrol.ccr2 & SAB82532_CCR2_TOE)
	{
		RAISE(port, txclkdir);
	}
	else
	{
		LOWER(port, txclkdir);
	}
	
	SET_REG_BIT(port,ccr0,SAB82532_CCR0_PU);

	if(port->chip->c_cim)
	{
		if(port->chip->c_cim->ci_type == CIM_SP502)
		{
			aura_sp502_program(port, port->sigmode);
		}
	}
}