Esempio n. 1
0
void s3c_adc_phy_init(void)
{
	u32 reg;

	if (soc_is_exynos5250() || soc_is_exynos4415() ||
			soc_is_exynos3470() || soc_is_exynos3250()) {
		reg = __raw_readl(EXYNOS5250_ADC_PHY_CONTROL);
		reg |= EXYNOS5_ADC_PHY_ENABLE;
		__raw_writel(reg, EXYNOS5250_ADC_PHY_CONTROL);
	} else if (soc_is_exynos5410() || soc_is_exynos5420()) {
		reg = __raw_readl(EXYNOS5410_ADC_PHY_CONTROL);
		reg |= EXYNOS5_ADC_PHY_ENABLE;
		__raw_writel(reg, EXYNOS5410_ADC_PHY_CONTROL);
	} else if (soc_is_exynos5260()) {
		/* ADC phy select */
		reg = readl(EXYNOS5260_SYSCON_PERI_PHY_SELECT);
		if (reg & EXYNOS5260_SYSCON_PERI_PHY_SELECT_ISP_ONLY)
			reg &= ~(EXYNOS5260_SYSCON_PERI_PHY_SELECT_ISP_ONLY);
		writel(reg, EXYNOS5260_SYSCON_PERI_PHY_SELECT);

		reg = __raw_readl(EXYNOS5260_ADC_PHY_CONTROL);
		reg |= EXYNOS5_ADC_PHY_ENABLE;
		__raw_writel(reg, EXYNOS5260_ADC_PHY_CONTROL);
	}
}
Esempio n. 2
0
void __init exynos5_hs_i2c0_set_platdata(struct exynos5_platform_i2c *pd)
{
	struct exynos5_platform_i2c *npd;

	if (!pd) {
		pd = &default_hs_i2c_data;
		pd->bus_number = 4;
		pd->speed_mode = HSI2C_HIGH_SPD;
	}

	npd = kmemdup(pd, sizeof(struct exynos5_platform_i2c), GFP_KERNEL);
	if (!npd) {
		printk(KERN_ERR "%s: no memory for platform data\n", __func__);
		return;
	}

	if (!npd->cfg_gpio)
		npd->cfg_gpio = exynos5_hs_i2c0_cfg_gpio;

	exynos5_device_hs_i2c0.dev.platform_data = npd;
	if (soc_is_exynos5410()) {
		exynos5_device_hs_i2c0.resource[0].start = EXYNOS5410_PA_HSIIC(0);
		exynos5_device_hs_i2c0.resource[0].end = EXYNOS5410_PA_HSIIC(0) + SZ_4K - 1;
		exynos5_device_hs_i2c0.resource[1].start = IRQ_IIC4;
		exynos5_device_hs_i2c0.resource[1].end = IRQ_IIC4;
	} else if (soc_is_exynos5420()) {
		exynos5_device_hs_i2c0.resource[0].start = EXYNOS5420_PA_HSIIC0;
		exynos5_device_hs_i2c0.resource[0].end = EXYNOS5420_PA_HSIIC0 + SZ_4K - 1;
		exynos5_device_hs_i2c0.resource[1].start = IRQ_IIC4;
		exynos5_device_hs_i2c0.resource[1].end = IRQ_IIC4;
	}
}
Esempio n. 3
0
void s3c_i2c1_cfg_gpio(struct platform_device *dev)
{
	if (soc_is_exynos5250())
		s3c_gpio_cfgall_range(EXYNOS5_GPB3(2), 2,
				      S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);

	else if (soc_is_exynos5260())
		s3c_gpio_cfgall_range(EXYNOS5260_GPB4(2), 2,
				      S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);

	else if (soc_is_exynos5410())
		s3c_gpio_cfgall_range(EXYNOS5410_GPB3(2), 2,
				      S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);

	else if (soc_is_exynos5420())
		s3c_gpio_cfgall_range(EXYNOS5420_GPB3(2), 2,
				      S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);

	else if (soc_is_exynos3250())
		s3c_gpio_cfgall_range(EXYNOS3_GPD1(2), 2,
				      S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);

	else	/* EXYNOS4210, EXYNOS4212, and EXYNOS4412 */
		s3c_gpio_cfgall_range(EXYNOS4_GPD1(2), 2,
				      S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
}
Esempio n. 4
0
static void exynos_sfr_save(unsigned int i)
{
	struct dw_mci *host = dw_mci_lpa_host[i];

	dw_mci_save_sfr[i][0] = __raw_readl(host->regs + DWMCI_CTRL);
	dw_mci_save_sfr[i][1] = __raw_readl(host->regs + DWMCI_PWREN);
	dw_mci_save_sfr[i][2] = __raw_readl(host->regs + DWMCI_CLKDIV);
	dw_mci_save_sfr[i][3] = __raw_readl(host->regs + DWMCI_CLKSRC);
	dw_mci_save_sfr[i][4] = __raw_readl(host->regs + DWMCI_CLKENA);
	dw_mci_save_sfr[i][5] = __raw_readl(host->regs + DWMCI_TMOUT);
	dw_mci_save_sfr[i][6] = __raw_readl(host->regs + DWMCI_CTYPE);
	dw_mci_save_sfr[i][7] = __raw_readl(host->regs + DWMCI_INTMASK);
	dw_mci_save_sfr[i][8] = __raw_readl(host->regs + DWMCI_FIFOTH);
	dw_mci_save_sfr[i][9] = __raw_readl(host->regs + DWMCI_UHS_REG);
	dw_mci_save_sfr[i][10] = __raw_readl(host->regs + DWMCI_BMOD);
	dw_mci_save_sfr[i][11] = __raw_readl(host->regs + DWMCI_PLDMND);
	dw_mci_save_sfr[i][12] = __raw_readl(host->regs + DWMCI_DBADDR);
	dw_mci_save_sfr[i][13] = __raw_readl(host->regs + DWMCI_IDINTEN);
	dw_mci_save_sfr[i][14] = __raw_readl(host->regs + DWMCI_CLKSEL);
	dw_mci_save_sfr[i][15] = __raw_readl(host->regs + DWMCI_CDTHRCTL);

	if (soc_is_exynos3250() || soc_is_exynos4415() ||
	soc_is_exynos5420() || soc_is_exynos5260() || soc_is_exynos3470()) {
		dw_mci_save_sfr[i][16] = __raw_readl(host->regs +
				DWMCI_DDR200_RDDQS_EN + 0x70);
		dw_mci_save_sfr[i][17] = __raw_readl(host->regs +
				DWMCI_DDR200_DLINE_CTRL + 0x70);
	} else {
		dw_mci_save_sfr[i][16] = __raw_readl(host->regs +
				DWMCI_DDR200_RDDQS_EN);
		dw_mci_save_sfr[i][17] = __raw_readl(host->regs +
				DWMCI_DDR200_DLINE_CTRL);
	}
}
Esempio n. 5
0
void __init exynos_dwmci_set_platdata(struct dw_mci_board *pd, u32 slot_id)
{
    struct dw_mci_board *npd = NULL;

    if ((soc_is_exynos4210()) || soc_is_exynos4212() ||
            soc_is_exynos4412()) {
        npd = s3c_set_platdata(pd, sizeof(struct dw_mci_board),
                               &exynos4_device_dwmci);
    } else if (soc_is_exynos5250() || soc_is_exynos5410() ||
               soc_is_exynos5420()) {
        if (slot_id < ARRAY_SIZE(exynos5_dwmci_devs))
            npd = s3c_set_platdata(pd, sizeof(struct dw_mci_board),
                                   exynos5_dwmci_devs[slot_id]);
        else
            pr_err("%s: slot %d is not supported\n", __func__,
                   slot_id);
    }

    if (!npd)
        return;

    if (!npd->init)
        npd->init = exynos_dwmci_init;
    if (!npd->get_bus_wd)
        npd->get_bus_wd = exynos_dwmci_get_bus_wd;
    if (!npd->set_io_timing)
        npd->set_io_timing = exynos_dwmci_set_io_timing;
    if (!npd->get_ocr)
        npd->get_ocr = exynos_dwmci_get_ocr;
    if (!npd->clk_tbl)
        npd->clk_tbl = exynos_dwmci_clk_rates;
    if (!npd->cfg_smu)
        npd->cfg_smu = exynos_dwmci_cfg_smu;
}
Esempio n. 6
0
void change_all_power_base_to(unsigned int cluster)
{
	int i;
	int offset = 0;

	if (!soc_is_exynos5410() && !soc_is_exynos5420())
		return;

	if (soc_is_exynos5410())  {
		if (samsung_rev() < EXYNOS5410_REV_1_0) {
			if (cluster == 0)
				offset = 4;
		} else {
			if (cluster != 0)
				offset = 4;
		}
	} else {
		if (cluster)
			offset = 4;
	}

	for (i = 0; i < 4; i++) {
		cpu_boot_info[i].power_base =
			EXYNOS_ARM_CORE_CONFIGURATION(offset + i);
	}
}
/*
 * TMU treats temperature as a mapped temperature code.
 * The temperature is converted differently depending on the calibration type.
 */
static int temp_to_code(struct exynos_tmu_data *data, u8 temp, int id)
{
	struct exynos_tmu_platform_data *pdata = data->pdata;
	int temp_code;
	int fuse_id;

	if (data->soc == SOC_ARCH_EXYNOS4)
		/* temp should range between 25 and 125 */
		if (temp < 25 || temp > 125) {
			temp_code = -EINVAL;
			goto out;
		}

	if (soc_is_exynos5420()) {
		switch (id) {
		case 0:
			fuse_id = 0;
			break;
		case 1:
			fuse_id = 1;
			break;
		case 2:
			fuse_id = 3;
			break;
		case 3:
			fuse_id = 4;
			break;
		case 4:
			fuse_id = 2;
			break;
		default:
			pr_err("unknown sensor id on Exynos5420\n");
			BUG_ON(1);
			break;
		}
	} else {
		fuse_id = id;
	}

	switch (pdata->cal_type) {
	case TYPE_TWO_POINT_TRIMMING:
		temp_code = (temp - 25) *
		    (data->temp_error2[fuse_id] - data->temp_error1[fuse_id]) /
		    (85 - 25) + data->temp_error1[fuse_id];
		break;
	case TYPE_ONE_POINT_TRIMMING:
		temp_code = temp + data->temp_error1[fuse_id] - 25;
		break;
	default:
		temp_code = temp + EXYNOS_TMU_DEF_CODE_TO_TEMP_OFFSET;
		break;
	}
out:
	return temp_code;
}
Esempio n. 8
0
static inline void __iomem *cpu_boot_reg(int cpu)
{
	void __iomem *boot_reg;

	boot_reg = cpu_boot_reg_base();
	if (soc_is_exynos4412())
		boot_reg += 4*cpu;
	else if (soc_is_exynos5420())
		boot_reg += 4;
	return boot_reg;
}
Esempio n. 9
0
static inline void __iomem *cpu_boot_reg(int cpu)
{
	void __iomem *boot_reg;

	boot_reg = cpu_boot_reg_base();
	if (!boot_reg)
		return ERR_PTR(-ENODEV);
	if (soc_is_exynos4412())
		boot_reg += 4*cpu;
	else if (soc_is_exynos5420() || soc_is_exynos5800())
		boot_reg += 4;
	return boot_reg;
}
Esempio n. 10
0
static int exynos_spdif_cfg_gpio(struct platform_device *pdev)
{
	/* configure GPIO for SPDIF port */
	if (soc_is_exynos5250())
		s3c_gpio_cfgpin_range(EXYNOS5_GPB1(0), 2, S3C_GPIO_SFN(4));
	else if (soc_is_exynos5410())
		s3c_gpio_cfgpin_range(EXYNOS5410_GPB1(0), 2, S3C_GPIO_SFN(4));
	else if (soc_is_exynos5420())
		s3c_gpio_cfgpin_range(EXYNOS5420_GPB1(0), 2, S3C_GPIO_SFN(4));
	else if (soc_is_exynos4210() || soc_is_exynos4212() || soc_is_exynos4412())
		s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(4));

	return 0;
}
Esempio n. 11
0
void exynos5_hs_i2c1_cfg_gpio(struct platform_device *dev)
{
	if (soc_is_exynos5250())
		s3c_gpio_cfgall_range(EXYNOS5_GPB3(2), 2,
				S3C_GPIO_SFN(4), S3C_GPIO_PULL_UP);
	else if (soc_is_exynos5410())
		s3c_gpio_cfgall_range(EXYNOS5410_GPA2(2), 2,
				S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP);
	else if (soc_is_exynos5420())
		s3c_gpio_cfgall_range(EXYNOS5420_GPA2(2), 2,
				S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP);
	else
		pr_err("failed to configure gpio for hs-i2c1\n");
}
Esempio n. 12
0
void s3c_i2c0_cfg_gpio(struct platform_device *dev)
{
	if (soc_is_exynos5250())
		s3c_gpio_cfgall_range(EXYNOS5_GPB3(0), 2,
				      S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);

	else if (soc_is_exynos5410())
		s3c_gpio_cfgall_range(EXYNOS5410_GPB3(0), 2,
				      S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);

	else if (soc_is_exynos5420())
		s3c_gpio_cfgall_range(EXYNOS5420_GPB3(0), 2,
				      S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);

	else	/* EXYNOS4210, EXYNOS4212, and EXYNOS4412 */
		s3c_gpio_cfgall_range(EXYNOS4_GPD1(0), 2,
				      S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);

	if (soc_is_exynos5420()) {
		s5p_gpio_set_drvstr(EXYNOS5_GPB3(0), S5P_GPIO_DRVSTR_LV4);
		s5p_gpio_set_drvstr(EXYNOS5_GPB3(1), S5P_GPIO_DRVSTR_LV4);
	}

}
Esempio n. 13
0
void __init exynos5_hs_i2c3_set_platdata(struct exynos5_platform_i2c *pd)
{
	struct exynos5_platform_i2c *npd;

	if (!pd) {
		pd = &default_hs_i2c_data;
		if (soc_is_exynos5260())
			pd->bus_number = 3;
		else
			pd->bus_number = 7;

		pd->speed_mode = HSI2C_FAST_SPD;
	}

	if (soc_is_exynos5260())
		pd->fifo_size = 16;
	else
		pd->fifo_size = 64;

	npd = kmemdup(pd, sizeof(struct exynos5_platform_i2c), GFP_KERNEL);
	if (!npd) {
		printk(KERN_ERR "%s: no memory for platform data\n", __func__);
		return;
	}

	if (!npd->cfg_gpio)
		npd->cfg_gpio = exynos5_hs_i2c3_cfg_gpio;

	exynos5_device_hs_i2c3.dev.platform_data = npd;
	if (soc_is_exynos5410()) {
		exynos5_device_hs_i2c3.resource[0].start = EXYNOS5410_PA_HSIIC(3);
		exynos5_device_hs_i2c3.resource[0].end = EXYNOS5410_PA_HSIIC(3) + SZ_4K - 1;
		exynos5_device_hs_i2c3.resource[1].start = IRQ_IIC7;
		exynos5_device_hs_i2c3.resource[1].end = IRQ_IIC7;
	} else if (soc_is_exynos5420()) {
		exynos5_device_hs_i2c3.resource[0].start = EXYNOS5420_PA_HSIIC3;
		exynos5_device_hs_i2c3.resource[0].end = EXYNOS5420_PA_HSIIC3 + SZ_4K - 1;
		exynos5_device_hs_i2c3.resource[1].start = IRQ_IIC7;
		exynos5_device_hs_i2c3.resource[1].end = IRQ_IIC7;
	} else if (soc_is_exynos5260()) {
		exynos5_device_hs_i2c3.resource[0].start = EXYNOS5260_PA_HSIIC(3);
		exynos5_device_hs_i2c3.resource[0].end = EXYNOS5260_PA_HSIIC(3) + SZ_4K - 1;
		exynos5_device_hs_i2c3.resource[1].start = IRQ_IIC3;
		exynos5_device_hs_i2c3.resource[1].end = IRQ_IIC3;
	}

}
Esempio n. 14
0
static void exynos_dwmci_cfg_smu(void *data, u32 action)
{
    struct dw_mci *host = (struct dw_mci *)data;

    if (!soc_is_exynos5420() || action != 0)
        return;

    /* bypass mode */
    if (host->pdata->ch_num != 2) {
        __raw_writel(0, host->regs + DWMCI_MPSBEGIN0);
        __raw_writel(0xFFFFFFFF, host->regs + DWMCI_MPSEND0);
        __raw_writel(DWMCI_MPSCTRL_SECURE_READ_BIT |
                     DWMCI_MPSCTRL_SECURE_WRITE_BIT |
                     DWMCI_MPSCTRL_NON_SECURE_READ_BIT |
                     DWMCI_MPSCTRL_NON_SECURE_WRITE_BIT |
                     DWMCI_MPSCTRL_VALID, host->regs + DWMCI_MPSCTRL0);
    }
}
Esempio n. 15
0
static int exynos_cfg_i2s_gpio(struct platform_device *pdev)
{
	/* configure GPIO for i2s port */
	struct exynos_gpio_cfg exynos4_cfg[3] = {
				{ EXYNOS4_GPZ(0),  7, S3C_GPIO_SFN(2) },
				{ EXYNOS4_GPC0(0), 5, S3C_GPIO_SFN(2) },
				{ EXYNOS4_GPC1(0), 5, S3C_GPIO_SFN(2) }
	};
	struct exynos_gpio_cfg exynos5_cfg[3] = {
				{ EXYNOS5_GPZ(0),  7, S3C_GPIO_SFN(2) },
				{ EXYNOS5_GPB0(0), 5, S3C_GPIO_SFN(2) },
				{ EXYNOS5_GPB1(0), 5, S3C_GPIO_SFN(2) }
	};
	struct exynos_gpio_cfg exynos5410_cfg[3] = {
				{ EXYNOS5410_GPZ(0),  7, S3C_GPIO_SFN(2) },
				{ EXYNOS5410_GPB0(0), 5, S3C_GPIO_SFN(2) },
				{ EXYNOS5410_GPB1(0), 5, S3C_GPIO_SFN(2) }
	};
	struct exynos_gpio_cfg exynos5420_cfg[3] = {
				{ EXYNOS5420_GPZ(0),  7, S3C_GPIO_SFN(2) },
				{ EXYNOS5420_GPB0(0), 5, S3C_GPIO_SFN(2) },
				{ EXYNOS5420_GPB1(0), 5, S3C_GPIO_SFN(2) }
	};

	if (pdev->id < 0 || pdev->id > 2) {
		printk(KERN_ERR "Invalid Device %d\n", pdev->id);
		return -EINVAL;
	}

	if (soc_is_exynos5250())
		s3c_gpio_cfgpin_range(exynos5_cfg[pdev->id].addr,
			exynos5_cfg[pdev->id].num, exynos5_cfg[pdev->id].bit);
	else if (soc_is_exynos5410())
		s3c_gpio_cfgpin_range(exynos5410_cfg[pdev->id].addr,
			exynos5410_cfg[pdev->id].num, exynos5410_cfg[pdev->id].bit);
	else if (soc_is_exynos5420())
		s3c_gpio_cfgpin_range(exynos5420_cfg[pdev->id].addr,
			exynos5420_cfg[pdev->id].num, exynos5420_cfg[pdev->id].bit);
	else if (soc_is_exynos4210() || soc_is_exynos4212() || soc_is_exynos4412())
		s3c_gpio_cfgpin_range(exynos4_cfg[pdev->id].addr,
			exynos4_cfg[pdev->id].num, exynos4_cfg[pdev->id].bit);

	return 0;
}
Esempio n. 16
0
void s3c_adc_phy_exit(void)
{
	u32 reg;

	if (soc_is_exynos5250() || soc_is_exynos4415() ||
			soc_is_exynos3470() || soc_is_exynos3250()) {
		reg = __raw_readl(EXYNOS5250_ADC_PHY_CONTROL);
		reg &= ~EXYNOS5_ADC_PHY_ENABLE;
		reg |= EXYNOS5_ADC_PHY_ENABLE;
		__raw_writel(reg, EXYNOS5250_ADC_PHY_CONTROL);
	} else if (soc_is_exynos5410() || soc_is_exynos5420()) {
		reg = __raw_readl(EXYNOS5410_ADC_PHY_CONTROL);
		reg &= ~EXYNOS5_ADC_PHY_ENABLE;
		__raw_writel(reg, EXYNOS5410_ADC_PHY_CONTROL);
	} else if (soc_is_exynos5260()) {
		reg = __raw_readl(EXYNOS5260_ADC_PHY_CONTROL);
		reg &= ~EXYNOS5_ADC_PHY_ENABLE;
		__raw_writel(reg, EXYNOS5260_ADC_PHY_CONTROL);
	}
}
void exynos_sys_powerdown_conf(enum sys_powerdown mode)
{
	unsigned int i;

	if (soc_is_exynos5250())
		exynos5_init_pmu();

	if (soc_is_exynos5420())
		exynos_set_core_flag();

	for (i = 0; (exynos_pmu_config[i].reg != PMU_TABLE_END) ; i++)
		__raw_writel(exynos_pmu_config[i].val[mode],
				exynos_pmu_config[i].reg);

	if (soc_is_exynos4412()) {
		for (i = 0; exynos4412_pmu_config[i].reg != PMU_TABLE_END ; i++)
			__raw_writel(exynos4412_pmu_config[i].val[mode],
				exynos4412_pmu_config[i].reg);
	}
}
/* sysfs interface : /sys/devices/platform/exynos5-tmu/curr_temp */
static ssize_t
exynos_thermal_curr_temp(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct exynos_tmu_data *data = th_zone->sensor_conf->private_data;
	unsigned long temp[EXYNOS_TMU_COUNT];
	int i, len = 0;

	if (!(soc_is_exynos5410() || soc_is_exynos5420() || soc_is_exynos5260()))
		return -EPERM;

	if (EXYNOS_TMU_COUNT < 4)
		return -EPERM;

	mutex_lock(&data->lock);
	clk_enable(data->clk);

	for (i = 0; i < EXYNOS_TMU_COUNT; i++) {
		u8 temp_code = readb(data->base[i] + EXYNOS_TMU_REG_CURRENT_TEMP);
		if (temp_code == 0xff)
			temp[i] = 0;
		else
			temp[i] = code_to_temp(data, temp_code, i) * 10;
	}

	clk_disable(data->clk);
	mutex_unlock(&data->lock);

	len += sprintf(&buf[len], "%ld,", temp[0]);
	len += sprintf(&buf[len], "%ld,", temp[1]);
	len += sprintf(&buf[len], "%ld,", temp[2]);
	len += sprintf(&buf[len], "%ld,", temp[3]);
	len += sprintf(&buf[len], "%ld\n", temp[4]);

	return len;
}
static int __init exynos_dma_init(void)
{
	if (of_have_populated_dt())
		return 0;

	if (soc_is_exynos4210()) {
		exynos_pdma0_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos4210_pdma0_peri);
		exynos_pdma0_pdata.peri_id = exynos4210_pdma0_peri;
		exynos_pdma1_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos4210_pdma1_peri);
		exynos_pdma1_pdata.peri_id = exynos4210_pdma1_peri;
	} else if (soc_is_exynos4212() || soc_is_exynos4412()) {
		exynos_pdma0_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos4212_pdma0_peri);
		exynos_pdma0_pdata.peri_id = exynos4212_pdma0_peri;
		exynos_pdma1_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos4212_pdma1_peri);
		exynos_pdma1_pdata.peri_id = exynos4212_pdma1_peri;
	} else if (soc_is_exynos4415()) {
		exynos_pdma0_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos4415_pdma0_peri);
		exynos_pdma0_pdata.peri_id = exynos4415_pdma0_peri;
		exynos_pdma1_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos4415_pdma1_peri);
		exynos_pdma1_pdata.peri_id = exynos4415_pdma1_peri;
	} else if (soc_is_exynos5250()) {
		exynos_pdma0_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos5250_pdma0_peri);
		exynos_pdma0_pdata.peri_id = exynos5250_pdma0_peri;
		exynos_pdma1_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos5250_pdma1_peri);
		exynos_pdma1_pdata.peri_id = exynos5250_pdma1_peri;
	} else if (soc_is_exynos5410()) {
		exynos_pdma0_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos5410_pdma0_peri);
		exynos_pdma0_pdata.peri_id = exynos5410_pdma0_peri;
		exynos_pdma1_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos5410_pdma1_peri);
		exynos_pdma1_pdata.peri_id = exynos5410_pdma1_peri;
	} else if (soc_is_exynos5420()) {
		exynos_pdma0_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos5420_pdma0_peri);
		exynos_pdma0_pdata.peri_id = exynos5420_pdma0_peri;
		exynos_pdma1_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos5420_pdma1_peri);
		exynos_pdma1_pdata.peri_id = exynos5420_pdma1_peri;
		exynos_adma0_pdata.nr_valid_peri =
			ARRAY_SIZE(adma0_peri);
		exynos_adma0_pdata.peri_id = adma0_peri;
	} else if (soc_is_exynos5260()) {
		exynos5260_pdma0_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos5260_pdma0_peri);
		exynos5260_pdma0_pdata.peri_id = exynos5260_pdma0_peri;
	} else if (soc_is_exynos3470()) {
		exynos_pdma0_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos3470_pdma0_peri);
		exynos_pdma0_pdata.peri_id = exynos3470_pdma0_peri;
		exynos_pdma1_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos3470_pdma1_peri);
		exynos_pdma1_pdata.peri_id = exynos3470_pdma1_peri;
	} else if (soc_is_exynos3250()) {
		exynos_pdma0_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos3250_pdma0_peri);
		exynos_pdma0_pdata.peri_id = exynos3250_pdma0_peri;
		exynos_pdma1_pdata.nr_valid_peri =
			ARRAY_SIZE(exynos3250_pdma1_peri);
		exynos_pdma1_pdata.peri_id = exynos3250_pdma1_peri;
	}

	if (soc_is_exynos4210() || soc_is_exynos4212() ||
		soc_is_exynos4412() || soc_is_exynos3470()) {
		exynos_pdma0_device.res.start = EXYNOS4_PA_PDMA0;
		exynos_pdma0_device.res.end = EXYNOS4_PA_PDMA0 + SZ_4K;
		exynos_pdma0_device.irq[0] = EXYNOS4_IRQ_PDMA0;
		exynos_pdma1_device.res.start = EXYNOS4_PA_PDMA1;
		exynos_pdma1_device.res.end = EXYNOS4_PA_PDMA1 + SZ_4K;
		exynos_pdma1_device.irq[0] = EXYNOS4_IRQ_PDMA1;
		exynos_mdma_device.res.start = EXYNOS4_PA_MDMA1;
		exynos_mdma_device.res.end = EXYNOS4_PA_MDMA1 + SZ_4K;
		exynos_mdma_device.irq[0] = EXYNOS4_IRQ_MDMA1;
	} else if (soc_is_exynos5410() || soc_is_exynos5420()) {
		exynos_mdma_device.res.start = EXYNOS5_PA_MDMA0;
		exynos_mdma_device.res.end = EXYNOS5_PA_MDMA0 + SZ_4K;
		exynos_mdma_device.irq[0] = EXYNOS5_IRQ_MDMA0;
	} else if (soc_is_exynos5260()) {
		exynos5260_pdma0_device.res.start = EXYNOS5260_PA_PDMA0;
		exynos5260_pdma0_device.res.end = EXYNOS5260_PA_PDMA0 + SZ_4K;
		exynos5260_pdma0_device.irq[0] = EXYNOS5260_IRQ_PDMA0;
		exynos5260_mdma_device.res.start = EXYNOS5260_PA_NS_MDMA0;
		exynos5260_mdma_device.res.end = EXYNOS5260_PA_NS_MDMA0 + SZ_4K;
		exynos5260_mdma_device.irq[0] = EXYNOS5260_IRQ_MDMA_1;
		exynos5260_adma_device.res.start = EXYNOS5260_PA_ADMA0;
		exynos5260_adma_device.res.end = EXYNOS5260_PA_ADMA0 + SZ_4K;
		exynos5260_adma_device.irq[0] = EXYNOS5260_IRQ_ADMA;
	} else if (soc_is_exynos4415()) {
		exynos_pdma0_device.res.start = EXYNOS4_PA_PDMA0;
		exynos_pdma0_device.res.end = EXYNOS4_PA_PDMA0 + SZ_4K;
		exynos_pdma0_device.irq[0] = EXYNOS4_IRQ_PDMA0;
		exynos_pdma1_device.res.start = EXYNOS4_PA_PDMA1;
		exynos_pdma1_device.res.end = EXYNOS4_PA_PDMA1 + SZ_4K;
		exynos_pdma1_device.irq[0] = EXYNOS4_IRQ_PDMA1;
		exynos_mdma_device.res.start = EXYNOS4_PA_MDMA1;
		exynos_mdma_device.res.end = EXYNOS4_PA_MDMA1 + SZ_4K;
		exynos_mdma_device.irq[0] = EXYNOS4_IRQ_MDMA1;
	} else if (soc_is_exynos3250()) {
		exynos_pdma0_device.res.start = EXYNOS3_PA_PDMA0;
		exynos_pdma0_device.res.end = EXYNOS3_PA_PDMA0 + SZ_4K;
		exynos_pdma0_device.irq[0] = EXYNOS3_IRQ_PDMA0;
		exynos_pdma1_device.res.start = EXYNOS3_PA_PDMA1;
		exynos_pdma1_device.res.end = EXYNOS3_PA_PDMA1 + SZ_4K;
		exynos_pdma1_device.irq[0] = EXYNOS3_IRQ_PDMA1;
	}

	if (soc_is_exynos5260()) {
		dma_cap_set(DMA_SLAVE, exynos5260_pdma0_pdata.cap_mask);
		dma_cap_set(DMA_CYCLIC, exynos5260_pdma0_pdata.cap_mask);
		amba_device_register(&exynos5260_pdma0_device, &iomem_resource);

		dma_cap_set(DMA_MEMCPY, exynos5260_mdma_pdata.cap_mask);
		amba_device_register(&exynos5260_mdma_device, &iomem_resource);

		dma_cap_set(DMA_SLAVE, exynos5260_adma_pdata.cap_mask);
		dma_cap_set(DMA_CYCLIC, exynos5260_adma_pdata.cap_mask);
		amba_device_register(&exynos5260_adma_device, &iomem_resource);
	} else if (soc_is_exynos3250()) {
		dma_cap_set(DMA_SLAVE, exynos_pdma0_pdata.cap_mask);
		dma_cap_set(DMA_CYCLIC, exynos_pdma0_pdata.cap_mask);
		amba_device_register(&exynos_pdma0_device, &iomem_resource);

		dma_cap_set(DMA_SLAVE, exynos_pdma1_pdata.cap_mask);
		dma_cap_set(DMA_CYCLIC, exynos_pdma1_pdata.cap_mask);
		amba_device_register(&exynos_pdma1_device, &iomem_resource);
	} else {
		dma_cap_set(DMA_SLAVE, exynos_pdma0_pdata.cap_mask);
		dma_cap_set(DMA_CYCLIC, exynos_pdma0_pdata.cap_mask);
		amba_device_register(&exynos_pdma0_device, &iomem_resource);

		dma_cap_set(DMA_SLAVE, exynos_pdma1_pdata.cap_mask);
		dma_cap_set(DMA_CYCLIC, exynos_pdma1_pdata.cap_mask);
		amba_device_register(&exynos_pdma1_device, &iomem_resource);

		dma_cap_set(DMA_MEMCPY, exynos_mdma_pdata.cap_mask);
		amba_device_register(&exynos_mdma_device, &iomem_resource);
	}

	if (soc_is_exynos5420()) {
		dma_cap_set(DMA_SLAVE, exynos_adma0_pdata.cap_mask);
		dma_cap_set(DMA_CYCLIC, exynos_adma0_pdata.cap_mask);
		amba_device_register(&exynos_adma0_device, &iomem_resource);
	}

	return 0;
}
Esempio n. 20
0
static void exynos_dwmci_set_io_timing(void *data, unsigned int tuning, unsigned char timing)
{
    struct dw_mci *host = (struct dw_mci *)data;
    struct dw_mci_board *pdata = host->pdata;
    struct dw_mci_clk *clk_tbl = pdata->clk_tbl;
    u32 clksel, rddqs, dline;
    u32 sclkin, cclkin;
    unsigned char timing_org = timing;

    if (timing > MMC_TIMING_MMC_HS200_DDR_ES) {
        pr_err("%s: timing(%d): not suppored\n", __func__, timing);
        return;
    }

    if (timing == MMC_TIMING_MMC_HS200_DDR_ES)
        timing = MMC_TIMING_MMC_HS200_DDR;

    sclkin = clk_tbl[timing].sclkin;
    cclkin = clk_tbl[timing].cclkin;
    rddqs = DWMCI_DDR200_RDDQS_EN_DEF;
    dline = DWMCI_DDR200_DLINE_CTRL_DEF;
    clksel = __raw_readl(host->regs + DWMCI_CLKSEL);

    if (host->bus_hz != cclkin) {
        host->bus_hz = cclkin;
        host->current_speed = 0;
        clk_set_rate(host->cclk, sclkin);
    }

    if (timing == MMC_TIMING_MMC_HS200_DDR) {
        clksel = (pdata->ddr200_timing & 0xfffffff8) | pdata->clk_smpl;

        if (!tuning) {
            rddqs |= DWMCI_RDDQS_EN;
            if (timing_org == MMC_TIMING_MMC_HS200_DDR_ES) {
                rddqs |= DWMCI_RESP_RCLK_MODE;
            }
#if defined(CONFIG_V1A) || defined(CONFIG_V2A) || defined(CONFIG_CHAGALL)
            dline = DWMCI_FIFO_CLK_DELAY_CTRL(0x2) | DWMCI_RD_DQS_DELAY_CTRL(110);
#elif defined(CONFIG_N1A) || defined(CONFIG_N2A)
            dline = DWMCI_FIFO_CLK_DELAY_CTRL(0x2) | DWMCI_RD_DQS_DELAY_CTRL(100);
#else
            dline = DWMCI_FIFO_CLK_DELAY_CTRL(0x2) | DWMCI_RD_DQS_DELAY_CTRL(90);
#endif
            host->quirks &= ~DW_MCI_QUIRK_NO_DETECT_EBIT;
        }
    } else if (timing == MMC_TIMING_MMC_HS200 ||
               timing == MMC_TIMING_UHS_SDR104) {
        clksel = (clksel & 0xfff8ffff) | (pdata->clk_drv << 16);
    } else if (timing == MMC_TIMING_UHS_SDR50) {
        clksel = (clksel & 0xfff8ffff) | (pdata->clk_drv << 16);
    } else if (timing == MMC_TIMING_UHS_DDR50) {
        clksel = pdata->ddr_timing;
    } else {
        clksel = pdata->sdr_timing;
    }

    __raw_writel(clksel, host->regs + DWMCI_CLKSEL);

    if (soc_is_exynos5420()) {
        __raw_writel(rddqs, host->regs + DWMCI_DDR200_RDDQS_EN + 0x70);
        __raw_writel(dline, host->regs + DWMCI_DDR200_DLINE_CTRL + 0x70);
    } else {
        __raw_writel(rddqs, host->regs + DWMCI_DDR200_RDDQS_EN);
        __raw_writel(dline, host->regs + DWMCI_DDR200_DLINE_CTRL);
    }
}
Esempio n. 21
0
static void exynos_sfr_restore(unsigned int i)
{
	struct dw_mci *host = dw_mci_lpa_host[i];

	int startbit_clear = false;
	unsigned int cmd_status = 0;
	unsigned long timeout = jiffies + msecs_to_jiffies(500);

	/*
	 * To update clock configurations, CIU should be enabled.
	 */
	spin_lock(&host->cclk_lock);
	dw_mci_ciu_clk_en(host);
	spin_unlock(&host->cclk_lock);

	__raw_writel(dw_mci_save_sfr[i][0], host->regs + DWMCI_CTRL);
	__raw_writel(dw_mci_save_sfr[i][1], host->regs + DWMCI_PWREN);
	__raw_writel(dw_mci_save_sfr[i][2], host->regs + DWMCI_CLKDIV);
	__raw_writel(dw_mci_save_sfr[i][3], host->regs + DWMCI_CLKSRC);
	__raw_writel(dw_mci_save_sfr[i][4], host->regs + DWMCI_CLKENA);
	__raw_writel(dw_mci_save_sfr[i][5], host->regs + DWMCI_TMOUT);
	__raw_writel(dw_mci_save_sfr[i][6], host->regs + DWMCI_CTYPE);
	__raw_writel(dw_mci_save_sfr[i][7], host->regs + DWMCI_INTMASK);
	__raw_writel(dw_mci_save_sfr[i][8], host->regs + DWMCI_FIFOTH);
	__raw_writel(dw_mci_save_sfr[i][9], host->regs + DWMCI_UHS_REG);
	__raw_writel(dw_mci_save_sfr[i][10], host->regs + DWMCI_BMOD);
	__raw_writel(dw_mci_save_sfr[i][11], host->regs + DWMCI_PLDMND);
	__raw_writel(dw_mci_save_sfr[i][12], host->regs + DWMCI_DBADDR);
	__raw_writel(dw_mci_save_sfr[i][13], host->regs + DWMCI_IDINTEN);
	__raw_writel(dw_mci_save_sfr[i][14], host->regs + DWMCI_CLKSEL);
	__raw_writel(dw_mci_save_sfr[i][15], host->regs + DWMCI_CDTHRCTL);

	if (soc_is_exynos3250() || soc_is_exynos4415() ||
	soc_is_exynos5420() || soc_is_exynos5260() || soc_is_exynos3470()) {
		__raw_writel(dw_mci_save_sfr[i][16], host->regs +
				DWMCI_DDR200_RDDQS_EN + 0x70);
		__raw_writel(dw_mci_save_sfr[i][17], host->regs +
				DWMCI_DDR200_DLINE_CTRL + 0x70);
	} else {
		__raw_writel(dw_mci_save_sfr[i][16], host->regs +
				DWMCI_DDR200_RDDQS_EN);
		__raw_writel(dw_mci_save_sfr[i][17], host->regs +
				DWMCI_DDR200_DLINE_CTRL);
	}

	__raw_writel(0, host->regs + DWMCI_CMDARG);
	wmb();

#ifdef CONFIG_BCM4334
	if (i == 1)
		return;
#endif

	__raw_writel((DWMCI_CMD_START | DWMCI_CMD_UPD_CLK | DWMCI_CMD_PRV_DAT_WAIT),
					host->regs + DWMCI_CMD);

	while (time_before(jiffies, timeout)) {
		cmd_status = __raw_readl(host->regs + DWMCI_CMD);
		if (!(cmd_status & DWMCI_CMD_START)) {
			startbit_clear = true;
			return;
		}
	}

	if (startbit_clear == false)
		dev_err(&host->dev, "CMD start bit stuck %02d\n", i);
}
Esempio n. 22
0
static void exynos_dwmci_set_io_timing(void *data, unsigned int tuning,
		unsigned char timing, struct mmc_host *mmc)
{
	struct dw_mci *host = (struct dw_mci *)data;
	struct dw_mci_board *pdata = host->pdata;
	struct dw_mci_clk *clk_tbl = pdata->clk_tbl;
	u32 clksel, rddqs, dline;
	u32 sclkin, cclkin;
	unsigned char timing_init = MMC_TIMING_INIT;

	if (timing > MMC_TIMING_MMC_HS200_DDR) {
		pr_err("%s: timing(%d): not suppored\n", __func__, timing);
		return;
	}

	sclkin = clk_tbl[timing].sclkin;
	cclkin = clk_tbl[timing].cclkin;
	if (timing == MMC_TIMING_LEGACY &&
			pdata->misc_flag & DW_MMC_MISC_LOW_FREQ_HOOK) {
		if (mmc == NULL || (mmc && mmc->ios.clock <= mmc->f_init)) {
			sclkin = clk_tbl[timing_init].sclkin;
			cclkin = clk_tbl[timing_init].cclkin;
		}
	}
	rddqs = DWMCI_DDR200_RDDQS_EN_DEF;
	dline = DWMCI_DDR200_DLINE_CTRL_DEF;
	clksel = __raw_readl(host->regs + DWMCI_CLKSEL);

	if (host->bus_hz != cclkin) {
		host->bus_hz = cclkin;
		host->current_speed = 0;
		if (host->cclk2)
			clk_set_rate(host->cclk2, sclkin);
		clk_set_rate(host->cclk, sclkin);
	}

	if (timing == MMC_TIMING_MMC_HS200_DDR) {
		clksel = (pdata->ddr200_timing & 0xfffffff8) | pdata->clk_smpl;
		if (pdata->is_fine_tuned)
			clksel |= BIT(6);

		if (!tuning) {
			rddqs |= DWMCI_RDDQS_EN;
			if (host->pdata->delay_line)
				dline = DWMCI_FIFO_CLK_DELAY_CTRL(0x2) |
					DWMCI_RD_DQS_DELAY_CTRL(host->pdata->delay_line);
			else
				dline = DWMCI_FIFO_CLK_DELAY_CTRL(0x2) |
					DWMCI_RD_DQS_DELAY_CTRL(90);
			host->quirks &= ~DW_MCI_QUIRK_NO_DETECT_EBIT;
		}
	} else if (timing == MMC_TIMING_MMC_HS200 ||
			timing == MMC_TIMING_UHS_SDR104) {
		clksel = (clksel & 0xfff8ffff) | (pdata->clk_drv << 16);
	} else if (timing == MMC_TIMING_UHS_SDR50) {
		clksel = (clksel & 0xfff8ffff) | (pdata->clk_drv << 16);
	} else if (timing == MMC_TIMING_UHS_DDR50) {
		clksel = pdata->ddr_timing;
	} else {
		clksel = pdata->sdr_timing;
	}

	__raw_writel(clksel, host->regs + DWMCI_CLKSEL);

	if (soc_is_exynos3250() || soc_is_exynos4415() ||
	soc_is_exynos5420() || soc_is_exynos5260() || soc_is_exynos3470()) {
		__raw_writel(rddqs, host->regs + DWMCI_DDR200_RDDQS_EN + 0x70);
		__raw_writel(dline, host->regs + DWMCI_DDR200_DLINE_CTRL + 0x70);
		if (timing == MMC_TIMING_MMC_HS200_DDR)
			__raw_writel(0x1, host->regs + DWMCI_DDR200_ASYNC_FIFO_CTRL + 0x70);
	} else {
		__raw_writel(rddqs, host->regs + DWMCI_DDR200_RDDQS_EN);
		__raw_writel(dline, host->regs + DWMCI_DDR200_DLINE_CTRL);
		if (timing == MMC_TIMING_MMC_HS200_DDR)
			__raw_writel(0x1, host->regs + DWMCI_DDR200_ASYNC_FIFO_CTRL);
	}
}
/*
 * Calculate a temperature value from a temperature code.
 * The unit of the temperature is degree Celsius.
 */
static int code_to_temp(struct exynos_tmu_data *data, u8 temp_code, int id)
{
	struct exynos_tmu_platform_data *pdata = data->pdata;
	int min, max, temp;
	int fuse_id;

	if (data->soc == SOC_ARCH_EXYNOS4) {
		min = 75;
		max = 175;
	} else {
		min = 31;
		max = 146;
	}

	if (soc_is_exynos5420()) {
		switch (id) {
		case 0:
			fuse_id = 0;
			break;
		case 1:
			fuse_id = 1;
			break;
		case 2:
			fuse_id = 3;
			break;
		case 3:
			fuse_id = 4;
			break;
		case 4:
			fuse_id = 2;
			break;
		default:
			pr_err("unknown sensor id on Exynos5420\n");
			BUG_ON(1);
			break;
		}
	} else {
		fuse_id = id;
	}

	/* temp_code should range between min and max */
	if (temp_code < min || temp_code > max) {
		temp = -ENODATA;
		goto out;
	}

	switch (pdata->cal_type) {
	case TYPE_TWO_POINT_TRIMMING:
		temp = (temp_code - data->temp_error1[fuse_id]) * (85 - 25) /
		    (data->temp_error2[fuse_id] - data->temp_error1[fuse_id]) + 25;
		break;
	case TYPE_ONE_POINT_TRIMMING:
		temp = temp_code - data->temp_error1[fuse_id] + 25;
		break;
	default:
		temp = temp_code - EXYNOS_TMU_DEF_CODE_TO_TEMP_OFFSET;
		break;
	}
out:
	return temp;
}
static int exynos_tmu_read(struct exynos_tmu_data *data)
{
	u8 temp_code;
	int temp, i, max = INT_MIN, min = INT_MAX, gpu_temp = 0;

#ifdef CONFIG_ARM_EXYNOS5410_BUS_DEVFREQ
	enum tmu_noti_state_t cur_state;
#endif
	int alltemp[EXYNOS_TMU_COUNT] = {0,};

	if (!th_zone || !th_zone->therm_dev)
		return -EPERM;

	mutex_lock(&data->lock);
	clk_enable(data->clk);

	for (i = 0; i < EXYNOS_TMU_COUNT; i++) {
		temp_code = readb(data->base[i] + EXYNOS_TMU_REG_CURRENT_TEMP);
		temp = code_to_temp(data, temp_code, i);
		if (temp < 0)
			temp = 0;
		alltemp[i] = temp;

		if (temp > max)
			max = temp;
		if (temp < min)
			min = temp;
		if (soc_is_exynos5420() && i == EXYNOS_GPU_NUMBER)
			gpu_temp = temp;
	}
#ifdef CONFIG_SOC_EXYNOS5260
	if (alltemp[EXYNOS_GPU0_NUMBER] > alltemp[EXYNOS_GPU1_NUMBER])
		gpu_temp = alltemp[EXYNOS_GPU0_NUMBER];
	else
		gpu_temp = alltemp[EXYNOS_GPU1_NUMBER];
#endif

	clk_disable(data->clk);
	mutex_unlock(&data->lock);

#ifdef CONFIG_ARM_EXYNOS5410_BUS_DEVFREQ
	if (min <= COLD_TEMP)
		cur_state = TMU_COLD;

	if (max >= HOT_110)
		cur_state = TMU_110;
	else if (max > HOT_95 && max < HOT_110)
		cur_state = TMU_109;
	else if (max <= HOT_95)
		cur_state = TMU_95;

	if (cur_state >= HOT_95)
		pr_info("[TMU] POLLING: temp=%d, cpu=%d, int=%d, mif=%d, hot_event(for aref)=%d\n",
			max, g_cpufreq, g_intfreq, g_miffreq, cur_state);
	g_count++;

	/* to probe thermal run away caused by fimc-is */
	if ((max >= 112 && tmu_old_state == TMU_110)
			&& g_cam_err_count && g_intfreq == 800000) {
		cur_state = TMU_111;
	}
	exynos_tmu_call_notifier(cur_state);
#endif

	if (soc_is_exynos5420()) {
		/* check temperature state */
		exynos_check_tmu_noti_state(min, max);
		exynos_check_gpu_noti_state(gpu_temp);

#ifdef CONFIG_ARM_EXYNOS5420_BUS_DEVFREQ
		if (!check_mif_probed())
			goto out;
#endif
		exynos_check_mif_noti_state(max);
	}

	if (soc_is_exynos5260()) {
		exynos_check_tmu_noti_state(min, max);
		exynos_check_gpu_noti_state(gpu_temp);
		exynos_check_mif_noti_state(max);
	}

#ifdef CONFIG_ARM_EXYNOS5420_BUS_DEVFREQ
out:
#endif
	th_zone->therm_dev->last_temperature = max * MCELSIUS;
	DTM_DBG("[TMU] TMU0 = %d, TMU1 = %d, TMU2 = %d, TMU3 = %d, TMU4 = %d  -------  CPU : %d  ,  GPU : %d\n",
			alltemp[0], alltemp[1], alltemp[2], alltemp[3], alltemp[4], max, gpu_temp);

	return max;
}
Esempio n. 25
0
static int exynos_power_up_cpu(unsigned int cpu)
{
	unsigned int timeout;
	unsigned int val;
	void __iomem *power_base;
#ifndef CONFIG_EXYNOS5_MP
	unsigned int cluster = (read_cpuid_mpidr() >> 8) & 0xf;
#endif
	unsigned int lpe_bits, lpe_bits_status, enabled = 0;

	power_base = cpu_boot_info[cpu].power_base;
	if (power_base == 0)
		return -EPERM;

	val = __raw_readl(power_base + 0x4);

	if (soc_is_exynos5260()) {
		if (val & 0x40000)
			enabled = 1;
		else {
			val = __raw_readl(power_base + 0x8);
			if (val & EXYNOS5_USE_SC_COUNTER) {
				val &= ~EXYNOS5_USE_SC_COUNTER;
				val |= EXYNOS5_USE_SC_FEEDBACK;
				__raw_writel(val, power_base + 0x8);
			}
			lpe_bits = 0x000F000F;
			lpe_bits_status = 0x4000F;
#ifndef CONFIG_ARM_TRUSTZONE
			__raw_writel(0, cpu_boot_info[cpu].boot_base);
#endif
		}
	} else {
		if (val & EXYNOS_CORE_LOCAL_PWR_EN)
			enabled = 1;
		else {
			lpe_bits = EXYNOS_CORE_LOCAL_PWR_EN;
			lpe_bits_status = EXYNOS_CORE_LOCAL_PWR_EN;
		}
	}

	if (!enabled) {
		__raw_writel(lpe_bits, power_base);

		/* wait max 10 ms until cpu is on */
		timeout = 10;
		while (timeout) {
			val = __raw_readl(power_base + 0x4);

			if ((val & lpe_bits) ==
			     lpe_bits_status)
				break;

			mdelay(1);
			timeout--;
		}

		if (timeout == 0) {
			printk(KERN_ERR "cpu%d power up failed", cpu);

			return -ETIMEDOUT;
		}
	}

#ifdef CONFIG_EXYNOS5_MP
	if (cpu < 4) {
#else
	if (cluster) {
#endif
		while(!__raw_readl(EXYNOS_PMU_SPARE2))
			udelay(10);

		udelay(10);

		if (soc_is_exynos5260()) {
			val = __raw_readl(power_base + 0x4);
			val |= (0xf << 8);
			__raw_writel(val, power_base + 0x4);

			pr_debug("cpu%d: SWRESEET\n", cpu);

			__raw_writel((0x1 << 1), power_base + 0xc);
		} else {
			printk(KERN_DEBUG "cpu%d: SWRESET\n", cpu);

			val = ((1 << 20) | (1 << 8)) << cpu;
			__raw_writel(val, EXYNOS_SWRESET);
		}
	}

	return 0;
}

#else
#error "exynos_power_up_cpu() does not defined"
#endif
int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
{
	unsigned long timeout;
	int ret;

	/*
	 * Set synchronisation state between this boot processor
	 * and the secondary one
	 */
	spin_lock(&boot_lock);

#ifdef CONFIG_WATCHDOG
	if (soc_is_exynos5250())
		watchdog_save();
#endif

#ifdef CONFIG_SOC_EXYNOS4415
	__raw_writel(0x0, cpu_boot_info[cpu].boot_base);
#endif

	ret = exynos_power_up_cpu(cpu);
	if (ret) {
		spin_unlock(&boot_lock);
		return ret;
	}

	/*
	 * The secondary processor is waiting to be released from
	 * the holding pen - release it, then wait for it to flag
	 * that it has been released by resetting pen_release.
	 *
	 * Note that "pen_release" is the hardware CPU ID, whereas
	 * "cpu" is Linux's internal ID.
	 */
	write_pen_release(cpu_logical_map(cpu));

	/*
	 * Send the secondary CPU a soft interrupt, thereby causing
	 * the boot monitor to read the system wide flags register,
	 * and branch to the address found there.
	 */

	timeout = jiffies + (1 * HZ);
	while (time_before(jiffies, timeout)) {
		smp_rmb();

#ifdef CONFIG_ARM_TRUSTZONE
		if (soc_is_exynos4210() || soc_is_exynos4212() ||
			soc_is_exynos5250())
			exynos_smc(SMC_CMD_CPU1BOOT, 0, 0, 0);
		else if (soc_is_exynos4412() || soc_is_exynos4415())
			exynos_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0);
#endif
		__raw_writel(virt_to_phys(exynos4_secondary_startup),
			cpu_boot_info[cpu].boot_base);

#ifdef CONFIG_WATCHDOG
		if (soc_is_exynos5250())
			watchdog_restore();
#endif

		if (soc_is_exynos3250() || soc_is_exynos3470() ||
			soc_is_exynos5410() || soc_is_exynos5420() ||
			soc_is_exynos5260())
			dsb_sev();
		else
			arm_send_ping_ipi(cpu);

		if (pen_release == -1)
			break;

		udelay(10);
	}

	/*
	 * now the secondary core is starting up let it run its
	 * calibrations, then wait for it to finish
	 */
	spin_unlock(&boot_lock);

	return pen_release != -1 ? -ENOSYS : 0;
}
static int __init exynos_pmu_init(void)
{
	unsigned int value;

	exynos_pmu_config = exynos4210_pmu_config;

	if (soc_is_exynos4210()) {
		exynos_pmu_config = exynos4210_pmu_config;
		pr_info("EXYNOS4210 PMU Initialize\n");
	} else if (soc_is_exynos4212() || soc_is_exynos4412()) {
		exynos_pmu_config = exynos4x12_pmu_config;
		pr_info("EXYNOS4x12 PMU Initialize\n");
	} else if (soc_is_exynos5250()) {
		exynos5250_disable_isp();

		exynos_pmu_config = exynos5250_pmu_config;
		pm_power_off = exynos5_power_off;
		pr_info("EXYNOS5250 PMU Initialize\n");
	} else if (soc_is_exynos5420()) {
		__raw_writel(0xfffff, EXYNOS5_XXTI_DURATION3);

		/* Enable USE_STANDBY_WFI for all CORE */
		__raw_writel(EXYNOS5420_USE_STANDBY_WFI_ALL,
				S5P_CENTRAL_SEQ_OPTION);

		value = __raw_readl(EXYNOS_L2_OPTION(0));
		value &= ~EXYNOS5_USE_RETENTION;
		__raw_writel(value, EXYNOS_L2_OPTION(0));

		value = __raw_readl(EXYNOS_L2_OPTION(1));
		value &= ~EXYNOS5_USE_RETENTION;
		__raw_writel(value, EXYNOS_L2_OPTION(1));

		/*
		 * If L2_COMMON is turned off, clocks related to ATB async
		 * bridge are gated. Thus, when ISP power is gated, LPI
		 * may get stuck.
		 */
		value = __raw_readl(EXYNOS5420_LPI_MASK);
		value |= EXYNOS5420_ATB_ISP_ARM;
		__raw_writel(value, EXYNOS5420_LPI_MASK);
		value = __raw_readl(EXYNOS5420_LPI_MASK1);
		value |= EXYNOS5420_ATB_KFC;
		__raw_writel(value, EXYNOS5420_LPI_MASK1);

		/* Prevent issue of new bus request from L2 memory */
		value = __raw_readl(EXYNOS5420_ARM_COMMON_OPTION);
		value |= EXYNOS5_SKIP_DEACTIVATE_ACEACP_IN_PWDN;
		__raw_writel(value, EXYNOS5420_ARM_COMMON_OPTION);

		value = __raw_readl(EXYNOS5420_KFC_COMMON_OPTION);
		value |= EXYNOS5_SKIP_DEACTIVATE_ACEACP_IN_PWDN;
		__raw_writel(value, EXYNOS5420_KFC_COMMON_OPTION);

		/*
		 * This setting is to reduce suspend/resume time.
		 */
		__raw_writel(DUR_WAIT_RESET, EXYNOS5420_LOGIC_RESET_DURATION3);

		/* Serialized CPU wakeup of Eagle */
		__raw_writel(SPREAD_ENABLE, EXYNOS5420_ARM_INTR_SPREAD_ENABLE);
		__raw_writel(SPREAD_USE_STANDWFI,
			EXYNOS5420_ARM_INTR_SPREAD_USE_STANDBYWFI);
		__raw_writel(0x1, EXYNOS5420_UP_SCHEDULER);

		exynos_pmu_config = exynos5420_pmu_config;
		pm_power_off = exynos5_power_off;
		pr_info("EXYNOS5420 PMU Initialized\n");
	} else {
		pr_info("EXYNOS: PMU not supported\n");
	}

	return 0;
}