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

msm: clock: Migrate to clkdev

Migrating to clkdev has several advantages:

* Less code in mach-msm/clock.c

* A more robust clk_get() implementation

* clk_add_alias() support

* clk_get_sys() support

In general, this will help board authors setup clock aliases and
break the dependency on device pointers in the clock tables.

Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: David Brown <davidb@codeaurora.org>

authored by

Stephen Boyd and committed by
David Brown
bd32344a 2a52220c

+98 -86
+1
arch/arm/Kconfig
··· 619 619 select HAVE_CLK 620 620 select GENERIC_CLOCKEVENTS 621 621 select ARCH_REQUIRE_GPIOLIB 622 + select CLKDEV_LOOKUP 622 623 help 623 624 Support for Qualcomm MSM/QSD based systems. This runs on the 624 625 apps processor of the MSM/QSD and depends on a shared memory
+1
arch/arm/mach-msm/board-msm7x30.c
··· 23 23 #include <linux/io.h> 24 24 #include <linux/smsc911x.h> 25 25 #include <linux/usb/msm_hsusb.h> 26 + #include <linux/clkdev.h> 26 27 27 28 #include <asm/mach-types.h> 28 29 #include <asm/mach/arch.h>
+1
arch/arm/mach-msm/board-msm8960.c
··· 19 19 #include <linux/platform_device.h> 20 20 #include <linux/io.h> 21 21 #include <linux/irq.h> 22 + #include <linux/clkdev.h> 22 23 23 24 #include <asm/mach-types.h> 24 25 #include <asm/mach/arch.h>
+1
arch/arm/mach-msm/board-qsd8x50.c
··· 22 22 #include <linux/delay.h> 23 23 #include <linux/usb/msm_hsusb.h> 24 24 #include <linux/err.h> 25 + #include <linux/clkdev.h> 25 26 26 27 #include <asm/mach-types.h> 27 28 #include <asm/mach/arch.h>
+1
arch/arm/mach-msm/board-trout.c
··· 17 17 #include <linux/kernel.h> 18 18 #include <linux/init.h> 19 19 #include <linux/platform_device.h> 20 + #include <linux/clkdev.h> 20 21 21 22 #include <asm/mach-types.h> 22 23 #include <asm/mach/arch.h>
+17 -14
arch/arm/mach-msm/clock-7x30.h
··· 130 130 extern int internal_pwr_rail_ctl_auto(unsigned rail_id, bool enable); 131 131 132 132 #define CLK_7X30(clk_name, clk_id, clk_dev, clk_flags) { \ 133 - .name = clk_name, \ 134 - .id = L_7X30_##clk_id, \ 135 - .remote_id = P_##clk_id, \ 136 - .flags = clk_flags, \ 137 - .dev = clk_dev, \ 138 - .dbg_name = #clk_id, \ 133 + .con_id = clk_name, \ 134 + .dev_id = clk_dev, \ 135 + .clk = &(struct clk){ \ 136 + .id = L_7X30_##clk_id, \ 137 + .remote_id = P_##clk_id, \ 138 + .flags = clk_flags, \ 139 + .dbg_name = #clk_id, \ 140 + }, \ 139 141 } 140 142 141 143 #define CLK_7X30S(clk_name, l_id, r_id, clk_dev, clk_flags) { \ 142 - .name = clk_name, \ 143 - .id = L_7X30_##l_id, \ 144 - .remote_id = P_##r_id, \ 145 - .flags = clk_flags, \ 146 - .dev = clk_dev, \ 147 - .dbg_name = #l_id, \ 148 - .ops = &clk_ops_pcom, \ 144 + .con_id = clk_name, \ 145 + .dev_id = clk_dev, \ 146 + .clk = &(struct clk){ \ 147 + .id = L_7X30_##l_id, \ 148 + .remote_id = P_##r_id, \ 149 + .flags = clk_flags, \ 150 + .dbg_name = #l_id, \ 151 + .ops = &clk_ops_pcom, \ 152 + }, \ 149 153 } 150 154 151 155 #endif 152 -
+9 -7
arch/arm/mach-msm/clock-pcom.h
··· 126 126 int pc_clk_reset(unsigned id, enum clk_reset_action action); 127 127 128 128 #define CLK_PCOM(clk_name, clk_id, clk_dev, clk_flags) { \ 129 - .name = clk_name, \ 130 - .id = P_##clk_id, \ 131 - .remote_id = P_##clk_id, \ 132 - .ops = &clk_ops_pcom, \ 133 - .flags = clk_flags, \ 134 - .dev = clk_dev, \ 135 - .dbg_name = #clk_id, \ 129 + .con_id = clk_name, \ 130 + .dev_id = clk_dev, \ 131 + .clk = &(struct clk){ \ 132 + .id = P_##clk_id, \ 133 + .remote_id = P_##clk_id, \ 134 + .ops = &clk_ops_pcom, \ 135 + .flags = clk_flags, \ 136 + .dbg_name = #clk_id, \ 137 + }, \ 136 138 } 137 139 138 140 #endif
+10 -29
arch/arm/mach-msm/clock.c
··· 19 19 #include <linux/err.h> 20 20 #include <linux/spinlock.h> 21 21 #include <linux/pm_qos_params.h> 22 + #include <linux/mutex.h> 23 + #include <linux/clk.h> 24 + #include <linux/string.h> 25 + #include <linux/module.h> 26 + #include <linux/clkdev.h> 22 27 23 28 #include "clock.h" 24 29 ··· 34 29 /* 35 30 * Standard clock functions defined in include/linux/clk.h 36 31 */ 37 - struct clk *clk_get(struct device *dev, const char *id) 38 - { 39 - struct clk *clk; 40 - 41 - mutex_lock(&clocks_mutex); 42 - 43 - list_for_each_entry(clk, &clocks, list) 44 - if (!strcmp(id, clk->name) && clk->dev == dev) 45 - goto found_it; 46 - 47 - list_for_each_entry(clk, &clocks, list) 48 - if (!strcmp(id, clk->name) && clk->dev == NULL) 49 - goto found_it; 50 - 51 - clk = ERR_PTR(-ENOENT); 52 - found_it: 53 - mutex_unlock(&clocks_mutex); 54 - return clk; 55 - } 56 - EXPORT_SYMBOL(clk_get); 57 - 58 - void clk_put(struct clk *clk) 59 - { 60 - } 61 - EXPORT_SYMBOL(clk_put); 62 - 63 32 int clk_enable(struct clk *clk) 64 33 { 65 34 unsigned long flags; ··· 136 157 */ 137 158 static struct clk *ebi1_clk; 138 159 139 - void __init msm_clock_init(struct clk *clock_tbl, unsigned num_clocks) 160 + void __init msm_clock_init(struct clk_lookup *clock_tbl, unsigned num_clocks) 140 161 { 141 162 unsigned n; 142 163 143 164 mutex_lock(&clocks_mutex); 144 - for (n = 0; n < num_clocks; n++) 145 - list_add_tail(&clock_tbl[n].list, &clocks); 165 + for (n = 0; n < num_clocks; n++) { 166 + clkdev_add(&clock_tbl[n]); 167 + list_add_tail(&clock_tbl[n].clk->list, &clocks); 168 + } 146 169 mutex_unlock(&clocks_mutex); 147 170 148 171 ebi1_clk = clk_get(NULL, "ebi1_clk");
-2
arch/arm/mach-msm/clock.h
··· 51 51 uint32_t remote_id; 52 52 uint32_t count; 53 53 uint32_t flags; 54 - const char *name; 55 54 struct clk_ops *ops; 56 55 const char *dbg_name; 57 56 struct list_head list; 58 - struct device *dev; 59 57 }; 60 58 61 59 #define OFF CLKFLAG_AUTO_OFF
+16 -16
arch/arm/mach-msm/devices-msm7x00.c
··· 15 15 16 16 #include <linux/kernel.h> 17 17 #include <linux/platform_device.h> 18 + #include <linux/clkdev.h> 18 19 19 20 #include <mach/irqs.h> 20 21 #include <mach/msm_iomap.h> ··· 24 23 #include <asm/mach/flash.h> 25 24 #include <linux/mtd/nand.h> 26 25 #include <linux/mtd/partitions.h> 27 - 28 26 29 27 #include "clock.h" 30 28 #include "clock-pcom.h" ··· 418 418 .resource = resources_mdp, 419 419 }; 420 420 421 - struct clk msm_clocks_7x01a[] = { 421 + struct clk_lookup msm_clocks_7x01a[] = { 422 422 CLK_PCOM("adm_clk", ADM_CLK, NULL, 0), 423 423 CLK_PCOM("adsp_clk", ADSP_CLK, NULL, 0), 424 424 CLK_PCOM("ebi1_clk", EBI1_CLK, NULL, 0), ··· 427 427 CLK_PCOM("emdh_clk", EMDH_CLK, NULL, OFF), 428 428 CLK_PCOM("gp_clk", GP_CLK, NULL, 0), 429 429 CLK_PCOM("grp_clk", GRP_3D_CLK, NULL, OFF), 430 - CLK_PCOM("i2c_clk", I2C_CLK, &msm_device_i2c.dev, 0), 430 + CLK_PCOM("i2c_clk", I2C_CLK, "msm_i2c.0", 0), 431 431 CLK_PCOM("icodec_rx_clk", ICODEC_RX_CLK, NULL, 0), 432 432 CLK_PCOM("icodec_tx_clk", ICODEC_TX_CLK, NULL, 0), 433 433 CLK_PCOM("imem_clk", IMEM_CLK, NULL, OFF), ··· 437 437 CLK_PCOM("pcm_clk", PCM_CLK, NULL, 0), 438 438 CLK_PCOM("mddi_clk", PMDH_CLK, NULL, OFF | CLK_MINMAX), 439 439 CLK_PCOM("sdac_clk", SDAC_CLK, NULL, OFF), 440 - CLK_PCOM("sdc_clk", SDC1_CLK, &msm_device_sdc1.dev, OFF), 441 - CLK_PCOM("sdc_pclk", SDC1_P_CLK, &msm_device_sdc1.dev, OFF), 442 - CLK_PCOM("sdc_clk", SDC2_CLK, &msm_device_sdc2.dev, OFF), 443 - CLK_PCOM("sdc_pclk", SDC2_P_CLK, &msm_device_sdc2.dev, OFF), 444 - CLK_PCOM("sdc_clk", SDC3_CLK, &msm_device_sdc3.dev, OFF), 445 - CLK_PCOM("sdc_pclk", SDC3_P_CLK, &msm_device_sdc3.dev, OFF), 446 - CLK_PCOM("sdc_clk", SDC4_CLK, &msm_device_sdc4.dev, OFF), 447 - CLK_PCOM("sdc_pclk", SDC4_P_CLK, &msm_device_sdc4.dev, OFF), 440 + CLK_PCOM("sdc_clk", SDC1_CLK, "msm_sdcc.1", OFF), 441 + CLK_PCOM("sdc_pclk", SDC1_P_CLK, "msm_sdcc.1", OFF), 442 + CLK_PCOM("sdc_clk", SDC2_CLK, "msm_sdcc.2", OFF), 443 + CLK_PCOM("sdc_pclk", SDC2_P_CLK, "msm_sdcc.2", OFF), 444 + CLK_PCOM("sdc_clk", SDC3_CLK, "msm_sdcc.3", OFF), 445 + CLK_PCOM("sdc_pclk", SDC3_P_CLK, "msm_sdcc.3", OFF), 446 + CLK_PCOM("sdc_clk", SDC4_CLK, "msm_sdcc.4", OFF), 447 + CLK_PCOM("sdc_pclk", SDC4_P_CLK, "msm_sdcc.4", OFF), 448 448 CLK_PCOM("tsif_clk", TSIF_CLK, NULL, 0), 449 449 CLK_PCOM("tsif_ref_clk", TSIF_REF_CLK, NULL, 0), 450 450 CLK_PCOM("tv_dac_clk", TV_DAC_CLK, NULL, 0), 451 451 CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0), 452 - CLK_PCOM("uart_clk", UART1_CLK, &msm_device_uart1.dev, OFF), 453 - CLK_PCOM("uart_clk", UART2_CLK, &msm_device_uart2.dev, 0), 454 - CLK_PCOM("uart_clk", UART3_CLK, &msm_device_uart3.dev, OFF), 452 + CLK_PCOM("uart_clk", UART1_CLK, "msm_serial.0", OFF), 453 + CLK_PCOM("uart_clk", UART2_CLK, "msm_serial.1", 0), 454 + CLK_PCOM("uart_clk", UART3_CLK, "msm_serial.2", OFF), 455 455 CLK_PCOM("uart1dm_clk", UART1DM_CLK, NULL, OFF), 456 456 CLK_PCOM("uart2dm_clk", UART2DM_CLK, NULL, 0), 457 - CLK_PCOM("usb_hs_clk", USB_HS_CLK, &msm_device_hsusb.dev, OFF), 458 - CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK, &msm_device_hsusb.dev, OFF), 457 + CLK_PCOM("usb_hs_clk", USB_HS_CLK, "msm_hsusb", OFF), 458 + CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK, "msm_hsusb", OFF), 459 459 CLK_PCOM("usb_otg_clk", USB_OTG_CLK, NULL, 0), 460 460 CLK_PCOM("vdc_clk", VDC_CLK, NULL, OFF ), 461 461 CLK_PCOM("vfe_clk", VFE_CLK, NULL, OFF),
+3 -2
arch/arm/mach-msm/devices-msm7x30.c
··· 17 17 #include <linux/platform_device.h> 18 18 19 19 #include <linux/dma-mapping.h> 20 + #include <linux/clkdev.h> 20 21 #include <mach/irqs.h> 21 22 #include <mach/msm_iomap.h> 22 23 #include <mach/dma.h> ··· 130 129 }, 131 130 }; 132 131 133 - struct clk msm_clocks_7x30[] = { 132 + struct clk_lookup msm_clocks_7x30[] = { 134 133 CLK_PCOM("adm_clk", ADM_CLK, NULL, 0), 135 134 CLK_PCOM("adsp_clk", ADSP_CLK, NULL, 0), 136 135 CLK_PCOM("cam_m_clk", CAM_M_CLK, NULL, 0), ··· 182 181 CLK_7X30S("tv_src_clk", TV_CLK, TV_ENC_CLK, NULL, 0), 183 182 CLK_PCOM("tv_dac_clk", TV_DAC_CLK, NULL, 0), 184 183 CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0), 185 - CLK_PCOM("uart_clk", UART2_CLK, &msm_device_uart2.dev, 0), 184 + CLK_PCOM("uart_clk", UART2_CLK, "msm_serial.1", 0), 186 185 CLK_PCOM("usb_phy_clk", USB_PHY_CLK, NULL, 0), 187 186 CLK_PCOM("usb_hs_clk", USB_HS_CLK, NULL, OFF), 188 187 CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK, NULL, OFF),
+12 -11
arch/arm/mach-msm/devices-qsd8x50.c
··· 15 15 16 16 #include <linux/kernel.h> 17 17 #include <linux/platform_device.h> 18 - 18 + #include <linux/clkdev.h> 19 19 #include <linux/dma-mapping.h> 20 + 20 21 #include <mach/irqs.h> 21 22 #include <mach/msm_iomap.h> 22 23 #include <mach/dma.h> ··· 315 314 return platform_device_register(pdev); 316 315 } 317 316 318 - struct clk msm_clocks_8x50[] = { 317 + struct clk_lookup msm_clocks_8x50[] = { 319 318 CLK_PCOM("adm_clk", ADM_CLK, NULL, 0), 320 319 CLK_PCOM("ce_clk", CE_CLK, NULL, 0), 321 320 CLK_PCOM("ebi1_clk", EBI1_CLK, NULL, CLK_MIN), ··· 337 336 CLK_PCOM("pbus_clk", PBUS_CLK, NULL, CLK_MIN), 338 337 CLK_PCOM("pcm_clk", PCM_CLK, NULL, 0), 339 338 CLK_PCOM("sdac_clk", SDAC_CLK, NULL, OFF), 340 - CLK_PCOM("sdc_clk", SDC1_CLK, &msm_device_sdc1.dev, OFF), 341 - CLK_PCOM("sdc_pclk", SDC1_P_CLK, &msm_device_sdc1.dev, OFF), 342 - CLK_PCOM("sdc_clk", SDC2_CLK, &msm_device_sdc2.dev, OFF), 343 - CLK_PCOM("sdc_pclk", SDC2_P_CLK, &msm_device_sdc2.dev, OFF), 344 - CLK_PCOM("sdc_clk", SDC3_CLK, &msm_device_sdc3.dev, OFF), 345 - CLK_PCOM("sdc_pclk", SDC3_P_CLK, &msm_device_sdc3.dev, OFF), 346 - CLK_PCOM("sdc_clk", SDC4_CLK, &msm_device_sdc4.dev, OFF), 347 - CLK_PCOM("sdc_pclk", SDC4_P_CLK, &msm_device_sdc4.dev, OFF), 339 + CLK_PCOM("sdc_clk", SDC1_CLK, "msm_sdcc.1", OFF), 340 + CLK_PCOM("sdc_pclk", SDC1_P_CLK, "msm_sdcc.1", OFF), 341 + CLK_PCOM("sdc_clk", SDC2_CLK, "msm_sdcc.2", OFF), 342 + CLK_PCOM("sdc_pclk", SDC2_P_CLK, "msm_sdcc.2", OFF), 343 + CLK_PCOM("sdc_clk", SDC3_CLK, "msm_sdcc.3", OFF), 344 + CLK_PCOM("sdc_pclk", SDC3_P_CLK, "msm_sdcc.3", OFF), 345 + CLK_PCOM("sdc_clk", SDC4_CLK, "msm_sdcc.4", OFF), 346 + CLK_PCOM("sdc_pclk", SDC4_P_CLK, "msm_sdcc.4", OFF), 348 347 CLK_PCOM("spi_clk", SPI_CLK, NULL, 0), 349 348 CLK_PCOM("tsif_clk", TSIF_CLK, NULL, 0), 350 349 CLK_PCOM("tsif_ref_clk", TSIF_REF_CLK, NULL, 0), ··· 352 351 CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0), 353 352 CLK_PCOM("uart_clk", UART1_CLK, NULL, OFF), 354 353 CLK_PCOM("uart_clk", UART2_CLK, NULL, 0), 355 - CLK_PCOM("uart_clk", UART3_CLK, &msm_device_uart3.dev, OFF), 354 + CLK_PCOM("uart_clk", UART3_CLK, "msm_serial.2", OFF), 356 355 CLK_PCOM("uartdm_clk", UART1DM_CLK, NULL, OFF), 357 356 CLK_PCOM("uartdm_clk", UART2DM_CLK, NULL, 0), 358 357 CLK_PCOM("usb_hs_clk", USB_HS_CLK, NULL, OFF),
+5 -3
arch/arm/mach-msm/devices.h
··· 16 16 #ifndef __ARCH_ARM_MACH_MSM_DEVICES_H 17 17 #define __ARCH_ARM_MACH_MSM_DEVICES_H 18 18 19 + #include <linux/clkdev.h> 20 + 19 21 #include "clock.h" 20 22 21 23 extern struct platform_device msm_device_uart1; ··· 46 44 extern struct platform_device msm_device_mddi1; 47 45 extern struct platform_device msm_device_mdp; 48 46 49 - extern struct clk msm_clocks_7x01a[]; 47 + extern struct clk_lookup msm_clocks_7x01a[]; 50 48 extern unsigned msm_num_clocks_7x01a; 51 49 52 - extern struct clk msm_clocks_7x30[]; 50 + extern struct clk_lookup msm_clocks_7x30[]; 53 51 extern unsigned msm_num_clocks_7x30; 54 52 55 - extern struct clk msm_clocks_8x50[]; 53 + extern struct clk_lookup msm_clocks_8x50[]; 56 54 extern unsigned msm_num_clocks_8x50; 57 55 58 56 #endif
+2 -2
arch/arm/mach-msm/include/mach/board.h
··· 31 31 unsigned long wait_for_irq_khz; 32 32 }; 33 33 34 - struct clk; 34 + struct clk_lookup; 35 35 36 36 extern struct sys_timer msm_timer; 37 37 ··· 41 41 void __init msm_map_common_io(void); 42 42 void __init msm_init_irq(void); 43 43 void __init msm_init_gpio(void); 44 - void __init msm_clock_init(struct clk *clock_tbl, unsigned num_clocks); 44 + void __init msm_clock_init(struct clk_lookup *clock_tbl, unsigned num_clocks); 45 45 void __init msm_acpu_clock_init(struct msm_acpu_clock_platform_data *); 46 46 int __init msm_add_sdcc(unsigned int controller, 47 47 struct msm_mmc_platform_data *plat,
+19
arch/arm/mach-msm/include/mach/clkdev.h
··· 1 + /* Copyright (c) 2011, Code Aurora Forum. All rights reserved. 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License version 2 and 5 + * only version 2 as published by the Free Software Foundation. 6 + * 7 + * This program is distributed in the hope that it will be useful, 8 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 + * GNU General Public License for more details. 11 + */ 12 + #ifndef __ASM_ARCH_MSM_CLKDEV_H 13 + #define __ASM_ARCH_MSM_CLKDEV_H 14 + 15 + struct clk; 16 + 17 + static inline int __clk_get(struct clk *clk) { return 1; } 18 + static inline void __clk_put(struct clk *clk) { } 19 + #endif