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

mfd: madera: Add support for requesting the supply clocks

Add the ability to get the clock for each clock input pin of the chip
and enable MCLK2 since that is expected to be a permanently enabled
32kHz clock.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>

authored by

Charles Keepax and committed by
Lee Jones
1e624fce c9d93428

+37 -1
+26 -1
drivers/mfd/madera-core.c
··· 450 450 sizeof(madera->pdata)); 451 451 } 452 452 453 + madera->mclk[MADERA_MCLK1].id = "mclk1"; 454 + madera->mclk[MADERA_MCLK2].id = "mclk2"; 455 + madera->mclk[MADERA_MCLK3].id = "mclk3"; 456 + 457 + ret = devm_clk_bulk_get_optional(madera->dev, ARRAY_SIZE(madera->mclk), 458 + madera->mclk); 459 + if (ret) { 460 + dev_err(madera->dev, "Failed to get clocks: %d\n", ret); 461 + return ret; 462 + } 463 + 464 + /* Not using devm_clk_get to prevent breakage of existing DTs */ 465 + if (!madera->mclk[MADERA_MCLK2].clk) 466 + dev_warn(madera->dev, "Missing MCLK2, requires 32kHz clock\n"); 467 + 453 468 ret = madera_get_reset_gpio(madera); 454 469 if (ret) 455 470 return ret; ··· 675 660 } 676 661 677 662 /* Init 32k clock sourced from MCLK2 */ 663 + ret = clk_prepare_enable(madera->mclk[MADERA_MCLK2].clk); 664 + if (ret) { 665 + dev_err(madera->dev, "Failed to enable 32k clock: %d\n", ret); 666 + goto err_reset; 667 + } 668 + 678 669 ret = regmap_update_bits(madera->regmap, 679 670 MADERA_CLOCK_32K_1, 680 671 MADERA_CLK_32K_ENA_MASK | MADERA_CLK_32K_SRC_MASK, 681 672 MADERA_CLK_32K_ENA | MADERA_32KZ_MCLK2); 682 673 if (ret) { 683 674 dev_err(madera->dev, "Failed to init 32k clock: %d\n", ret); 684 - goto err_reset; 675 + goto err_clock; 685 676 } 686 677 687 678 pm_runtime_set_active(madera->dev); ··· 708 687 709 688 err_pm_runtime: 710 689 pm_runtime_disable(madera->dev); 690 + err_clock: 691 + clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk); 711 692 err_reset: 712 693 madera_enable_hard_reset(madera); 713 694 regulator_disable(madera->dcvdd); ··· 735 712 * removing the children, and prevent PM runtime from turning it back on 736 713 */ 737 714 pm_runtime_disable(madera->dev); 715 + 716 + clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk); 738 717 739 718 regulator_disable(madera->dcvdd); 740 719 regulator_put(madera->dcvdd);
+11
include/linux/mfd/madera/core.h
··· 8 8 #ifndef MADERA_CORE_H 9 9 #define MADERA_CORE_H 10 10 11 + #include <linux/clk.h> 11 12 #include <linux/gpio/consumer.h> 12 13 #include <linux/interrupt.h> 13 14 #include <linux/mfd/madera/pdata.h> ··· 28 27 WM1840 = 7, 29 28 CS47L15 = 8, 30 29 CS42L92 = 9, 30 + }; 31 + 32 + enum { 33 + MADERA_MCLK1, 34 + MADERA_MCLK2, 35 + MADERA_MCLK3, 36 + MADERA_NUM_MCLK 31 37 }; 32 38 33 39 #define MADERA_MAX_CORE_SUPPLIES 2 ··· 163 155 * @irq_dev: the irqchip child driver device 164 156 * @irq_data: pointer to irqchip data for the child irqchip driver 165 157 * @irq: host irq number from SPI or I2C configuration 158 + * @mclk: Structure holding clock supplies 166 159 * @out_clamp: indicates output clamp state for each analogue output 167 160 * @out_shorted: indicates short circuit state for each analogue output 168 161 * @hp_ena: bitflags of enable state for the headphone outputs ··· 192 183 struct device *irq_dev; 193 184 struct regmap_irq_chip_data *irq_data; 194 185 int irq; 186 + 187 + struct clk_bulk_data mclk[MADERA_NUM_MCLK]; 195 188 196 189 unsigned int num_micbias; 197 190 unsigned int num_childbias[MADERA_MAX_MICBIAS];