Lines Matching refs:dd
114 static int i2c_gpio_set(struct ipath_devdata *dd, in i2c_gpio_set() argument
121 gpioval = &dd->ipath_gpio_out; in i2c_gpio_set()
124 dir_mask = dd->ipath_gpio_scl; in i2c_gpio_set()
125 out_mask = (1UL << dd->ipath_gpio_scl_num); in i2c_gpio_set()
127 dir_mask = dd->ipath_gpio_sda; in i2c_gpio_set()
128 out_mask = (1UL << dd->ipath_gpio_sda_num); in i2c_gpio_set()
131 spin_lock_irqsave(&dd->ipath_gpio_lock, flags); in i2c_gpio_set()
134 dd->ipath_extctrl &= ~dir_mask; in i2c_gpio_set()
137 dd->ipath_extctrl |= dir_mask; in i2c_gpio_set()
139 ipath_write_kreg(dd, dd->ipath_kregs->kr_extctrl, dd->ipath_extctrl); in i2c_gpio_set()
147 ipath_write_kreg(dd, dd->ipath_kregs->kr_gpio_out, *gpioval); in i2c_gpio_set()
148 spin_unlock_irqrestore(&dd->ipath_gpio_lock, flags); in i2c_gpio_set()
162 static int i2c_gpio_get(struct ipath_devdata *dd, in i2c_gpio_get() argument
178 mask = dd->ipath_gpio_scl; in i2c_gpio_get()
180 mask = dd->ipath_gpio_sda; in i2c_gpio_get()
182 spin_lock_irqsave(&dd->ipath_gpio_lock, flags); in i2c_gpio_get()
183 dd->ipath_extctrl &= ~mask; in i2c_gpio_get()
184 ipath_write_kreg(dd, dd->ipath_kregs->kr_extctrl, dd->ipath_extctrl); in i2c_gpio_get()
189 read_val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_extstatus); in i2c_gpio_get()
190 spin_unlock_irqrestore(&dd->ipath_gpio_lock, flags); in i2c_gpio_get()
212 static void i2c_wait_for_writes(struct ipath_devdata *dd) in i2c_wait_for_writes() argument
214 (void)ipath_read_kreg32(dd, dd->ipath_kregs->kr_scratch); in i2c_wait_for_writes()
218 static void scl_out(struct ipath_devdata *dd, u8 bit) in scl_out() argument
221 i2c_gpio_set(dd, i2c_line_scl, bit ? i2c_line_high : i2c_line_low); in scl_out()
223 i2c_wait_for_writes(dd); in scl_out()
226 static void sda_out(struct ipath_devdata *dd, u8 bit) in sda_out() argument
228 i2c_gpio_set(dd, i2c_line_sda, bit ? i2c_line_high : i2c_line_low); in sda_out()
230 i2c_wait_for_writes(dd); in sda_out()
233 static u8 sda_in(struct ipath_devdata *dd, int wait) in sda_in() argument
237 if (i2c_gpio_get(dd, i2c_line_sda, &bit)) in sda_in()
241 i2c_wait_for_writes(dd); in sda_in()
250 static int i2c_ackrcv(struct ipath_devdata *dd) in i2c_ackrcv() argument
256 ack_received = sda_in(dd, 1); in i2c_ackrcv()
257 scl_out(dd, i2c_line_high); in i2c_ackrcv()
258 ack_received = sda_in(dd, 1) == 0; in i2c_ackrcv()
259 scl_out(dd, i2c_line_low); in i2c_ackrcv()
269 static int rd_byte(struct ipath_devdata *dd) in rd_byte() argument
277 scl_out(dd, i2c_line_high); in rd_byte()
278 data |= sda_in(dd, 0); in rd_byte()
279 scl_out(dd, i2c_line_low); in rd_byte()
291 static int wr_byte(struct ipath_devdata *dd, u8 data) in wr_byte() argument
298 sda_out(dd, bit); in wr_byte()
299 scl_out(dd, i2c_line_high); in wr_byte()
300 scl_out(dd, i2c_line_low); in wr_byte()
302 return (!i2c_ackrcv(dd)) ? 1 : 0; in wr_byte()
305 static void send_ack(struct ipath_devdata *dd) in send_ack() argument
307 sda_out(dd, i2c_line_low); in send_ack()
308 scl_out(dd, i2c_line_high); in send_ack()
309 scl_out(dd, i2c_line_low); in send_ack()
310 sda_out(dd, i2c_line_high); in send_ack()
320 static int i2c_startcmd(struct ipath_devdata *dd, u8 offset_dir) in i2c_startcmd() argument
325 sda_out(dd, i2c_line_high); in i2c_startcmd()
326 scl_out(dd, i2c_line_high); in i2c_startcmd()
327 sda_out(dd, i2c_line_low); in i2c_startcmd()
328 scl_out(dd, i2c_line_low); in i2c_startcmd()
331 res = wr_byte(dd, offset_dir); in i2c_startcmd()
345 static void stop_cmd(struct ipath_devdata *dd) in stop_cmd() argument
347 scl_out(dd, i2c_line_low); in stop_cmd()
348 sda_out(dd, i2c_line_low); in stop_cmd()
349 scl_out(dd, i2c_line_high); in stop_cmd()
350 sda_out(dd, i2c_line_high); in stop_cmd()
359 static int eeprom_reset(struct ipath_devdata *dd) in eeprom_reset() argument
362 u64 *gpioval = &dd->ipath_gpio_out; in eeprom_reset()
366 spin_lock_irqsave(&dd->ipath_gpio_lock, flags); in eeprom_reset()
368 dd->ipath_extctrl = ipath_read_kreg64(dd, dd->ipath_kregs->kr_extctrl); in eeprom_reset()
369 *gpioval = ipath_read_kreg64(dd, dd->ipath_kregs->kr_gpio_out); in eeprom_reset()
370 spin_unlock_irqrestore(&dd->ipath_gpio_lock, flags); in eeprom_reset()
380 scl_out(dd, i2c_line_low); in eeprom_reset()
381 sda_out(dd, i2c_line_high); in eeprom_reset()
385 scl_out(dd, i2c_line_high); in eeprom_reset()
388 if (sda_in(dd, 0)) { in eeprom_reset()
389 sda_out(dd, i2c_line_low); in eeprom_reset()
390 scl_out(dd, i2c_line_low); in eeprom_reset()
392 scl_out(dd, i2c_line_high); in eeprom_reset()
393 sda_out(dd, i2c_line_high); in eeprom_reset()
398 scl_out(dd, i2c_line_low); in eeprom_reset()
412 static int i2c_probe(struct ipath_devdata *dd, int devaddr) in i2c_probe() argument
416 ret = eeprom_reset(dd); in i2c_probe()
418 ipath_dev_err(dd, "Failed reset probing device 0x%02X\n", in i2c_probe()
426 ret = i2c_startcmd(dd, devaddr | READ_CMD); in i2c_probe()
437 data = rd_byte(dd); in i2c_probe()
438 stop_cmd(dd); in i2c_probe()
453 static struct i2c_chain_desc *ipath_i2c_type(struct ipath_devdata *dd) in ipath_i2c_type() argument
458 idx = dd->ipath_i2c_chain_type - 1; in ipath_i2c_type()
465 if (!i2c_probe(dd, i2c_chains[idx].probe_dev)) in ipath_i2c_type()
475 eeprom_reset(dd); in ipath_i2c_type()
480 dd->ipath_i2c_chain_type = idx + 1; in ipath_i2c_type()
485 static int ipath_eeprom_internal_read(struct ipath_devdata *dd, in ipath_eeprom_internal_read() argument
493 icd = ipath_i2c_type(dd); in ipath_eeprom_internal_read()
501 ret = i2c_startcmd(dd, eeprom_offset); in ipath_eeprom_internal_read()
505 if (i2c_startcmd(dd, icd->eeprom_dev | WRITE_CMD)) { in ipath_eeprom_internal_read()
507 stop_cmd(dd); in ipath_eeprom_internal_read()
511 ret = wr_byte(dd, eeprom_offset); in ipath_eeprom_internal_read()
512 stop_cmd(dd); in ipath_eeprom_internal_read()
514 ipath_dev_err(dd, "Failed to write EEPROM address\n"); in ipath_eeprom_internal_read()
518 ret = i2c_startcmd(dd, icd->eeprom_dev | READ_CMD); in ipath_eeprom_internal_read()
522 stop_cmd(dd); in ipath_eeprom_internal_read()
533 *bp++ = rd_byte(dd); in ipath_eeprom_internal_read()
536 send_ack(dd); in ipath_eeprom_internal_read()
539 stop_cmd(dd); in ipath_eeprom_internal_read()
547 static int ipath_eeprom_internal_write(struct ipath_devdata *dd, u8 eeprom_offset, in ipath_eeprom_internal_write() argument
557 icd = ipath_i2c_type(dd); in ipath_eeprom_internal_write()
563 if (i2c_startcmd(dd, in ipath_eeprom_internal_write()
571 if (i2c_startcmd(dd, icd->eeprom_dev | WRITE_CMD)) { in ipath_eeprom_internal_write()
575 ret = wr_byte(dd, eeprom_offset); in ipath_eeprom_internal_write()
577 ipath_dev_err(dd, "Failed to write EEPROM " in ipath_eeprom_internal_write()
588 if (wr_byte(dd, *bp++)) { in ipath_eeprom_internal_write()
596 stop_cmd(dd); in ipath_eeprom_internal_write()
610 while (i2c_startcmd(dd, icd->eeprom_dev | READ_CMD)) { in ipath_eeprom_internal_write()
611 stop_cmd(dd); in ipath_eeprom_internal_write()
619 rd_byte(dd); in ipath_eeprom_internal_write()
620 stop_cmd(dd); in ipath_eeprom_internal_write()
627 stop_cmd(dd); in ipath_eeprom_internal_write()
641 int ipath_eeprom_read(struct ipath_devdata *dd, u8 eeprom_offset, in ipath_eeprom_read() argument
646 ret = mutex_lock_interruptible(&dd->ipath_eep_lock); in ipath_eeprom_read()
648 ret = ipath_eeprom_internal_read(dd, eeprom_offset, buff, len); in ipath_eeprom_read()
649 mutex_unlock(&dd->ipath_eep_lock); in ipath_eeprom_read()
662 int ipath_eeprom_write(struct ipath_devdata *dd, u8 eeprom_offset, in ipath_eeprom_write() argument
667 ret = mutex_lock_interruptible(&dd->ipath_eep_lock); in ipath_eeprom_write()
669 ret = ipath_eeprom_internal_write(dd, eeprom_offset, buff, len); in ipath_eeprom_write()
670 mutex_unlock(&dd->ipath_eep_lock); in ipath_eeprom_write()
706 void ipath_get_eeprom_info(struct ipath_devdata *dd) in ipath_get_eeprom_info() argument
713 int t = dd->ipath_unit; in ipath_get_eeprom_info()
718 dd->ipath_guid = dd0->ipath_guid; in ipath_get_eeprom_info()
719 bguid = (u8 *) & dd->ipath_guid; in ipath_get_eeprom_info()
727 dd, in ipath_get_eeprom_info()
731 dd->ipath_guid = 0; in ipath_get_eeprom_info()
738 dd->ipath_nguid = 1; in ipath_get_eeprom_info()
743 (unsigned long long) be64_to_cpu(dd->ipath_guid)); in ipath_get_eeprom_info()
754 ipath_dev_err(dd, "Couldn't allocate memory to read %u " in ipath_get_eeprom_info()
759 mutex_lock(&dd->ipath_eep_lock); in ipath_get_eeprom_info()
760 eep_stat = ipath_eeprom_internal_read(dd, 0, buf, len); in ipath_get_eeprom_info()
761 mutex_unlock(&dd->ipath_eep_lock); in ipath_get_eeprom_info()
764 ipath_dev_err(dd, "Failed reading GUID from eeprom\n"); in ipath_get_eeprom_info()
771 dev_info(&dd->pcidev->dev, "Bad I2C flash checksum: " in ipath_get_eeprom_info()
777 ipath_dev_err(dd, "Invalid GUID %llx from flash; " in ipath_get_eeprom_info()
786 dev_info(&dd->pcidev->dev, "Warning, GUID %llx is " in ipath_get_eeprom_info()
804 dd->ipath_guid = guid; in ipath_get_eeprom_info()
805 dd->ipath_nguid = ifp->if_numguid; in ipath_get_eeprom_info()
816 char *snp = dd->ipath_serial; in ipath_get_eeprom_info()
821 len = (sizeof dd->ipath_serial) - len; in ipath_get_eeprom_info()
827 memcpy(dd->ipath_serial, ifp->if_serial, in ipath_get_eeprom_info()
830 ipath_dev_err(dd, "Board SN %s did not pass functional " in ipath_get_eeprom_info()
831 "test: %s\n", dd->ipath_serial, in ipath_get_eeprom_info()
835 (unsigned long long) be64_to_cpu(dd->ipath_guid)); in ipath_get_eeprom_info()
837 memcpy(&dd->ipath_eep_st_errs, &ifp->if_errcntp, IPATH_EEP_LOG_CNT); in ipath_get_eeprom_info()
843 atomic_set(&dd->ipath_active_time, 0); in ipath_get_eeprom_info()
844 dd->ipath_eep_hrs = ifp->if_powerhour[0] | (ifp->if_powerhour[1] << 8); in ipath_get_eeprom_info()
865 int ipath_update_eeprom_log(struct ipath_devdata *dd) in ipath_update_eeprom_log() argument
878 if (dd->ipath_eep_st_new_errs[idx]) { in ipath_update_eeprom_log()
883 new_time = atomic_read(&dd->ipath_active_time); in ipath_update_eeprom_log()
898 ipath_dev_err(dd, "Couldn't allocate memory to read %u " in ipath_update_eeprom_log()
906 ret = mutex_lock_interruptible(&dd->ipath_eep_lock); in ipath_update_eeprom_log()
908 ipath_dev_err(dd, "Unable to acquire EEPROM for logging\n"); in ipath_update_eeprom_log()
911 ret = ipath_eeprom_internal_read(dd, 0, buf, len); in ipath_update_eeprom_log()
913 mutex_unlock(&dd->ipath_eep_lock); in ipath_update_eeprom_log()
914 ipath_dev_err(dd, "Unable read EEPROM for logging\n"); in ipath_update_eeprom_log()
921 mutex_unlock(&dd->ipath_eep_lock); in ipath_update_eeprom_log()
922 ipath_dev_err(dd, "EEPROM cks err (0x%02X, S/B 0x%02X)\n", in ipath_update_eeprom_log()
928 spin_lock_irqsave(&dd->ipath_eep_st_lock, flags); in ipath_update_eeprom_log()
930 int new_val = dd->ipath_eep_st_new_errs[idx]; in ipath_update_eeprom_log()
952 dd->ipath_eep_st_errs[idx] = new_val; in ipath_update_eeprom_log()
953 dd->ipath_eep_st_new_errs[idx] = 0; in ipath_update_eeprom_log()
965 atomic_sub((new_hrs * 3600), &dd->ipath_active_time); in ipath_update_eeprom_log()
966 new_hrs += dd->ipath_eep_hrs; in ipath_update_eeprom_log()
969 dd->ipath_eep_hrs = new_hrs; in ipath_update_eeprom_log()
985 spin_unlock_irqrestore(&dd->ipath_eep_st_lock, flags); in ipath_update_eeprom_log()
989 ret = ipath_eeprom_internal_write(dd, 0, buf, hi_water + 1); in ipath_update_eeprom_log()
991 mutex_unlock(&dd->ipath_eep_lock); in ipath_update_eeprom_log()
993 ipath_dev_err(dd, "Failed updating EEPROM\n"); in ipath_update_eeprom_log()
1015 void ipath_inc_eeprom_err(struct ipath_devdata *dd, u32 eidx, u32 incr) in ipath_inc_eeprom_err() argument
1020 spin_lock_irqsave(&dd->ipath_eep_st_lock, flags); in ipath_inc_eeprom_err()
1021 new_val = dd->ipath_eep_st_new_errs[eidx] + incr; in ipath_inc_eeprom_err()
1024 dd->ipath_eep_st_new_errs[eidx] = new_val; in ipath_inc_eeprom_err()
1025 spin_unlock_irqrestore(&dd->ipath_eep_st_lock, flags); in ipath_inc_eeprom_err()
1029 static int ipath_tempsense_internal_read(struct ipath_devdata *dd, u8 regnum) in ipath_tempsense_internal_read() argument
1036 icd = ipath_i2c_type(dd); in ipath_tempsense_internal_read()
1046 if (i2c_startcmd(dd, icd->temp_dev | WRITE_CMD)) { in ipath_tempsense_internal_read()
1048 stop_cmd(dd); in ipath_tempsense_internal_read()
1052 ret = wr_byte(dd, regnum); in ipath_tempsense_internal_read()
1053 stop_cmd(dd); in ipath_tempsense_internal_read()
1055 ipath_dev_err(dd, "Failed tempsense WR command %02X\n", in ipath_tempsense_internal_read()
1060 if (i2c_startcmd(dd, icd->temp_dev | READ_CMD)) { in ipath_tempsense_internal_read()
1062 stop_cmd(dd); in ipath_tempsense_internal_read()
1069 ret = rd_byte(dd); in ipath_tempsense_internal_read()
1070 stop_cmd(dd); in ipath_tempsense_internal_read()
1085 int ipath_tempsense_read(struct ipath_devdata *dd, u8 regnum) in ipath_tempsense_read() argument
1096 ret = mutex_lock_interruptible(&dd->ipath_eep_lock); in ipath_tempsense_read()
1098 ret = ipath_tempsense_internal_read(dd, regnum); in ipath_tempsense_read()
1099 mutex_unlock(&dd->ipath_eep_lock); in ipath_tempsense_read()
1111 static int ipath_tempsense_internal_write(struct ipath_devdata *dd, in ipath_tempsense_internal_write() argument
1117 icd = ipath_i2c_type(dd); in ipath_tempsense_internal_write()
1126 if (i2c_startcmd(dd, icd->temp_dev | WRITE_CMD)) { in ipath_tempsense_internal_write()
1128 stop_cmd(dd); in ipath_tempsense_internal_write()
1132 ret = wr_byte(dd, regnum); in ipath_tempsense_internal_write()
1134 stop_cmd(dd); in ipath_tempsense_internal_write()
1135 ipath_dev_err(dd, "Failed to write tempsense command %02X\n", in ipath_tempsense_internal_write()
1140 ret = wr_byte(dd, data); in ipath_tempsense_internal_write()
1141 stop_cmd(dd); in ipath_tempsense_internal_write()
1142 ret = i2c_startcmd(dd, icd->temp_dev | READ_CMD); in ipath_tempsense_internal_write()
1144 ipath_dev_err(dd, "Failed tempsense data wrt to %02X\n", in ipath_tempsense_internal_write()
1163 int ipath_tempsense_write(struct ipath_devdata *dd, u8 regnum, u8 data) in ipath_tempsense_write() argument
1170 ret = mutex_lock_interruptible(&dd->ipath_eep_lock); in ipath_tempsense_write()
1172 ret = ipath_tempsense_internal_write(dd, regnum, data); in ipath_tempsense_write()
1173 mutex_unlock(&dd->ipath_eep_lock); in ipath_tempsense_write()