1f8ce2547SRussell King /* 2f8ce2547SRussell King * linux/include/linux/clk.h 3f8ce2547SRussell King * 4f8ce2547SRussell King * Copyright (C) 2004 ARM Limited. 5f8ce2547SRussell King * Written by Deep Blue Solutions Limited. 6f8ce2547SRussell King * 7f8ce2547SRussell King * This program is free software; you can redistribute it and/or modify 8f8ce2547SRussell King * it under the terms of the GNU General Public License version 2 as 9f8ce2547SRussell King * published by the Free Software Foundation. 10f8ce2547SRussell King */ 11686f8c5dSTodd Poynor #ifndef __LINUX_CLK_H 12686f8c5dSTodd Poynor #define __LINUX_CLK_H 13f8ce2547SRussell King 14*40d3e0f4SRussell King #include <linux/kernel.h> 15*40d3e0f4SRussell King 16f8ce2547SRussell King struct device; 17f8ce2547SRussell King 18f8ce2547SRussell King /* 19f8ce2547SRussell King * The base API. 20f8ce2547SRussell King */ 21f8ce2547SRussell King 22f8ce2547SRussell King 23f8ce2547SRussell King /* 24f8ce2547SRussell King * struct clk - an machine class defined object / cookie. 25f8ce2547SRussell King */ 26f8ce2547SRussell King struct clk; 27f8ce2547SRussell King 28f8ce2547SRussell King /** 29f8ce2547SRussell King * clk_get - lookup and obtain a reference to a clock producer. 30f8ce2547SRussell King * @dev: device for clock "consumer" 31f8ce2547SRussell King * @id: clock comsumer ID 32f8ce2547SRussell King * 33f8ce2547SRussell King * Returns a struct clk corresponding to the clock producer, or 34f8ce2547SRussell King * valid IS_ERR() condition containing errno. The implementation 35f8ce2547SRussell King * uses @dev and @id to determine the clock consumer, and thereby 36f8ce2547SRussell King * the clock producer. (IOW, @id may be identical strings, but 37f8ce2547SRussell King * clk_get may return different clock producers depending on @dev.) 38f8ce2547SRussell King * 39f8ce2547SRussell King * Drivers must assume that the clock source is not enabled. 40f7ad160bSAlex Raimondi * 41f7ad160bSAlex Raimondi * clk_get should not be called from within interrupt context. 42f8ce2547SRussell King */ 43f8ce2547SRussell King struct clk *clk_get(struct device *dev, const char *id); 44f8ce2547SRussell King 45f8ce2547SRussell King /** 46*40d3e0f4SRussell King * clk_prepare - prepare a clock source 47*40d3e0f4SRussell King * @clk: clock source 48*40d3e0f4SRussell King * 49*40d3e0f4SRussell King * This prepares the clock source for use. 50*40d3e0f4SRussell King * 51*40d3e0f4SRussell King * Must not be called from within atomic context. 52*40d3e0f4SRussell King */ 53*40d3e0f4SRussell King #ifdef CONFIG_HAVE_CLK_PREPARE 54*40d3e0f4SRussell King int clk_prepare(struct clk *clk); 55*40d3e0f4SRussell King #else 56*40d3e0f4SRussell King static inline int clk_prepare(struct clk *clk) 57*40d3e0f4SRussell King { 58*40d3e0f4SRussell King might_sleep(); 59*40d3e0f4SRussell King return 0; 60*40d3e0f4SRussell King } 61*40d3e0f4SRussell King #endif 62*40d3e0f4SRussell King 63*40d3e0f4SRussell King /** 64f8ce2547SRussell King * clk_enable - inform the system when the clock source should be running. 65f8ce2547SRussell King * @clk: clock source 66f8ce2547SRussell King * 67f8ce2547SRussell King * If the clock can not be enabled/disabled, this should return success. 68f8ce2547SRussell King * 69*40d3e0f4SRussell King * May be called from atomic contexts. 70*40d3e0f4SRussell King * 71f8ce2547SRussell King * Returns success (0) or negative errno. 72f8ce2547SRussell King */ 73f8ce2547SRussell King int clk_enable(struct clk *clk); 74f8ce2547SRussell King 75f8ce2547SRussell King /** 76f8ce2547SRussell King * clk_disable - inform the system when the clock source is no longer required. 77f8ce2547SRussell King * @clk: clock source 78f8ce2547SRussell King * 79f8ce2547SRussell King * Inform the system that a clock source is no longer required by 80f8ce2547SRussell King * a driver and may be shut down. 81f8ce2547SRussell King * 82*40d3e0f4SRussell King * May be called from atomic contexts. 83*40d3e0f4SRussell King * 84f8ce2547SRussell King * Implementation detail: if the clock source is shared between 85f8ce2547SRussell King * multiple drivers, clk_enable() calls must be balanced by the 86f8ce2547SRussell King * same number of clk_disable() calls for the clock source to be 87f8ce2547SRussell King * disabled. 88f8ce2547SRussell King */ 89f8ce2547SRussell King void clk_disable(struct clk *clk); 90f8ce2547SRussell King 91*40d3e0f4SRussell King 92*40d3e0f4SRussell King /** 93*40d3e0f4SRussell King * clk_unprepare - undo preparation of a clock source 94*40d3e0f4SRussell King * @clk: clock source 95*40d3e0f4SRussell King * 96*40d3e0f4SRussell King * This undoes a previously prepared clock. The caller must balance 97*40d3e0f4SRussell King * the number of prepare and unprepare calls. 98*40d3e0f4SRussell King * 99*40d3e0f4SRussell King * Must not be called from within atomic context. 100*40d3e0f4SRussell King */ 101*40d3e0f4SRussell King #ifdef CONFIG_HAVE_CLK_PREPARE 102*40d3e0f4SRussell King void clk_unprepare(struct clk *clk); 103*40d3e0f4SRussell King #else 104*40d3e0f4SRussell King static inline void clk_unprepare(struct clk *clk) 105*40d3e0f4SRussell King { 106*40d3e0f4SRussell King might_sleep(); 107*40d3e0f4SRussell King } 108*40d3e0f4SRussell King #endif 109*40d3e0f4SRussell King 110f8ce2547SRussell King /** 111f8ce2547SRussell King * clk_get_rate - obtain the current clock rate (in Hz) for a clock source. 112f8ce2547SRussell King * This is only valid once the clock source has been enabled. 113f8ce2547SRussell King * @clk: clock source 114f8ce2547SRussell King */ 115f8ce2547SRussell King unsigned long clk_get_rate(struct clk *clk); 116f8ce2547SRussell King 117f8ce2547SRussell King /** 118f8ce2547SRussell King * clk_put - "free" the clock source 119f8ce2547SRussell King * @clk: clock source 120f8ce2547SRussell King * 121f8ce2547SRussell King * Note: drivers must ensure that all clk_enable calls made on this 122f8ce2547SRussell King * clock source are balanced by clk_disable calls prior to calling 123f8ce2547SRussell King * this function. 124f7ad160bSAlex Raimondi * 125f7ad160bSAlex Raimondi * clk_put should not be called from within interrupt context. 126f8ce2547SRussell King */ 127f8ce2547SRussell King void clk_put(struct clk *clk); 128f8ce2547SRussell King 129f8ce2547SRussell King 130f8ce2547SRussell King /* 131f8ce2547SRussell King * The remaining APIs are optional for machine class support. 132f8ce2547SRussell King */ 133f8ce2547SRussell King 134f8ce2547SRussell King 135f8ce2547SRussell King /** 136f8ce2547SRussell King * clk_round_rate - adjust a rate to the exact rate a clock can provide 137f8ce2547SRussell King * @clk: clock source 138f8ce2547SRussell King * @rate: desired clock rate in Hz 139f8ce2547SRussell King * 140f8ce2547SRussell King * Returns rounded clock rate in Hz, or negative errno. 141f8ce2547SRussell King */ 142f8ce2547SRussell King long clk_round_rate(struct clk *clk, unsigned long rate); 143f8ce2547SRussell King 144f8ce2547SRussell King /** 145f8ce2547SRussell King * clk_set_rate - set the clock rate for a clock source 146f8ce2547SRussell King * @clk: clock source 147f8ce2547SRussell King * @rate: desired clock rate in Hz 148f8ce2547SRussell King * 149f8ce2547SRussell King * Returns success (0) or negative errno. 150f8ce2547SRussell King */ 151f8ce2547SRussell King int clk_set_rate(struct clk *clk, unsigned long rate); 152f8ce2547SRussell King 153f8ce2547SRussell King /** 154f8ce2547SRussell King * clk_set_parent - set the parent clock source for this clock 155f8ce2547SRussell King * @clk: clock source 156f8ce2547SRussell King * @parent: parent clock source 157f8ce2547SRussell King * 158f8ce2547SRussell King * Returns success (0) or negative errno. 159f8ce2547SRussell King */ 160f8ce2547SRussell King int clk_set_parent(struct clk *clk, struct clk *parent); 161f8ce2547SRussell King 162f8ce2547SRussell King /** 163f8ce2547SRussell King * clk_get_parent - get the parent clock source for this clock 164f8ce2547SRussell King * @clk: clock source 165f8ce2547SRussell King * 166f8ce2547SRussell King * Returns struct clk corresponding to parent clock source, or 167f8ce2547SRussell King * valid IS_ERR() condition containing errno. 168f8ce2547SRussell King */ 169f8ce2547SRussell King struct clk *clk_get_parent(struct clk *clk); 170f8ce2547SRussell King 17105fd8e73SSascha Hauer /** 17205fd8e73SSascha Hauer * clk_get_sys - get a clock based upon the device name 17305fd8e73SSascha Hauer * @dev_id: device name 17405fd8e73SSascha Hauer * @con_id: connection ID 17505fd8e73SSascha Hauer * 17605fd8e73SSascha Hauer * Returns a struct clk corresponding to the clock producer, or 17705fd8e73SSascha Hauer * valid IS_ERR() condition containing errno. The implementation 17805fd8e73SSascha Hauer * uses @dev_id and @con_id to determine the clock consumer, and 17905fd8e73SSascha Hauer * thereby the clock producer. In contrast to clk_get() this function 18005fd8e73SSascha Hauer * takes the device name instead of the device itself for identification. 18105fd8e73SSascha Hauer * 18205fd8e73SSascha Hauer * Drivers must assume that the clock source is not enabled. 18305fd8e73SSascha Hauer * 18405fd8e73SSascha Hauer * clk_get_sys should not be called from within interrupt context. 18505fd8e73SSascha Hauer */ 18605fd8e73SSascha Hauer struct clk *clk_get_sys(const char *dev_id, const char *con_id); 18705fd8e73SSascha Hauer 188c0683039STony Lindgren /** 189c0683039STony Lindgren * clk_add_alias - add a new clock alias 190c0683039STony Lindgren * @alias: name for clock alias 191c0683039STony Lindgren * @alias_dev_name: device name 192c0683039STony Lindgren * @id: platform specific clock name 193c0683039STony Lindgren * @dev: device 194c0683039STony Lindgren * 195c0683039STony Lindgren * Allows using generic clock names for drivers by adding a new alias. 196c0683039STony Lindgren * Assumes clkdev, see clkdev.h for more info. 197c0683039STony Lindgren */ 198c0683039STony Lindgren int clk_add_alias(const char *alias, const char *alias_dev_name, char *id, 199c0683039STony Lindgren struct device *dev); 200c0683039STony Lindgren 201f8ce2547SRussell King #endif 202