1/* 2 * Copyright (C) 2009 Nokia 3 * Copyright (C) 2009-2010 Texas Instruments 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 */ 9 10#include "mux34xx.h" 11 12#define OMAP_MUX_TERMINATOR 0xffff 13 14/* 34xx mux mode options for each pin. See TRM for options */ 15#define OMAP_MUX_MODE0 0 16#define OMAP_MUX_MODE1 1 17#define OMAP_MUX_MODE2 2 18#define OMAP_MUX_MODE3 3 19#define OMAP_MUX_MODE4 4 20#define OMAP_MUX_MODE5 5 21#define OMAP_MUX_MODE6 6 22#define OMAP_MUX_MODE7 7 23 24/* 24xx/34xx mux bit defines */ 25#define OMAP_PULL_ENA (1 << 3) 26#define OMAP_PULL_UP (1 << 4) 27#define OMAP_ALTELECTRICALSEL (1 << 5) 28 29/* omap3/4/5 specific mux bit defines */ 30#define OMAP_INPUT_EN (1 << 8) 31#define OMAP_OFF_EN (1 << 9) 32#define OMAP_OFFOUT_EN (1 << 10) 33#define OMAP_OFFOUT_VAL (1 << 11) 34#define OMAP_OFF_PULL_EN (1 << 12) 35#define OMAP_OFF_PULL_UP (1 << 13) 36#define OMAP_WAKEUP_EN (1 << 14) 37#define OMAP_WAKEUP_EVENT (1 << 15) 38 39/* Active pin states */ 40#define OMAP_PIN_OUTPUT 0 41#define OMAP_PIN_INPUT OMAP_INPUT_EN 42#define OMAP_PIN_INPUT_PULLUP (OMAP_PULL_ENA | OMAP_INPUT_EN \ 43 | OMAP_PULL_UP) 44#define OMAP_PIN_INPUT_PULLDOWN (OMAP_PULL_ENA | OMAP_INPUT_EN) 45 46/* Off mode states */ 47#define OMAP_PIN_OFF_NONE 0 48#define OMAP_PIN_OFF_OUTPUT_HIGH (OMAP_OFF_EN | OMAP_OFFOUT_EN \ 49 | OMAP_OFFOUT_VAL) 50#define OMAP_PIN_OFF_OUTPUT_LOW (OMAP_OFF_EN | OMAP_OFFOUT_EN) 51#define OMAP_PIN_OFF_INPUT_PULLUP (OMAP_OFF_EN | OMAP_OFF_PULL_EN \ 52 | OMAP_OFF_PULL_UP) 53#define OMAP_PIN_OFF_INPUT_PULLDOWN (OMAP_OFF_EN | OMAP_OFF_PULL_EN) 54#define OMAP_PIN_OFF_WAKEUPENABLE OMAP_WAKEUP_EN 55 56#define OMAP_MODE_GPIO(partition, x) (((x) & OMAP_MUX_MODE7) == \ 57 partition->gpio) 58#define OMAP_MODE_UART(x) (((x) & OMAP_MUX_MODE7) == OMAP_MUX_MODE0) 59 60/* Flags for omapX_mux_init */ 61#define OMAP_PACKAGE_MASK 0xffff 62#define OMAP_PACKAGE_CBP 6 /* 515-pin 0.40 0.50 */ 63#define OMAP_PACKAGE_CUS 5 /* 423-pin 0.65 */ 64#define OMAP_PACKAGE_CBB 4 /* 515-pin 0.40 0.50 */ 65#define OMAP_PACKAGE_CBC 3 /* 515-pin 0.50 0.65 */ 66 67#define OMAP_MUX_NR_MODES 8 /* Available modes */ 68#define OMAP_MUX_NR_SIDES 2 /* Bottom & top */ 69 70/* 71 * omap_mux_init flags definition: 72 * 73 * OMAP_GPIO_MUX_MODE, bits 0-2: gpio muxing mode, same like pad control 74 * register which includes values from 0-7. 75 * OMAP_MUX_REG_8BIT: Ensure that access to padconf is done in 8 bits. 76 * The default value is 16 bits. 77 */ 78#define OMAP_MUX_GPIO_IN_MODE0 OMAP_MUX_MODE0 79#define OMAP_MUX_GPIO_IN_MODE1 OMAP_MUX_MODE1 80#define OMAP_MUX_GPIO_IN_MODE2 OMAP_MUX_MODE2 81#define OMAP_MUX_GPIO_IN_MODE3 OMAP_MUX_MODE3 82#define OMAP_MUX_GPIO_IN_MODE4 OMAP_MUX_MODE4 83#define OMAP_MUX_GPIO_IN_MODE5 OMAP_MUX_MODE5 84#define OMAP_MUX_GPIO_IN_MODE6 OMAP_MUX_MODE6 85#define OMAP_MUX_GPIO_IN_MODE7 OMAP_MUX_MODE7 86#define OMAP_MUX_REG_8BIT (1 << 3) 87 88/** 89 * struct omap_board_data - board specific device data 90 * @id: instance id 91 * @flags: additional flags for platform init code 92 * @pads: array of device specific pads 93 * @pads_cnt: ARRAY_SIZE() of pads 94 */ 95struct omap_board_data { 96 int id; 97 u32 flags; 98 struct omap_device_pad *pads; 99 int pads_cnt; 100}; 101 102/** 103 * struct mux_partition - contain partition related information 104 * @name: name of the current partition 105 * @flags: flags specific to this partition 106 * @gpio: gpio mux mode 107 * @phys: physical address 108 * @size: partition size 109 * @base: virtual address after ioremap 110 * @muxmodes: list of nodes that belong to a partition 111 * @node: list node for the partitions linked list 112 */ 113struct omap_mux_partition { 114 const char *name; 115 u32 flags; 116 u32 gpio; 117 u32 phys; 118 u32 size; 119 void __iomem *base; 120 struct list_head muxmodes; 121 struct list_head node; 122}; 123 124/** 125 * struct omap_mux - data for omap mux register offset and it's value 126 * @reg_offset: mux register offset from the mux base 127 * @gpio: GPIO number 128 * @muxnames: available signal modes for a ball 129 * @balls: available balls on the package 130 */ 131struct omap_mux { 132 u16 reg_offset; 133 u16 gpio; 134#ifdef CONFIG_OMAP_MUX 135 char *muxnames[OMAP_MUX_NR_MODES]; 136#ifdef CONFIG_DEBUG_FS 137 char *balls[OMAP_MUX_NR_SIDES]; 138#endif 139#endif 140}; 141 142/** 143 * struct omap_ball - data for balls on omap package 144 * @reg_offset: mux register offset from the mux base 145 * @balls: available balls on the package 146 */ 147struct omap_ball { 148 u16 reg_offset; 149 char *balls[OMAP_MUX_NR_SIDES]; 150}; 151 152/** 153 * struct omap_board_mux - data for initializing mux registers 154 * @reg_offset: mux register offset from the mux base 155 * @mux_value: desired mux value to set 156 */ 157struct omap_board_mux { 158 u16 reg_offset; 159 u16 value; 160}; 161 162#define OMAP_DEVICE_PAD_REMUX BIT(1) /* Dynamically remux a pad, 163 needs enable, idle and off 164 values */ 165#define OMAP_DEVICE_PAD_WAKEUP BIT(0) /* Pad is wake-up capable */ 166 167/** 168 * struct omap_device_pad - device specific pad configuration 169 * @name: signal name 170 * @flags: pad specific runtime flags 171 * @enable: runtime value for a pad 172 * @idle: idle value for a pad 173 * @off: off value for a pad, defaults to safe mode 174 * @partition: mux partition 175 * @mux: mux register 176 */ 177struct omap_device_pad { 178 char *name; 179 u8 flags; 180 u16 enable; 181 u16 idle; 182 u16 off; 183 struct omap_mux_partition *partition; 184 struct omap_mux *mux; 185}; 186 187struct omap_hwmod_mux_info; 188 189#define OMAP_MUX_STATIC(signal, mode) \ 190{ \ 191 .name = (signal), \ 192 .enable = (mode), \ 193} 194 195#if defined(CONFIG_OMAP_MUX) 196 197/** 198 * omap_mux_init_gpio - initialize a signal based on the GPIO number 199 * @gpio: GPIO number 200 * @val: Options for the mux register value 201 */ 202int omap_mux_init_gpio(int gpio, int val); 203 204/** 205 * omap_mux_init_signal - initialize a signal based on the signal name 206 * @muxname: Mux name in mode0_name.signal_name format 207 * @val: Options for the mux register value 208 */ 209int omap_mux_init_signal(const char *muxname, int val); 210 211/** 212 * omap_hwmod_mux_init - initialize hwmod specific mux data 213 * @bpads: Board specific device signal names 214 * @nr_pads: Number of signal names for the device 215 */ 216extern struct omap_hwmod_mux_info * 217omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads); 218 219/** 220 * omap_hwmod_mux - omap hwmod specific pin muxing 221 * @hmux: Pads for a hwmod 222 * @state: Desired _HWMOD_STATE 223 * 224 * Called only from omap_hwmod.c, do not use. 225 */ 226void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state); 227 228int omap_mux_get_by_name(const char *muxname, 229 struct omap_mux_partition **found_partition, 230 struct omap_mux **found_mux); 231#else 232 233static inline int omap_mux_get_by_name(const char *muxname, 234 struct omap_mux_partition **found_partition, 235 struct omap_mux **found_mux) 236{ 237 return 0; 238} 239 240static inline int omap_mux_init_gpio(int gpio, int val) 241{ 242 return 0; 243} 244static inline int omap_mux_init_signal(char *muxname, int val) 245{ 246 return 0; 247} 248 249static inline struct omap_hwmod_mux_info * 250omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads) 251{ 252 return NULL; 253} 254 255static inline void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state) 256{ 257} 258 259static struct omap_board_mux *board_mux __maybe_unused; 260 261#endif 262 263/** 264 * omap_mux_get_gpio() - get mux register value based on GPIO number 265 * @gpio: GPIO number 266 * 267 */ 268u16 omap_mux_get_gpio(int gpio); 269 270/** 271 * omap_mux_set_gpio() - set mux register value based on GPIO number 272 * @val: New mux register value 273 * @gpio: GPIO number 274 * 275 */ 276void omap_mux_set_gpio(u16 val, int gpio); 277 278/** 279 * omap_mux_get() - get a mux partition by name 280 * @name: Name of the mux partition 281 * 282 */ 283struct omap_mux_partition *omap_mux_get(const char *name); 284 285/** 286 * omap_mux_read() - read mux register 287 * @partition: Mux partition 288 * @mux_offset: Offset of the mux register 289 * 290 */ 291u16 omap_mux_read(struct omap_mux_partition *p, u16 mux_offset); 292 293/** 294 * omap_mux_write() - write mux register 295 * @partition: Mux partition 296 * @val: New mux register value 297 * @mux_offset: Offset of the mux register 298 * 299 * This should be only needed for dynamic remuxing of non-gpio signals. 300 */ 301void omap_mux_write(struct omap_mux_partition *p, u16 val, u16 mux_offset); 302 303/** 304 * omap_mux_write_array() - write an array of mux registers 305 * @partition: Mux partition 306 * @board_mux: Array of mux registers terminated by MAP_MUX_TERMINATOR 307 * 308 * This should be only needed for dynamic remuxing of non-gpio signals. 309 */ 310void omap_mux_write_array(struct omap_mux_partition *p, 311 struct omap_board_mux *board_mux); 312 313/** 314 * omap2420_mux_init() - initialize mux system with board specific set 315 * @board_mux: Board specific mux table 316 * @flags: OMAP package type used for the board 317 */ 318int omap2420_mux_init(struct omap_board_mux *board_mux, int flags); 319 320/** 321 * omap2430_mux_init() - initialize mux system with board specific set 322 * @board_mux: Board specific mux table 323 * @flags: OMAP package type used for the board 324 */ 325int omap2430_mux_init(struct omap_board_mux *board_mux, int flags); 326 327/** 328 * omap3_mux_init() - initialize mux system with board specific set 329 * @board_mux: Board specific mux table 330 * @flags: OMAP package type used for the board 331 */ 332int omap3_mux_init(struct omap_board_mux *board_mux, int flags); 333 334/** 335 * omap4_mux_init() - initialize mux system with board specific set 336 * @board_subset: Board specific mux table 337 * @board_wkup_subset: Board specific mux table for wakeup instance 338 * @flags: OMAP package type used for the board 339 */ 340int omap4_mux_init(struct omap_board_mux *board_subset, 341 struct omap_board_mux *board_wkup_subset, int flags); 342 343/** 344 * omap_mux_init - private mux init function, do not call 345 */ 346int omap_mux_init(const char *name, u32 flags, 347 u32 mux_pbase, u32 mux_size, 348 struct omap_mux *superset, 349 struct omap_mux *package_subset, 350 struct omap_board_mux *board_mux, 351 struct omap_ball *package_balls); 352 353