0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <linux/delay.h>
0016 #include <linux/gpio/consumer.h>
0017 #include <linux/io.h>
0018 #include <linux/kernel.h>
0019 #include <linux/module.h>
0020 #include <linux/regmap.h>
0021 #include <linux/slab.h>
0022 #include <linux/usb.h>
0023
0024 #include "isp1760-core.h"
0025 #include "isp1760-hcd.h"
0026 #include "isp1760-regs.h"
0027 #include "isp1760-udc.h"
0028
0029 static int isp1760_init_core(struct isp1760_device *isp)
0030 {
0031 struct isp1760_hcd *hcd = &isp->hcd;
0032 struct isp1760_udc *udc = &isp->udc;
0033 u32 otg_ctrl;
0034
0035
0036 if (isp->rst_gpio) {
0037 gpiod_set_value_cansleep(isp->rst_gpio, 1);
0038 msleep(50);
0039 gpiod_set_value_cansleep(isp->rst_gpio, 0);
0040 }
0041
0042
0043
0044
0045
0046 isp1760_field_set(hcd->fields, SW_RESET_RESET_ALL);
0047 msleep(100);
0048
0049
0050 if ((isp->devflags & ISP1760_FLAG_ANALOG_OC) && hcd->is_isp1763) {
0051 dev_err(isp->dev, "isp1763 analog overcurrent not available\n");
0052 return -EINVAL;
0053 }
0054
0055 if (isp->devflags & ISP1760_FLAG_BUS_WIDTH_16)
0056 isp1760_field_clear(hcd->fields, HW_DATA_BUS_WIDTH);
0057 if (isp->devflags & ISP1760_FLAG_BUS_WIDTH_8)
0058 isp1760_field_set(hcd->fields, HW_DATA_BUS_WIDTH);
0059 if (isp->devflags & ISP1760_FLAG_ANALOG_OC)
0060 isp1760_field_set(hcd->fields, HW_ANA_DIGI_OC);
0061 if (isp->devflags & ISP1760_FLAG_DACK_POL_HIGH)
0062 isp1760_field_set(hcd->fields, HW_DACK_POL_HIGH);
0063 if (isp->devflags & ISP1760_FLAG_DREQ_POL_HIGH)
0064 isp1760_field_set(hcd->fields, HW_DREQ_POL_HIGH);
0065 if (isp->devflags & ISP1760_FLAG_INTR_POL_HIGH)
0066 isp1760_field_set(hcd->fields, HW_INTR_HIGH_ACT);
0067 if (isp->devflags & ISP1760_FLAG_INTR_EDGE_TRIG)
0068 isp1760_field_set(hcd->fields, HW_INTR_EDGE_TRIG);
0069
0070
0071
0072
0073
0074
0075
0076 if (isp->devflags & ISP1760_FLAG_ISP1761) {
0077 isp1760_reg_write(udc->regs, ISP176x_DC_MODE, 0);
0078 isp1760_field_set(hcd->fields, HW_COMN_IRQ);
0079 }
0080
0081
0082
0083
0084
0085
0086
0087 if (isp->devflags & ISP1760_FLAG_ISP1761) {
0088 if (isp->devflags & ISP1760_FLAG_PERIPHERAL_EN) {
0089 otg_ctrl = (ISP176x_HW_DM_PULLDOWN_CLEAR |
0090 ISP176x_HW_DP_PULLDOWN_CLEAR |
0091 ISP176x_HW_OTG_DISABLE);
0092 } else {
0093 otg_ctrl = (ISP176x_HW_SW_SEL_HC_DC_CLEAR |
0094 ISP176x_HW_VBUS_DRV |
0095 ISP176x_HW_SEL_CP_EXT);
0096 }
0097 isp1760_reg_write(hcd->regs, ISP176x_HC_OTG_CTRL, otg_ctrl);
0098 }
0099
0100 dev_info(isp->dev, "%s bus width: %u, oc: %s\n",
0101 hcd->is_isp1763 ? "isp1763" : "isp1760",
0102 isp->devflags & ISP1760_FLAG_BUS_WIDTH_8 ? 8 :
0103 isp->devflags & ISP1760_FLAG_BUS_WIDTH_16 ? 16 : 32,
0104 hcd->is_isp1763 ? "not available" :
0105 isp->devflags & ISP1760_FLAG_ANALOG_OC ? "analog" : "digital");
0106
0107 return 0;
0108 }
0109
0110 void isp1760_set_pullup(struct isp1760_device *isp, bool enable)
0111 {
0112 struct isp1760_udc *udc = &isp->udc;
0113
0114 if (enable)
0115 isp1760_field_set(udc->fields, HW_DP_PULLUP);
0116 else
0117 isp1760_field_set(udc->fields, HW_DP_PULLUP_CLEAR);
0118 }
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128 static const struct isp1760_memory_layout isp176x_memory_conf = {
0129 .blocks[0] = 32,
0130 .blocks_size[0] = 256,
0131 .blocks[1] = 20,
0132 .blocks_size[1] = 1024,
0133 .blocks[2] = 4,
0134 .blocks_size[2] = 8192,
0135
0136 .slot_num = 32,
0137 .payload_blocks = 32 + 20 + 4,
0138 .payload_area_size = 0xf000,
0139 };
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149 static const struct isp1760_memory_layout isp1763_memory_conf = {
0150 .blocks[0] = 8,
0151 .blocks_size[0] = 256,
0152 .blocks[1] = 2,
0153 .blocks_size[1] = 1024,
0154 .blocks[2] = 4,
0155 .blocks_size[2] = 4096,
0156
0157 .slot_num = 16,
0158 .payload_blocks = 8 + 2 + 4,
0159 .payload_area_size = 0x5000,
0160 };
0161
0162 static const struct regmap_range isp176x_hc_volatile_ranges[] = {
0163 regmap_reg_range(ISP176x_HC_USBCMD, ISP176x_HC_ATL_PTD_LASTPTD),
0164 regmap_reg_range(ISP176x_HC_BUFFER_STATUS, ISP176x_HC_MEMORY),
0165 regmap_reg_range(ISP176x_HC_INTERRUPT, ISP176x_HC_OTG_CTRL_CLEAR),
0166 };
0167
0168 static const struct regmap_access_table isp176x_hc_volatile_table = {
0169 .yes_ranges = isp176x_hc_volatile_ranges,
0170 .n_yes_ranges = ARRAY_SIZE(isp176x_hc_volatile_ranges),
0171 };
0172
0173 static const struct regmap_config isp1760_hc_regmap_conf = {
0174 .name = "isp1760-hc",
0175 .reg_bits = 16,
0176 .reg_stride = 4,
0177 .val_bits = 32,
0178 .fast_io = true,
0179 .max_register = ISP176x_HC_OTG_CTRL_CLEAR,
0180 .volatile_table = &isp176x_hc_volatile_table,
0181 };
0182
0183 static const struct reg_field isp1760_hc_reg_fields[] = {
0184 [HCS_PPC] = REG_FIELD(ISP176x_HC_HCSPARAMS, 4, 4),
0185 [HCS_N_PORTS] = REG_FIELD(ISP176x_HC_HCSPARAMS, 0, 3),
0186 [HCC_ISOC_CACHE] = REG_FIELD(ISP176x_HC_HCCPARAMS, 7, 7),
0187 [HCC_ISOC_THRES] = REG_FIELD(ISP176x_HC_HCCPARAMS, 4, 6),
0188 [CMD_LRESET] = REG_FIELD(ISP176x_HC_USBCMD, 7, 7),
0189 [CMD_RESET] = REG_FIELD(ISP176x_HC_USBCMD, 1, 1),
0190 [CMD_RUN] = REG_FIELD(ISP176x_HC_USBCMD, 0, 0),
0191 [STS_PCD] = REG_FIELD(ISP176x_HC_USBSTS, 2, 2),
0192 [HC_FRINDEX] = REG_FIELD(ISP176x_HC_FRINDEX, 0, 13),
0193 [FLAG_CF] = REG_FIELD(ISP176x_HC_CONFIGFLAG, 0, 0),
0194 [HC_ISO_PTD_DONEMAP] = REG_FIELD(ISP176x_HC_ISO_PTD_DONEMAP, 0, 31),
0195 [HC_ISO_PTD_SKIPMAP] = REG_FIELD(ISP176x_HC_ISO_PTD_SKIPMAP, 0, 31),
0196 [HC_ISO_PTD_LASTPTD] = REG_FIELD(ISP176x_HC_ISO_PTD_LASTPTD, 0, 31),
0197 [HC_INT_PTD_DONEMAP] = REG_FIELD(ISP176x_HC_INT_PTD_DONEMAP, 0, 31),
0198 [HC_INT_PTD_SKIPMAP] = REG_FIELD(ISP176x_HC_INT_PTD_SKIPMAP, 0, 31),
0199 [HC_INT_PTD_LASTPTD] = REG_FIELD(ISP176x_HC_INT_PTD_LASTPTD, 0, 31),
0200 [HC_ATL_PTD_DONEMAP] = REG_FIELD(ISP176x_HC_ATL_PTD_DONEMAP, 0, 31),
0201 [HC_ATL_PTD_SKIPMAP] = REG_FIELD(ISP176x_HC_ATL_PTD_SKIPMAP, 0, 31),
0202 [HC_ATL_PTD_LASTPTD] = REG_FIELD(ISP176x_HC_ATL_PTD_LASTPTD, 0, 31),
0203 [PORT_OWNER] = REG_FIELD(ISP176x_HC_PORTSC1, 13, 13),
0204 [PORT_POWER] = REG_FIELD(ISP176x_HC_PORTSC1, 12, 12),
0205 [PORT_LSTATUS] = REG_FIELD(ISP176x_HC_PORTSC1, 10, 11),
0206 [PORT_RESET] = REG_FIELD(ISP176x_HC_PORTSC1, 8, 8),
0207 [PORT_SUSPEND] = REG_FIELD(ISP176x_HC_PORTSC1, 7, 7),
0208 [PORT_RESUME] = REG_FIELD(ISP176x_HC_PORTSC1, 6, 6),
0209 [PORT_PE] = REG_FIELD(ISP176x_HC_PORTSC1, 2, 2),
0210 [PORT_CSC] = REG_FIELD(ISP176x_HC_PORTSC1, 1, 1),
0211 [PORT_CONNECT] = REG_FIELD(ISP176x_HC_PORTSC1, 0, 0),
0212 [ALL_ATX_RESET] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 31, 31),
0213 [HW_ANA_DIGI_OC] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 15, 15),
0214 [HW_COMN_IRQ] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 10, 10),
0215 [HW_DATA_BUS_WIDTH] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 8, 8),
0216 [HW_DACK_POL_HIGH] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 6, 6),
0217 [HW_DREQ_POL_HIGH] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 5, 5),
0218 [HW_INTR_HIGH_ACT] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 2, 2),
0219 [HW_INTR_EDGE_TRIG] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 1, 1),
0220 [HW_GLOBAL_INTR_EN] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 0, 0),
0221 [HC_CHIP_REV] = REG_FIELD(ISP176x_HC_CHIP_ID, 16, 31),
0222 [HC_CHIP_ID_HIGH] = REG_FIELD(ISP176x_HC_CHIP_ID, 8, 15),
0223 [HC_CHIP_ID_LOW] = REG_FIELD(ISP176x_HC_CHIP_ID, 0, 7),
0224 [HC_SCRATCH] = REG_FIELD(ISP176x_HC_SCRATCH, 0, 31),
0225 [SW_RESET_RESET_ALL] = REG_FIELD(ISP176x_HC_RESET, 0, 0),
0226 [ISO_BUF_FILL] = REG_FIELD(ISP176x_HC_BUFFER_STATUS, 2, 2),
0227 [INT_BUF_FILL] = REG_FIELD(ISP176x_HC_BUFFER_STATUS, 1, 1),
0228 [ATL_BUF_FILL] = REG_FIELD(ISP176x_HC_BUFFER_STATUS, 0, 0),
0229 [MEM_BANK_SEL] = REG_FIELD(ISP176x_HC_MEMORY, 16, 17),
0230 [MEM_START_ADDR] = REG_FIELD(ISP176x_HC_MEMORY, 0, 15),
0231 [HC_INTERRUPT] = REG_FIELD(ISP176x_HC_INTERRUPT, 0, 9),
0232 [HC_ATL_IRQ_ENABLE] = REG_FIELD(ISP176x_HC_INTERRUPT_ENABLE, 8, 8),
0233 [HC_INT_IRQ_ENABLE] = REG_FIELD(ISP176x_HC_INTERRUPT_ENABLE, 7, 7),
0234 [HC_ISO_IRQ_MASK_OR] = REG_FIELD(ISP176x_HC_ISO_IRQ_MASK_OR, 0, 31),
0235 [HC_INT_IRQ_MASK_OR] = REG_FIELD(ISP176x_HC_INT_IRQ_MASK_OR, 0, 31),
0236 [HC_ATL_IRQ_MASK_OR] = REG_FIELD(ISP176x_HC_ATL_IRQ_MASK_OR, 0, 31),
0237 [HC_ISO_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_ISO_IRQ_MASK_AND, 0, 31),
0238 [HC_INT_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_INT_IRQ_MASK_AND, 0, 31),
0239 [HC_ATL_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_ATL_IRQ_MASK_AND, 0, 31),
0240 [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 26, 26),
0241 [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 23, 23),
0242 [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 20, 20),
0243 [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 19, 19),
0244 [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 18, 18),
0245 [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 17, 17),
0246 [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 16, 16),
0247 [HW_OTG_DISABLE] = REG_FIELD(ISP176x_HC_OTG_CTRL, 10, 10),
0248 [HW_SW_SEL_HC_DC] = REG_FIELD(ISP176x_HC_OTG_CTRL, 7, 7),
0249 [HW_VBUS_DRV] = REG_FIELD(ISP176x_HC_OTG_CTRL, 4, 4),
0250 [HW_SEL_CP_EXT] = REG_FIELD(ISP176x_HC_OTG_CTRL, 3, 3),
0251 [HW_DM_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL, 2, 2),
0252 [HW_DP_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL, 1, 1),
0253 [HW_DP_PULLUP] = REG_FIELD(ISP176x_HC_OTG_CTRL, 0, 0),
0254
0255 [HC_FIELD_MAX] = {},
0256 };
0257
0258 static const struct reg_field isp1763_hc_reg_fields[] = {
0259 [CMD_LRESET] = REG_FIELD(ISP1763_HC_USBCMD, 7, 7),
0260 [CMD_RESET] = REG_FIELD(ISP1763_HC_USBCMD, 1, 1),
0261 [CMD_RUN] = REG_FIELD(ISP1763_HC_USBCMD, 0, 0),
0262 [STS_PCD] = REG_FIELD(ISP1763_HC_USBSTS, 2, 2),
0263 [HC_FRINDEX] = REG_FIELD(ISP1763_HC_FRINDEX, 0, 13),
0264 [FLAG_CF] = REG_FIELD(ISP1763_HC_CONFIGFLAG, 0, 0),
0265 [HC_ISO_PTD_DONEMAP] = REG_FIELD(ISP1763_HC_ISO_PTD_DONEMAP, 0, 15),
0266 [HC_ISO_PTD_SKIPMAP] = REG_FIELD(ISP1763_HC_ISO_PTD_SKIPMAP, 0, 15),
0267 [HC_ISO_PTD_LASTPTD] = REG_FIELD(ISP1763_HC_ISO_PTD_LASTPTD, 0, 15),
0268 [HC_INT_PTD_DONEMAP] = REG_FIELD(ISP1763_HC_INT_PTD_DONEMAP, 0, 15),
0269 [HC_INT_PTD_SKIPMAP] = REG_FIELD(ISP1763_HC_INT_PTD_SKIPMAP, 0, 15),
0270 [HC_INT_PTD_LASTPTD] = REG_FIELD(ISP1763_HC_INT_PTD_LASTPTD, 0, 15),
0271 [HC_ATL_PTD_DONEMAP] = REG_FIELD(ISP1763_HC_ATL_PTD_DONEMAP, 0, 15),
0272 [HC_ATL_PTD_SKIPMAP] = REG_FIELD(ISP1763_HC_ATL_PTD_SKIPMAP, 0, 15),
0273 [HC_ATL_PTD_LASTPTD] = REG_FIELD(ISP1763_HC_ATL_PTD_LASTPTD, 0, 15),
0274 [PORT_OWNER] = REG_FIELD(ISP1763_HC_PORTSC1, 13, 13),
0275 [PORT_POWER] = REG_FIELD(ISP1763_HC_PORTSC1, 12, 12),
0276 [PORT_LSTATUS] = REG_FIELD(ISP1763_HC_PORTSC1, 10, 11),
0277 [PORT_RESET] = REG_FIELD(ISP1763_HC_PORTSC1, 8, 8),
0278 [PORT_SUSPEND] = REG_FIELD(ISP1763_HC_PORTSC1, 7, 7),
0279 [PORT_RESUME] = REG_FIELD(ISP1763_HC_PORTSC1, 6, 6),
0280 [PORT_PE] = REG_FIELD(ISP1763_HC_PORTSC1, 2, 2),
0281 [PORT_CSC] = REG_FIELD(ISP1763_HC_PORTSC1, 1, 1),
0282 [PORT_CONNECT] = REG_FIELD(ISP1763_HC_PORTSC1, 0, 0),
0283 [HW_DATA_BUS_WIDTH] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 4, 4),
0284 [HW_DACK_POL_HIGH] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 6, 6),
0285 [HW_DREQ_POL_HIGH] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 5, 5),
0286 [HW_INTF_LOCK] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 3, 3),
0287 [HW_INTR_HIGH_ACT] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 2, 2),
0288 [HW_INTR_EDGE_TRIG] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 1, 1),
0289 [HW_GLOBAL_INTR_EN] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 0, 0),
0290 [SW_RESET_RESET_ATX] = REG_FIELD(ISP1763_HC_RESET, 3, 3),
0291 [SW_RESET_RESET_ALL] = REG_FIELD(ISP1763_HC_RESET, 0, 0),
0292 [HC_CHIP_ID_HIGH] = REG_FIELD(ISP1763_HC_CHIP_ID, 0, 15),
0293 [HC_CHIP_ID_LOW] = REG_FIELD(ISP1763_HC_CHIP_REV, 8, 15),
0294 [HC_CHIP_REV] = REG_FIELD(ISP1763_HC_CHIP_REV, 0, 7),
0295 [HC_SCRATCH] = REG_FIELD(ISP1763_HC_SCRATCH, 0, 15),
0296 [ISO_BUF_FILL] = REG_FIELD(ISP1763_HC_BUFFER_STATUS, 2, 2),
0297 [INT_BUF_FILL] = REG_FIELD(ISP1763_HC_BUFFER_STATUS, 1, 1),
0298 [ATL_BUF_FILL] = REG_FIELD(ISP1763_HC_BUFFER_STATUS, 0, 0),
0299 [MEM_START_ADDR] = REG_FIELD(ISP1763_HC_MEMORY, 0, 15),
0300 [HC_DATA] = REG_FIELD(ISP1763_HC_DATA, 0, 15),
0301 [HC_INTERRUPT] = REG_FIELD(ISP1763_HC_INTERRUPT, 0, 10),
0302 [HC_ATL_IRQ_ENABLE] = REG_FIELD(ISP1763_HC_INTERRUPT_ENABLE, 8, 8),
0303 [HC_INT_IRQ_ENABLE] = REG_FIELD(ISP1763_HC_INTERRUPT_ENABLE, 7, 7),
0304 [HC_ISO_IRQ_MASK_OR] = REG_FIELD(ISP1763_HC_ISO_IRQ_MASK_OR, 0, 15),
0305 [HC_INT_IRQ_MASK_OR] = REG_FIELD(ISP1763_HC_INT_IRQ_MASK_OR, 0, 15),
0306 [HC_ATL_IRQ_MASK_OR] = REG_FIELD(ISP1763_HC_ATL_IRQ_MASK_OR, 0, 15),
0307 [HC_ISO_IRQ_MASK_AND] = REG_FIELD(ISP1763_HC_ISO_IRQ_MASK_AND, 0, 15),
0308 [HC_INT_IRQ_MASK_AND] = REG_FIELD(ISP1763_HC_INT_IRQ_MASK_AND, 0, 15),
0309 [HC_ATL_IRQ_MASK_AND] = REG_FIELD(ISP1763_HC_ATL_IRQ_MASK_AND, 0, 15),
0310 [HW_HC_2_DIS] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 15, 15),
0311 [HW_OTG_DISABLE] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 10, 10),
0312 [HW_SW_SEL_HC_DC] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 7, 7),
0313 [HW_VBUS_DRV] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 4, 4),
0314 [HW_SEL_CP_EXT] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 3, 3),
0315 [HW_DM_PULLDOWN] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 2, 2),
0316 [HW_DP_PULLDOWN] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 1, 1),
0317 [HW_DP_PULLUP] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 0, 0),
0318 [HW_HC_2_DIS_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 15, 15),
0319 [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 10, 10),
0320 [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 7, 7),
0321 [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 4, 4),
0322 [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 3, 3),
0323 [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 2, 2),
0324 [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 1, 1),
0325 [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 0, 0),
0326
0327 [HC_FIELD_MAX] = {},
0328 };
0329
0330 static const struct regmap_range isp1763_hc_volatile_ranges[] = {
0331 regmap_reg_range(ISP1763_HC_USBCMD, ISP1763_HC_ATL_PTD_LASTPTD),
0332 regmap_reg_range(ISP1763_HC_BUFFER_STATUS, ISP1763_HC_DATA),
0333 regmap_reg_range(ISP1763_HC_INTERRUPT, ISP1763_HC_OTG_CTRL_CLEAR),
0334 };
0335
0336 static const struct regmap_access_table isp1763_hc_volatile_table = {
0337 .yes_ranges = isp1763_hc_volatile_ranges,
0338 .n_yes_ranges = ARRAY_SIZE(isp1763_hc_volatile_ranges),
0339 };
0340
0341 static const struct regmap_config isp1763_hc_regmap_conf = {
0342 .name = "isp1763-hc",
0343 .reg_bits = 8,
0344 .reg_stride = 2,
0345 .val_bits = 16,
0346 .fast_io = true,
0347 .max_register = ISP1763_HC_OTG_CTRL_CLEAR,
0348 .volatile_table = &isp1763_hc_volatile_table,
0349 };
0350
0351 static const struct regmap_range isp176x_dc_volatile_ranges[] = {
0352 regmap_reg_range(ISP176x_DC_EPMAXPKTSZ, ISP176x_DC_EPTYPE),
0353 regmap_reg_range(ISP176x_DC_BUFLEN, ISP176x_DC_EPINDEX),
0354 };
0355
0356 static const struct regmap_access_table isp176x_dc_volatile_table = {
0357 .yes_ranges = isp176x_dc_volatile_ranges,
0358 .n_yes_ranges = ARRAY_SIZE(isp176x_dc_volatile_ranges),
0359 };
0360
0361 static const struct regmap_config isp1761_dc_regmap_conf = {
0362 .name = "isp1761-dc",
0363 .reg_bits = 16,
0364 .reg_stride = 4,
0365 .val_bits = 32,
0366 .fast_io = true,
0367 .max_register = ISP176x_DC_TESTMODE,
0368 .volatile_table = &isp176x_dc_volatile_table,
0369 };
0370
0371 static const struct reg_field isp1761_dc_reg_fields[] = {
0372 [DC_DEVEN] = REG_FIELD(ISP176x_DC_ADDRESS, 7, 7),
0373 [DC_DEVADDR] = REG_FIELD(ISP176x_DC_ADDRESS, 0, 6),
0374 [DC_VBUSSTAT] = REG_FIELD(ISP176x_DC_MODE, 8, 8),
0375 [DC_SFRESET] = REG_FIELD(ISP176x_DC_MODE, 4, 4),
0376 [DC_GLINTENA] = REG_FIELD(ISP176x_DC_MODE, 3, 3),
0377 [DC_CDBGMOD_ACK] = REG_FIELD(ISP176x_DC_INTCONF, 6, 6),
0378 [DC_DDBGMODIN_ACK] = REG_FIELD(ISP176x_DC_INTCONF, 4, 4),
0379 [DC_DDBGMODOUT_ACK] = REG_FIELD(ISP176x_DC_INTCONF, 2, 2),
0380 [DC_INTPOL] = REG_FIELD(ISP176x_DC_INTCONF, 0, 0),
0381 [DC_IEPRXTX_7] = REG_FIELD(ISP176x_DC_INTENABLE, 25, 25),
0382 [DC_IEPRXTX_6] = REG_FIELD(ISP176x_DC_INTENABLE, 23, 23),
0383 [DC_IEPRXTX_5] = REG_FIELD(ISP176x_DC_INTENABLE, 21, 21),
0384 [DC_IEPRXTX_4] = REG_FIELD(ISP176x_DC_INTENABLE, 19, 19),
0385 [DC_IEPRXTX_3] = REG_FIELD(ISP176x_DC_INTENABLE, 17, 17),
0386 [DC_IEPRXTX_2] = REG_FIELD(ISP176x_DC_INTENABLE, 15, 15),
0387 [DC_IEPRXTX_1] = REG_FIELD(ISP176x_DC_INTENABLE, 13, 13),
0388 [DC_IEPRXTX_0] = REG_FIELD(ISP176x_DC_INTENABLE, 11, 11),
0389 [DC_IEP0SETUP] = REG_FIELD(ISP176x_DC_INTENABLE, 8, 8),
0390 [DC_IEVBUS] = REG_FIELD(ISP176x_DC_INTENABLE, 7, 7),
0391 [DC_IEHS_STA] = REG_FIELD(ISP176x_DC_INTENABLE, 5, 5),
0392 [DC_IERESM] = REG_FIELD(ISP176x_DC_INTENABLE, 4, 4),
0393 [DC_IESUSP] = REG_FIELD(ISP176x_DC_INTENABLE, 3, 3),
0394 [DC_IEBRST] = REG_FIELD(ISP176x_DC_INTENABLE, 0, 0),
0395 [DC_EP0SETUP] = REG_FIELD(ISP176x_DC_EPINDEX, 5, 5),
0396 [DC_ENDPIDX] = REG_FIELD(ISP176x_DC_EPINDEX, 1, 4),
0397 [DC_EPDIR] = REG_FIELD(ISP176x_DC_EPINDEX, 0, 0),
0398 [DC_CLBUF] = REG_FIELD(ISP176x_DC_CTRLFUNC, 4, 4),
0399 [DC_VENDP] = REG_FIELD(ISP176x_DC_CTRLFUNC, 3, 3),
0400 [DC_DSEN] = REG_FIELD(ISP176x_DC_CTRLFUNC, 2, 2),
0401 [DC_STATUS] = REG_FIELD(ISP176x_DC_CTRLFUNC, 1, 1),
0402 [DC_STALL] = REG_FIELD(ISP176x_DC_CTRLFUNC, 0, 0),
0403 [DC_BUFLEN] = REG_FIELD(ISP176x_DC_BUFLEN, 0, 15),
0404 [DC_FFOSZ] = REG_FIELD(ISP176x_DC_EPMAXPKTSZ, 0, 10),
0405 [DC_EPENABLE] = REG_FIELD(ISP176x_DC_EPTYPE, 3, 3),
0406 [DC_ENDPTYP] = REG_FIELD(ISP176x_DC_EPTYPE, 0, 1),
0407 [DC_UFRAMENUM] = REG_FIELD(ISP176x_DC_FRAMENUM, 11, 13),
0408 [DC_FRAMENUM] = REG_FIELD(ISP176x_DC_FRAMENUM, 0, 10),
0409 [DC_CHIP_ID_HIGH] = REG_FIELD(ISP176x_DC_CHIPID, 16, 31),
0410 [DC_CHIP_ID_LOW] = REG_FIELD(ISP176x_DC_CHIPID, 0, 15),
0411 [DC_SCRATCH] = REG_FIELD(ISP176x_DC_SCRATCH, 0, 15),
0412
0413 [DC_FIELD_MAX] = {},
0414 };
0415
0416 static const struct regmap_range isp1763_dc_volatile_ranges[] = {
0417 regmap_reg_range(ISP1763_DC_EPMAXPKTSZ, ISP1763_DC_EPTYPE),
0418 regmap_reg_range(ISP1763_DC_BUFLEN, ISP1763_DC_EPINDEX),
0419 };
0420
0421 static const struct regmap_access_table isp1763_dc_volatile_table = {
0422 .yes_ranges = isp1763_dc_volatile_ranges,
0423 .n_yes_ranges = ARRAY_SIZE(isp1763_dc_volatile_ranges),
0424 };
0425
0426 static const struct reg_field isp1763_dc_reg_fields[] = {
0427 [DC_DEVEN] = REG_FIELD(ISP1763_DC_ADDRESS, 7, 7),
0428 [DC_DEVADDR] = REG_FIELD(ISP1763_DC_ADDRESS, 0, 6),
0429 [DC_VBUSSTAT] = REG_FIELD(ISP1763_DC_MODE, 8, 8),
0430 [DC_SFRESET] = REG_FIELD(ISP1763_DC_MODE, 4, 4),
0431 [DC_GLINTENA] = REG_FIELD(ISP1763_DC_MODE, 3, 3),
0432 [DC_CDBGMOD_ACK] = REG_FIELD(ISP1763_DC_INTCONF, 6, 6),
0433 [DC_DDBGMODIN_ACK] = REG_FIELD(ISP1763_DC_INTCONF, 4, 4),
0434 [DC_DDBGMODOUT_ACK] = REG_FIELD(ISP1763_DC_INTCONF, 2, 2),
0435 [DC_INTPOL] = REG_FIELD(ISP1763_DC_INTCONF, 0, 0),
0436 [DC_IEPRXTX_7] = REG_FIELD(ISP1763_DC_INTENABLE, 25, 25),
0437 [DC_IEPRXTX_6] = REG_FIELD(ISP1763_DC_INTENABLE, 23, 23),
0438 [DC_IEPRXTX_5] = REG_FIELD(ISP1763_DC_INTENABLE, 21, 21),
0439 [DC_IEPRXTX_4] = REG_FIELD(ISP1763_DC_INTENABLE, 19, 19),
0440 [DC_IEPRXTX_3] = REG_FIELD(ISP1763_DC_INTENABLE, 17, 17),
0441 [DC_IEPRXTX_2] = REG_FIELD(ISP1763_DC_INTENABLE, 15, 15),
0442 [DC_IEPRXTX_1] = REG_FIELD(ISP1763_DC_INTENABLE, 13, 13),
0443 [DC_IEPRXTX_0] = REG_FIELD(ISP1763_DC_INTENABLE, 11, 11),
0444 [DC_IEP0SETUP] = REG_FIELD(ISP1763_DC_INTENABLE, 8, 8),
0445 [DC_IEVBUS] = REG_FIELD(ISP1763_DC_INTENABLE, 7, 7),
0446 [DC_IEHS_STA] = REG_FIELD(ISP1763_DC_INTENABLE, 5, 5),
0447 [DC_IERESM] = REG_FIELD(ISP1763_DC_INTENABLE, 4, 4),
0448 [DC_IESUSP] = REG_FIELD(ISP1763_DC_INTENABLE, 3, 3),
0449 [DC_IEBRST] = REG_FIELD(ISP1763_DC_INTENABLE, 0, 0),
0450 [DC_EP0SETUP] = REG_FIELD(ISP1763_DC_EPINDEX, 5, 5),
0451 [DC_ENDPIDX] = REG_FIELD(ISP1763_DC_EPINDEX, 1, 4),
0452 [DC_EPDIR] = REG_FIELD(ISP1763_DC_EPINDEX, 0, 0),
0453 [DC_CLBUF] = REG_FIELD(ISP1763_DC_CTRLFUNC, 4, 4),
0454 [DC_VENDP] = REG_FIELD(ISP1763_DC_CTRLFUNC, 3, 3),
0455 [DC_DSEN] = REG_FIELD(ISP1763_DC_CTRLFUNC, 2, 2),
0456 [DC_STATUS] = REG_FIELD(ISP1763_DC_CTRLFUNC, 1, 1),
0457 [DC_STALL] = REG_FIELD(ISP1763_DC_CTRLFUNC, 0, 0),
0458 [DC_BUFLEN] = REG_FIELD(ISP1763_DC_BUFLEN, 0, 15),
0459 [DC_FFOSZ] = REG_FIELD(ISP1763_DC_EPMAXPKTSZ, 0, 10),
0460 [DC_EPENABLE] = REG_FIELD(ISP1763_DC_EPTYPE, 3, 3),
0461 [DC_ENDPTYP] = REG_FIELD(ISP1763_DC_EPTYPE, 0, 1),
0462 [DC_UFRAMENUM] = REG_FIELD(ISP1763_DC_FRAMENUM, 11, 13),
0463 [DC_FRAMENUM] = REG_FIELD(ISP1763_DC_FRAMENUM, 0, 10),
0464 [DC_CHIP_ID_HIGH] = REG_FIELD(ISP1763_DC_CHIPID_HIGH, 0, 15),
0465 [DC_CHIP_ID_LOW] = REG_FIELD(ISP1763_DC_CHIPID_LOW, 0, 15),
0466 [DC_SCRATCH] = REG_FIELD(ISP1763_DC_SCRATCH, 0, 15),
0467
0468 [DC_FIELD_MAX] = {},
0469 };
0470
0471 static const struct regmap_config isp1763_dc_regmap_conf = {
0472 .name = "isp1763-dc",
0473 .reg_bits = 8,
0474 .reg_stride = 2,
0475 .val_bits = 16,
0476 .fast_io = true,
0477 .max_register = ISP1763_DC_TESTMODE,
0478 .volatile_table = &isp1763_dc_volatile_table,
0479 };
0480
0481 int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
0482 struct device *dev, unsigned int devflags)
0483 {
0484 const struct regmap_config *hc_regmap;
0485 const struct reg_field *hc_reg_fields;
0486 const struct regmap_config *dc_regmap;
0487 const struct reg_field *dc_reg_fields;
0488 struct isp1760_device *isp;
0489 struct isp1760_hcd *hcd;
0490 struct isp1760_udc *udc;
0491 struct regmap_field *f;
0492 bool udc_enabled;
0493 int ret;
0494 int i;
0495
0496
0497
0498
0499
0500 udc_enabled = ((devflags & ISP1760_FLAG_ISP1763) ||
0501 (devflags & ISP1760_FLAG_ISP1761));
0502
0503 if ((!IS_ENABLED(CONFIG_USB_ISP1760_HCD) || usb_disabled()) &&
0504 (!udc_enabled || !IS_ENABLED(CONFIG_USB_ISP1761_UDC)))
0505 return -ENODEV;
0506
0507 isp = devm_kzalloc(dev, sizeof(*isp), GFP_KERNEL);
0508 if (!isp)
0509 return -ENOMEM;
0510
0511 isp->dev = dev;
0512 isp->devflags = devflags;
0513 hcd = &isp->hcd;
0514 udc = &isp->udc;
0515
0516 hcd->is_isp1763 = !!(devflags & ISP1760_FLAG_ISP1763);
0517 udc->is_isp1763 = !!(devflags & ISP1760_FLAG_ISP1763);
0518
0519 if (!hcd->is_isp1763 && (devflags & ISP1760_FLAG_BUS_WIDTH_8)) {
0520 dev_err(dev, "isp1760/61 do not support data width 8\n");
0521 return -EINVAL;
0522 }
0523
0524 if (hcd->is_isp1763) {
0525 hc_regmap = &isp1763_hc_regmap_conf;
0526 hc_reg_fields = &isp1763_hc_reg_fields[0];
0527 dc_regmap = &isp1763_dc_regmap_conf;
0528 dc_reg_fields = &isp1763_dc_reg_fields[0];
0529 } else {
0530 hc_regmap = &isp1760_hc_regmap_conf;
0531 hc_reg_fields = &isp1760_hc_reg_fields[0];
0532 dc_regmap = &isp1761_dc_regmap_conf;
0533 dc_reg_fields = &isp1761_dc_reg_fields[0];
0534 }
0535
0536 isp->rst_gpio = devm_gpiod_get_optional(dev, NULL, GPIOD_OUT_HIGH);
0537 if (IS_ERR(isp->rst_gpio))
0538 return PTR_ERR(isp->rst_gpio);
0539
0540 hcd->base = devm_ioremap_resource(dev, mem);
0541 if (IS_ERR(hcd->base))
0542 return PTR_ERR(hcd->base);
0543
0544 hcd->regs = devm_regmap_init_mmio(dev, hcd->base, hc_regmap);
0545 if (IS_ERR(hcd->regs))
0546 return PTR_ERR(hcd->regs);
0547
0548 for (i = 0; i < HC_FIELD_MAX; i++) {
0549 f = devm_regmap_field_alloc(dev, hcd->regs, hc_reg_fields[i]);
0550 if (IS_ERR(f))
0551 return PTR_ERR(f);
0552
0553 hcd->fields[i] = f;
0554 }
0555
0556 udc->regs = devm_regmap_init_mmio(dev, hcd->base, dc_regmap);
0557 if (IS_ERR(udc->regs))
0558 return PTR_ERR(udc->regs);
0559
0560 for (i = 0; i < DC_FIELD_MAX; i++) {
0561 f = devm_regmap_field_alloc(dev, udc->regs, dc_reg_fields[i]);
0562 if (IS_ERR(f))
0563 return PTR_ERR(f);
0564
0565 udc->fields[i] = f;
0566 }
0567
0568 if (hcd->is_isp1763)
0569 hcd->memory_layout = &isp1763_memory_conf;
0570 else
0571 hcd->memory_layout = &isp176x_memory_conf;
0572
0573 ret = isp1760_init_core(isp);
0574 if (ret < 0)
0575 return ret;
0576
0577 if (IS_ENABLED(CONFIG_USB_ISP1760_HCD) && !usb_disabled()) {
0578 ret = isp1760_hcd_register(hcd, mem, irq,
0579 irqflags | IRQF_SHARED, dev);
0580 if (ret < 0)
0581 return ret;
0582 }
0583
0584 if (udc_enabled && IS_ENABLED(CONFIG_USB_ISP1761_UDC)) {
0585 ret = isp1760_udc_register(isp, irq, irqflags);
0586 if (ret < 0) {
0587 isp1760_hcd_unregister(hcd);
0588 return ret;
0589 }
0590 }
0591
0592 dev_set_drvdata(dev, isp);
0593
0594 return 0;
0595 }
0596
0597 void isp1760_unregister(struct device *dev)
0598 {
0599 struct isp1760_device *isp = dev_get_drvdata(dev);
0600
0601 isp1760_udc_unregister(isp);
0602 isp1760_hcd_unregister(&isp->hcd);
0603 }
0604
0605 MODULE_DESCRIPTION("Driver for the ISP1760 USB-controller from NXP");
0606 MODULE_AUTHOR("Sebastian Siewior <bigeasy@linuxtronix.de>");
0607 MODULE_LICENSE("GPL v2");