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