Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'samsung-drivers-4.8-2' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux into next/drivers

Samsung drivers/soc update for v4.8, part 2:
1. Endian-friendly fixes.
2. Make SROMC driver explicitly non-module.

* tag 'samsung-drivers-4.8-2' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux:
cpufreq: s5pv210: use relaxed IO accesors
memory: samsung: exynos-srom: make it explicitly non-modular
memory: samsung: endian fixes for IO

Signed-off-by: Olof Johansson <olof@lixom.net>

+46 -61
+34 -34
drivers/cpufreq/s5pv210-cpufreq.c
··· 220 220 221 221 tmp1 /= tmp; 222 222 223 - __raw_writel(tmp1, reg); 223 + writel_relaxed(tmp1, reg); 224 224 } 225 225 226 226 static int s5pv210_target(struct cpufreq_policy *policy, unsigned int index) ··· 301 301 * 1. Temporary Change divider for MFC and G3D 302 302 * SCLKA2M(200/1=200)->(200/4=50)Mhz 303 303 */ 304 - reg = __raw_readl(S5P_CLK_DIV2); 304 + reg = readl_relaxed(S5P_CLK_DIV2); 305 305 reg &= ~(S5P_CLKDIV2_G3D_MASK | S5P_CLKDIV2_MFC_MASK); 306 306 reg |= (3 << S5P_CLKDIV2_G3D_SHIFT) | 307 307 (3 << S5P_CLKDIV2_MFC_SHIFT); 308 - __raw_writel(reg, S5P_CLK_DIV2); 308 + writel_relaxed(reg, S5P_CLK_DIV2); 309 309 310 310 /* For MFC, G3D dividing */ 311 311 do { 312 - reg = __raw_readl(S5P_CLKDIV_STAT0); 312 + reg = readl_relaxed(S5P_CLKDIV_STAT0); 313 313 } while (reg & ((1 << 16) | (1 << 17))); 314 314 315 315 /* 316 316 * 2. Change SCLKA2M(200Mhz)to SCLKMPLL in MFC_MUX, G3D MUX 317 317 * (200/4=50)->(667/4=166)Mhz 318 318 */ 319 - reg = __raw_readl(S5P_CLK_SRC2); 319 + reg = readl_relaxed(S5P_CLK_SRC2); 320 320 reg &= ~(S5P_CLKSRC2_G3D_MASK | S5P_CLKSRC2_MFC_MASK); 321 321 reg |= (1 << S5P_CLKSRC2_G3D_SHIFT) | 322 322 (1 << S5P_CLKSRC2_MFC_SHIFT); 323 - __raw_writel(reg, S5P_CLK_SRC2); 323 + writel_relaxed(reg, S5P_CLK_SRC2); 324 324 325 325 do { 326 - reg = __raw_readl(S5P_CLKMUX_STAT1); 326 + reg = readl_relaxed(S5P_CLKMUX_STAT1); 327 327 } while (reg & ((1 << 7) | (1 << 3))); 328 328 329 329 /* ··· 335 335 s5pv210_set_refresh(DMC1, 133000); 336 336 337 337 /* 4. SCLKAPLL -> SCLKMPLL */ 338 - reg = __raw_readl(S5P_CLK_SRC0); 338 + reg = readl_relaxed(S5P_CLK_SRC0); 339 339 reg &= ~(S5P_CLKSRC0_MUX200_MASK); 340 340 reg |= (0x1 << S5P_CLKSRC0_MUX200_SHIFT); 341 - __raw_writel(reg, S5P_CLK_SRC0); 341 + writel_relaxed(reg, S5P_CLK_SRC0); 342 342 343 343 do { 344 - reg = __raw_readl(S5P_CLKMUX_STAT0); 344 + reg = readl_relaxed(S5P_CLKMUX_STAT0); 345 345 } while (reg & (0x1 << 18)); 346 346 347 347 } 348 348 349 349 /* Change divider */ 350 - reg = __raw_readl(S5P_CLK_DIV0); 350 + reg = readl_relaxed(S5P_CLK_DIV0); 351 351 352 352 reg &= ~(S5P_CLKDIV0_APLL_MASK | S5P_CLKDIV0_A2M_MASK | 353 353 S5P_CLKDIV0_HCLK200_MASK | S5P_CLKDIV0_PCLK100_MASK | ··· 363 363 (clkdiv_val[index][6] << S5P_CLKDIV0_HCLK133_SHIFT) | 364 364 (clkdiv_val[index][7] << S5P_CLKDIV0_PCLK66_SHIFT)); 365 365 366 - __raw_writel(reg, S5P_CLK_DIV0); 366 + writel_relaxed(reg, S5P_CLK_DIV0); 367 367 368 368 do { 369 - reg = __raw_readl(S5P_CLKDIV_STAT0); 369 + reg = readl_relaxed(S5P_CLKDIV_STAT0); 370 370 } while (reg & 0xff); 371 371 372 372 /* ARM MCS value changed */ 373 - reg = __raw_readl(S5P_ARM_MCS_CON); 373 + reg = readl_relaxed(S5P_ARM_MCS_CON); 374 374 reg &= ~0x3; 375 375 if (index >= L3) 376 376 reg |= 0x3; 377 377 else 378 378 reg |= 0x1; 379 379 380 - __raw_writel(reg, S5P_ARM_MCS_CON); 380 + writel_relaxed(reg, S5P_ARM_MCS_CON); 381 381 382 382 if (pll_changing) { 383 383 /* 5. Set Lock time = 30us*24Mhz = 0x2cf */ 384 - __raw_writel(0x2cf, S5P_APLL_LOCK); 384 + writel_relaxed(0x2cf, S5P_APLL_LOCK); 385 385 386 386 /* 387 387 * 6. Turn on APLL ··· 389 389 * 6-2. Wait untile the PLL is locked 390 390 */ 391 391 if (index == L0) 392 - __raw_writel(APLL_VAL_1000, S5P_APLL_CON); 392 + writel_relaxed(APLL_VAL_1000, S5P_APLL_CON); 393 393 else 394 - __raw_writel(APLL_VAL_800, S5P_APLL_CON); 394 + writel_relaxed(APLL_VAL_800, S5P_APLL_CON); 395 395 396 396 do { 397 - reg = __raw_readl(S5P_APLL_CON); 397 + reg = readl_relaxed(S5P_APLL_CON); 398 398 } while (!(reg & (0x1 << 29))); 399 399 400 400 /* ··· 402 402 * to SCLKA2M(200Mhz) in MFC_MUX and G3D MUX 403 403 * (667/4=166)->(200/4=50)Mhz 404 404 */ 405 - reg = __raw_readl(S5P_CLK_SRC2); 405 + reg = readl_relaxed(S5P_CLK_SRC2); 406 406 reg &= ~(S5P_CLKSRC2_G3D_MASK | S5P_CLKSRC2_MFC_MASK); 407 407 reg |= (0 << S5P_CLKSRC2_G3D_SHIFT) | 408 408 (0 << S5P_CLKSRC2_MFC_SHIFT); 409 - __raw_writel(reg, S5P_CLK_SRC2); 409 + writel_relaxed(reg, S5P_CLK_SRC2); 410 410 411 411 do { 412 - reg = __raw_readl(S5P_CLKMUX_STAT1); 412 + reg = readl_relaxed(S5P_CLKMUX_STAT1); 413 413 } while (reg & ((1 << 7) | (1 << 3))); 414 414 415 415 /* 416 416 * 8. Change divider for MFC and G3D 417 417 * (200/4=50)->(200/1=200)Mhz 418 418 */ 419 - reg = __raw_readl(S5P_CLK_DIV2); 419 + reg = readl_relaxed(S5P_CLK_DIV2); 420 420 reg &= ~(S5P_CLKDIV2_G3D_MASK | S5P_CLKDIV2_MFC_MASK); 421 421 reg |= (clkdiv_val[index][10] << S5P_CLKDIV2_G3D_SHIFT) | 422 422 (clkdiv_val[index][9] << S5P_CLKDIV2_MFC_SHIFT); 423 - __raw_writel(reg, S5P_CLK_DIV2); 423 + writel_relaxed(reg, S5P_CLK_DIV2); 424 424 425 425 /* For MFC, G3D dividing */ 426 426 do { 427 - reg = __raw_readl(S5P_CLKDIV_STAT0); 427 + reg = readl_relaxed(S5P_CLKDIV_STAT0); 428 428 } while (reg & ((1 << 16) | (1 << 17))); 429 429 430 430 /* 9. Change MPLL to APLL in MSYS_MUX */ 431 - reg = __raw_readl(S5P_CLK_SRC0); 431 + reg = readl_relaxed(S5P_CLK_SRC0); 432 432 reg &= ~(S5P_CLKSRC0_MUX200_MASK); 433 433 reg |= (0x0 << S5P_CLKSRC0_MUX200_SHIFT); 434 - __raw_writel(reg, S5P_CLK_SRC0); 434 + writel_relaxed(reg, S5P_CLK_SRC0); 435 435 436 436 do { 437 - reg = __raw_readl(S5P_CLKMUX_STAT0); 437 + reg = readl_relaxed(S5P_CLKMUX_STAT0); 438 438 } while (reg & (0x1 << 18)); 439 439 440 440 /* ··· 451 451 * and memory refresh parameter should be changed 452 452 */ 453 453 if (bus_speed_changing) { 454 - reg = __raw_readl(S5P_CLK_DIV6); 454 + reg = readl_relaxed(S5P_CLK_DIV6); 455 455 reg &= ~S5P_CLKDIV6_ONEDRAM_MASK; 456 456 reg |= (clkdiv_val[index][8] << S5P_CLKDIV6_ONEDRAM_SHIFT); 457 - __raw_writel(reg, S5P_CLK_DIV6); 457 + writel_relaxed(reg, S5P_CLK_DIV6); 458 458 459 459 do { 460 - reg = __raw_readl(S5P_CLKDIV_STAT1); 460 + reg = readl_relaxed(S5P_CLKDIV_STAT1); 461 461 } while (reg & (1 << 15)); 462 462 463 463 /* Reconfigure DRAM refresh counter value */ ··· 497 497 { 498 498 unsigned long val; 499 499 500 - val = __raw_readl(dmc_reg + 0x4); 500 + val = readl_relaxed(dmc_reg + 0x4); 501 501 val = (val & (0xf << 8)); 502 502 503 503 return val >> 8; ··· 542 542 } 543 543 544 544 /* Find current refresh counter and frequency each DMC */ 545 - s5pv210_dram_conf[0].refresh = (__raw_readl(dmc_base[0] + 0x30) * 1000); 545 + s5pv210_dram_conf[0].refresh = (readl_relaxed(dmc_base[0] + 0x30) * 1000); 546 546 s5pv210_dram_conf[0].freq = clk_get_rate(dmc0_clk); 547 547 548 - s5pv210_dram_conf[1].refresh = (__raw_readl(dmc_base[1] + 0x30) * 1000); 548 + s5pv210_dram_conf[1].refresh = (readl_relaxed(dmc_base[1] + 0x30) * 1000); 549 549 s5pv210_dram_conf[1].freq = clk_get_rate(dmc1_clk); 550 550 551 551 policy->suspend_freq = SLEEP_FREQ;
+12 -27
drivers/memory/samsung/exynos-srom.c
··· 11 11 */ 12 12 13 13 #include <linux/io.h> 14 - #include <linux/module.h> 14 + #include <linux/init.h> 15 15 #include <linux/of.h> 16 16 #include <linux/of_address.h> 17 17 #include <linux/of_platform.h> ··· 91 91 if (width == 2) 92 92 cs |= 1 << EXYNOS_SROM_BW__DATAWIDTH__SHIFT; 93 93 94 - bw = __raw_readl(srom->reg_base + EXYNOS_SROM_BW); 94 + bw = readl_relaxed(srom->reg_base + EXYNOS_SROM_BW); 95 95 bw = (bw & ~(EXYNOS_SROM_BW__CS_MASK << bank)) | (cs << bank); 96 - __raw_writel(bw, srom->reg_base + EXYNOS_SROM_BW); 96 + writel_relaxed(bw, srom->reg_base + EXYNOS_SROM_BW); 97 97 98 - __raw_writel(pmc | (timing[0] << EXYNOS_SROM_BCX__TACP__SHIFT) | 99 - (timing[1] << EXYNOS_SROM_BCX__TCAH__SHIFT) | 100 - (timing[2] << EXYNOS_SROM_BCX__TCOH__SHIFT) | 101 - (timing[3] << EXYNOS_SROM_BCX__TACC__SHIFT) | 102 - (timing[4] << EXYNOS_SROM_BCX__TCOS__SHIFT) | 103 - (timing[5] << EXYNOS_SROM_BCX__TACS__SHIFT), 104 - srom->reg_base + EXYNOS_SROM_BC0 + bank); 98 + writel_relaxed(pmc | (timing[0] << EXYNOS_SROM_BCX__TACP__SHIFT) | 99 + (timing[1] << EXYNOS_SROM_BCX__TCAH__SHIFT) | 100 + (timing[2] << EXYNOS_SROM_BCX__TCOH__SHIFT) | 101 + (timing[3] << EXYNOS_SROM_BCX__TACC__SHIFT) | 102 + (timing[4] << EXYNOS_SROM_BCX__TCOS__SHIFT) | 103 + (timing[5] << EXYNOS_SROM_BCX__TACS__SHIFT), 104 + srom->reg_base + EXYNOS_SROM_BC0 + bank); 105 105 106 106 return 0; 107 107 } ··· 159 159 return of_platform_populate(np, NULL, NULL, dev); 160 160 } 161 161 162 - static int exynos_srom_remove(struct platform_device *pdev) 163 - { 164 - struct exynos_srom *srom = platform_get_drvdata(pdev); 165 - 166 - kfree(srom->reg_offset); 167 - iounmap(srom->reg_base); 168 - 169 - return 0; 170 - } 171 - 172 162 #ifdef CONFIG_PM_SLEEP 173 163 static void exynos_srom_save(void __iomem *base, 174 164 struct exynos_srom_reg_dump *rd, ··· 201 211 }, 202 212 {}, 203 213 }; 204 - MODULE_DEVICE_TABLE(of, of_exynos_srom_ids); 205 214 206 215 static SIMPLE_DEV_PM_OPS(exynos_srom_pm_ops, exynos_srom_suspend, exynos_srom_resume); 207 216 208 217 static struct platform_driver exynos_srom_driver = { 209 218 .probe = exynos_srom_probe, 210 - .remove = exynos_srom_remove, 211 219 .driver = { 212 220 .name = "exynos-srom", 213 221 .of_match_table = of_exynos_srom_ids, 214 222 .pm = &exynos_srom_pm_ops, 223 + .suppress_bind_attrs = true, 215 224 }, 216 225 }; 217 - module_platform_driver(exynos_srom_driver); 218 - 219 - MODULE_AUTHOR("Pankaj Dubey <pankaj.dubey@samsung.com>"); 220 - MODULE_DESCRIPTION("Exynos SROM Controller Driver"); 221 - MODULE_LICENSE("GPL"); 226 + builtin_platform_driver(exynos_srom_driver);