diff options
| -rw-r--r-- | drivers/i2c/busses/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-mv64xxx.c | 328 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-sh_mobile.c | 112 | ||||
| -rw-r--r-- | drivers/macintosh/Kconfig | 10 | ||||
| -rw-r--r-- | drivers/macintosh/Makefile | 1 | ||||
| -rw-r--r-- | drivers/macintosh/therm_pm72.c | 2278 | ||||
| -rw-r--r-- | drivers/macintosh/therm_pm72.h | 326 |
7 files changed, 252 insertions, 2804 deletions
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 91a488c7cc44..31e8308ba899 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
| @@ -753,6 +753,7 @@ config I2C_SH7760 | |||
| 753 | 753 | ||
| 754 | config I2C_SH_MOBILE | 754 | config I2C_SH_MOBILE |
| 755 | tristate "SuperH Mobile I2C Controller" | 755 | tristate "SuperH Mobile I2C Controller" |
| 756 | depends on HAS_DMA | ||
| 756 | depends on SUPERH || ARCH_SHMOBILE || COMPILE_TEST | 757 | depends on SUPERH || ARCH_SHMOBILE || COMPILE_TEST |
| 757 | help | 758 | help |
| 758 | If you say yes to this option, support will be included for the | 759 | If you say yes to this option, support will be included for the |
diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c index 373f6d4e4080..30059c1df2a3 100644 --- a/drivers/i2c/busses/i2c-mv64xxx.c +++ b/drivers/i2c/busses/i2c-mv64xxx.c | |||
| @@ -30,12 +30,12 @@ | |||
| 30 | #define MV64XXX_I2C_BAUD_DIV_N(val) (val & 0x7) | 30 | #define MV64XXX_I2C_BAUD_DIV_N(val) (val & 0x7) |
| 31 | #define MV64XXX_I2C_BAUD_DIV_M(val) ((val & 0xf) << 3) | 31 | #define MV64XXX_I2C_BAUD_DIV_M(val) ((val & 0xf) << 3) |
| 32 | 32 | ||
| 33 | #define MV64XXX_I2C_REG_CONTROL_ACK 0x00000004 | 33 | #define MV64XXX_I2C_REG_CONTROL_ACK BIT(2) |
| 34 | #define MV64XXX_I2C_REG_CONTROL_IFLG 0x00000008 | 34 | #define MV64XXX_I2C_REG_CONTROL_IFLG BIT(3) |
| 35 | #define MV64XXX_I2C_REG_CONTROL_STOP 0x00000010 | 35 | #define MV64XXX_I2C_REG_CONTROL_STOP BIT(4) |
| 36 | #define MV64XXX_I2C_REG_CONTROL_START 0x00000020 | 36 | #define MV64XXX_I2C_REG_CONTROL_START BIT(5) |
| 37 | #define MV64XXX_I2C_REG_CONTROL_TWSIEN 0x00000040 | 37 | #define MV64XXX_I2C_REG_CONTROL_TWSIEN BIT(6) |
| 38 | #define MV64XXX_I2C_REG_CONTROL_INTEN 0x00000080 | 38 | #define MV64XXX_I2C_REG_CONTROL_INTEN BIT(7) |
| 39 | 39 | ||
| 40 | /* Ctlr status values */ | 40 | /* Ctlr status values */ |
| 41 | #define MV64XXX_I2C_STATUS_BUS_ERR 0x00 | 41 | #define MV64XXX_I2C_STATUS_BUS_ERR 0x00 |
| @@ -68,19 +68,17 @@ | |||
| 68 | #define MV64XXX_I2C_REG_BRIDGE_TIMING 0xe0 | 68 | #define MV64XXX_I2C_REG_BRIDGE_TIMING 0xe0 |
| 69 | 69 | ||
| 70 | /* Bridge Control values */ | 70 | /* Bridge Control values */ |
| 71 | #define MV64XXX_I2C_BRIDGE_CONTROL_WR 0x00000001 | 71 | #define MV64XXX_I2C_BRIDGE_CONTROL_WR BIT(0) |
| 72 | #define MV64XXX_I2C_BRIDGE_CONTROL_RD 0x00000002 | 72 | #define MV64XXX_I2C_BRIDGE_CONTROL_RD BIT(1) |
| 73 | #define MV64XXX_I2C_BRIDGE_CONTROL_ADDR_SHIFT 2 | 73 | #define MV64XXX_I2C_BRIDGE_CONTROL_ADDR_SHIFT 2 |
| 74 | #define MV64XXX_I2C_BRIDGE_CONTROL_ADDR_EXT 0x00001000 | 74 | #define MV64XXX_I2C_BRIDGE_CONTROL_ADDR_EXT BIT(12) |
| 75 | #define MV64XXX_I2C_BRIDGE_CONTROL_TX_SIZE_SHIFT 13 | 75 | #define MV64XXX_I2C_BRIDGE_CONTROL_TX_SIZE_SHIFT 13 |
| 76 | #define MV64XXX_I2C_BRIDGE_CONTROL_RX_SIZE_SHIFT 16 | 76 | #define MV64XXX_I2C_BRIDGE_CONTROL_RX_SIZE_SHIFT 16 |
| 77 | #define MV64XXX_I2C_BRIDGE_CONTROL_ENABLE 0x00080000 | 77 | #define MV64XXX_I2C_BRIDGE_CONTROL_ENABLE BIT(19) |
| 78 | #define MV64XXX_I2C_BRIDGE_CONTROL_REPEATED_START BIT(20) | ||
| 78 | 79 | ||
| 79 | /* Bridge Status values */ | 80 | /* Bridge Status values */ |
| 80 | #define MV64XXX_I2C_BRIDGE_STATUS_ERROR 0x00000001 | 81 | #define MV64XXX_I2C_BRIDGE_STATUS_ERROR BIT(0) |
| 81 | #define MV64XXX_I2C_STATUS_OFFLOAD_ERROR 0xf0000001 | ||
| 82 | #define MV64XXX_I2C_STATUS_OFFLOAD_OK 0xf0000000 | ||
| 83 | |||
| 84 | 82 | ||
| 85 | /* Driver states */ | 83 | /* Driver states */ |
| 86 | enum { | 84 | enum { |
| @@ -99,14 +97,12 @@ enum { | |||
| 99 | MV64XXX_I2C_ACTION_INVALID, | 97 | MV64XXX_I2C_ACTION_INVALID, |
| 100 | MV64XXX_I2C_ACTION_CONTINUE, | 98 | MV64XXX_I2C_ACTION_CONTINUE, |
| 101 | MV64XXX_I2C_ACTION_SEND_RESTART, | 99 | MV64XXX_I2C_ACTION_SEND_RESTART, |
| 102 | MV64XXX_I2C_ACTION_OFFLOAD_RESTART, | ||
| 103 | MV64XXX_I2C_ACTION_SEND_ADDR_1, | 100 | MV64XXX_I2C_ACTION_SEND_ADDR_1, |
| 104 | MV64XXX_I2C_ACTION_SEND_ADDR_2, | 101 | MV64XXX_I2C_ACTION_SEND_ADDR_2, |
| 105 | MV64XXX_I2C_ACTION_SEND_DATA, | 102 | MV64XXX_I2C_ACTION_SEND_DATA, |
| 106 | MV64XXX_I2C_ACTION_RCV_DATA, | 103 | MV64XXX_I2C_ACTION_RCV_DATA, |
| 107 | MV64XXX_I2C_ACTION_RCV_DATA_STOP, | 104 | MV64XXX_I2C_ACTION_RCV_DATA_STOP, |
| 108 | MV64XXX_I2C_ACTION_SEND_STOP, | 105 | MV64XXX_I2C_ACTION_SEND_STOP, |
| 109 | MV64XXX_I2C_ACTION_OFFLOAD_SEND_STOP, | ||
| 110 | }; | 106 | }; |
| 111 | 107 | ||
| 112 | struct mv64xxx_i2c_regs { | 108 | struct mv64xxx_i2c_regs { |
| @@ -193,75 +189,6 @@ mv64xxx_i2c_prepare_for_io(struct mv64xxx_i2c_data *drv_data, | |||
| 193 | } | 189 | } |
| 194 | } | 190 | } |
| 195 | 191 | ||
| 196 | static int mv64xxx_i2c_offload_msg(struct mv64xxx_i2c_data *drv_data) | ||
| 197 | { | ||
| 198 | unsigned long data_reg_hi = 0; | ||
| 199 | unsigned long data_reg_lo = 0; | ||
| 200 | unsigned long ctrl_reg; | ||
| 201 | struct i2c_msg *msg = drv_data->msgs; | ||
| 202 | |||
| 203 | if (!drv_data->offload_enabled) | ||
| 204 | return -EOPNOTSUPP; | ||
| 205 | |||
| 206 | /* Only regular transactions can be offloaded */ | ||
| 207 | if ((msg->flags & ~(I2C_M_TEN | I2C_M_RD)) != 0) | ||
| 208 | return -EINVAL; | ||
| 209 | |||
| 210 | /* Only 1-8 byte transfers can be offloaded */ | ||
| 211 | if (msg->len < 1 || msg->len > 8) | ||
| 212 | return -EINVAL; | ||
| 213 | |||
| 214 | /* Build transaction */ | ||
| 215 | ctrl_reg = MV64XXX_I2C_BRIDGE_CONTROL_ENABLE | | ||
| 216 | (msg->addr << MV64XXX_I2C_BRIDGE_CONTROL_ADDR_SHIFT); | ||
| 217 | |||
| 218 | if ((msg->flags & I2C_M_TEN) != 0) | ||
| 219 | ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_ADDR_EXT; | ||
| 220 | |||
| 221 | if ((msg->flags & I2C_M_RD) == 0) { | ||
| 222 | u8 local_buf[8] = { 0 }; | ||
| 223 | |||
| 224 | memcpy(local_buf, msg->buf, msg->len); | ||
| 225 | data_reg_lo = cpu_to_le32(*((u32 *)local_buf)); | ||
| 226 | data_reg_hi = cpu_to_le32(*((u32 *)(local_buf+4))); | ||
| 227 | |||
| 228 | ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_WR | | ||
| 229 | (msg->len - 1) << MV64XXX_I2C_BRIDGE_CONTROL_TX_SIZE_SHIFT; | ||
| 230 | |||
| 231 | writel(data_reg_lo, | ||
| 232 | drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_LO); | ||
| 233 | writel(data_reg_hi, | ||
| 234 | drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_HI); | ||
| 235 | |||
| 236 | } else { | ||
| 237 | ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_RD | | ||
| 238 | (msg->len - 1) << MV64XXX_I2C_BRIDGE_CONTROL_RX_SIZE_SHIFT; | ||
| 239 | } | ||
| 240 | |||
| 241 | /* Execute transaction */ | ||
| 242 | writel(ctrl_reg, drv_data->reg_base + MV64XXX_I2C_REG_BRIDGE_CONTROL); | ||
| 243 | |||
| 244 | return 0; | ||
| 245 | } | ||
| 246 | |||
| 247 | static void | ||
| 248 | mv64xxx_i2c_update_offload_data(struct mv64xxx_i2c_data *drv_data) | ||
| 249 | { | ||
| 250 | struct i2c_msg *msg = drv_data->msg; | ||
| 251 | |||
| 252 | if (msg->flags & I2C_M_RD) { | ||
| 253 | u32 data_reg_lo = readl(drv_data->reg_base + | ||
| 254 | MV64XXX_I2C_REG_RX_DATA_LO); | ||
| 255 | u32 data_reg_hi = readl(drv_data->reg_base + | ||
| 256 | MV64XXX_I2C_REG_RX_DATA_HI); | ||
| 257 | u8 local_buf[8] = { 0 }; | ||
| 258 | |||
| 259 | *((u32 *)local_buf) = le32_to_cpu(data_reg_lo); | ||
| 260 | *((u32 *)(local_buf+4)) = le32_to_cpu(data_reg_hi); | ||
| 261 | memcpy(msg->buf, local_buf, msg->len); | ||
| 262 | } | ||
| 263 | |||
| 264 | } | ||
| 265 | /* | 192 | /* |
| 266 | ***************************************************************************** | 193 | ***************************************************************************** |
| 267 | * | 194 | * |
| @@ -389,16 +316,6 @@ mv64xxx_i2c_fsm(struct mv64xxx_i2c_data *drv_data, u32 status) | |||
| 389 | drv_data->rc = -ENXIO; | 316 | drv_data->rc = -ENXIO; |
| 390 | break; | 317 | break; |
| 391 | 318 | ||
| 392 | case MV64XXX_I2C_STATUS_OFFLOAD_OK: | ||
| 393 | if (drv_data->send_stop || drv_data->aborting) { | ||
| 394 | drv_data->action = MV64XXX_I2C_ACTION_OFFLOAD_SEND_STOP; | ||
| 395 | drv_data->state = MV64XXX_I2C_STATE_IDLE; | ||
| 396 | } else { | ||
| 397 | drv_data->action = MV64XXX_I2C_ACTION_OFFLOAD_RESTART; | ||
| 398 | drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_RESTART; | ||
| 399 | } | ||
| 400 | break; | ||
| 401 | |||
| 402 | default: | 319 | default: |
| 403 | dev_err(&drv_data->adapter.dev, | 320 | dev_err(&drv_data->adapter.dev, |
| 404 | "mv64xxx_i2c_fsm: Ctlr Error -- state: 0x%x, " | 321 | "mv64xxx_i2c_fsm: Ctlr Error -- state: 0x%x, " |
| @@ -419,25 +336,15 @@ static void mv64xxx_i2c_send_start(struct mv64xxx_i2c_data *drv_data) | |||
| 419 | drv_data->aborting = 0; | 336 | drv_data->aborting = 0; |
| 420 | drv_data->rc = 0; | 337 | drv_data->rc = 0; |
| 421 | 338 | ||
| 422 | /* Can we offload this msg ? */ | 339 | mv64xxx_i2c_prepare_for_io(drv_data, drv_data->msgs); |
| 423 | if (mv64xxx_i2c_offload_msg(drv_data) < 0) { | 340 | writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START, |
| 424 | /* No, switch to standard path */ | 341 | drv_data->reg_base + drv_data->reg_offsets.control); |
| 425 | mv64xxx_i2c_prepare_for_io(drv_data, drv_data->msgs); | ||
| 426 | writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START, | ||
| 427 | drv_data->reg_base + drv_data->reg_offsets.control); | ||
| 428 | } | ||
