linux/drivers/clk/berlin/berlin2-div.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2014 Marvell Technology Group Ltd.
   3 *
   4 * Alexandre Belloni <alexandre.belloni@free-electrons.com>
   5 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify it
   8 * under the terms and conditions of the GNU General Public License,
   9 * version 2, as published by the Free Software Foundation.
  10 *
  11 * This program is distributed in the hope it will be useful, but WITHOUT
  12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  14 * more details.
  15 *
  16 * You should have received a copy of the GNU General Public License along with
  17 * this program.  If not, see <http://www.gnu.org/licenses/>.
  18 */
  19#ifndef __BERLIN2_DIV_H
  20#define __BERLIN2_DIV_H
  21
  22struct clk_hw;
  23
  24#define BERLIN2_DIV_HAS_GATE            BIT(0)
  25#define BERLIN2_DIV_HAS_MUX             BIT(1)
  26
  27#define BERLIN2_PLL_SELECT(_off, _sh)   \
  28        .pll_select_offs = _off,        \
  29        .pll_select_shift = _sh
  30
  31#define BERLIN2_PLL_SWITCH(_off, _sh)   \
  32        .pll_switch_offs = _off,        \
  33        .pll_switch_shift = _sh
  34
  35#define BERLIN2_DIV_SELECT(_off, _sh)   \
  36        .div_select_offs = _off,        \
  37        .div_select_shift = _sh
  38
  39#define BERLIN2_DIV_SWITCH(_off, _sh)   \
  40        .div_switch_offs = _off,        \
  41        .div_switch_shift = _sh
  42
  43#define BERLIN2_DIV_D3SWITCH(_off, _sh) \
  44        .div3_switch_offs = _off,       \
  45        .div3_switch_shift = _sh
  46
  47#define BERLIN2_DIV_GATE(_off, _sh)     \
  48        .gate_offs = _off,              \
  49        .gate_shift = _sh
  50
  51#define BERLIN2_SINGLE_DIV(_off)        \
  52        BERLIN2_DIV_GATE(_off, 0),      \
  53        BERLIN2_PLL_SELECT(_off, 1),    \
  54        BERLIN2_PLL_SWITCH(_off, 4),    \
  55        BERLIN2_DIV_SWITCH(_off, 5),    \
  56        BERLIN2_DIV_D3SWITCH(_off, 6),  \
  57        BERLIN2_DIV_SELECT(_off, 7)
  58
  59struct berlin2_div_map {
  60        u16 pll_select_offs;
  61        u16 pll_switch_offs;
  62        u16 div_select_offs;
  63        u16 div_switch_offs;
  64        u16 div3_switch_offs;
  65        u16 gate_offs;
  66        u8 pll_select_shift;
  67        u8 pll_switch_shift;
  68        u8 div_select_shift;
  69        u8 div_switch_shift;
  70        u8 div3_switch_shift;
  71        u8 gate_shift;
  72};
  73
  74struct berlin2_div_data {
  75        const char *name;
  76        const u8 *parent_ids;
  77        int num_parents;
  78        unsigned long flags;
  79        struct berlin2_div_map map;
  80        u8 div_flags;
  81};
  82
  83struct clk_hw *
  84berlin2_div_register(const struct berlin2_div_map *map,
  85             void __iomem *base,  const char *name, u8 div_flags,
  86             const char **parent_names, int num_parents,
  87             unsigned long flags,  spinlock_t *lock);
  88
  89#endif /* __BERLIN2_DIV_H */
  90